OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonの親クラスにgetter、子クラスにsetterを実装する。


# 親クラスにgetterだけ実装して、子クラスにはsetterみたいなのだけ実装したい
親クラスと子クラス両方で使う変数には「\_\_(アンダーバー2つ)」付けずに実装するようです。　　
「__」を付けてしまうと、privateな扱いになってしまい、別のクラスからアクセス出来なくなってしまいます。　　　
これでは、子クラス内の変数が隠蔽されません。　　
これを解消したく色々試した結果、以下の2つのコードになりました。

# コード1 「_」を1つにする、また親クラスのsetterで型を調べる
```python
from abc import ABCMeta, abstractmethod

# 抽象クラス
class Animal(metaclass=ABCMeta):

    @abstractmethod
    def __init__(self):
        raise NotImplementedError()

    @property
    def voice(self):
        return self._voice

    @voice.setter
    def voice(self, voice):
        if not isinstance(voice, str):
            raise TypeError(voice)
        self._voice = voice

# 抽象クラスを継承
class Dog(Animal):
    def __init__(self, voice="woof"):
        self.voice = voice

if __name__ == "__main__":
    print(issubclass(Dog, Animal))   # True
    print(isinstance(Dog(), Animal)) # True
    dog = Dog()
    print(dog.voice) # woof
    dog.voice = 123 # TypeError
```
## コード1解説
アンダーバーを1つにして、隠蔽性をなくしました。　　
そもそもPythonはアンダーバーが付いている変数へアクセスする方が悪いという、暗黙の紳士協定が存在する言語です。　　
プログラムの可読性やら簡単さを考えるとこれが一番かなと思います。　　
この説明とコードは@siracamusさんのコメントよりいただきました。　　
ありがとうございます。

# コード2　親クラスのsetterで呼び出し元が子クラスか確認する
```python
from abc import ABCMeta, abstractmethod
import inspect

class Animal(metaclass=ABCMeta):

    @abstractmethod
    def __init__(self):
        raise NotImplementedError()

    @property
    def voice(self):
        return self.__voice

    @voice.setter
    def voice(self, voice):
        frame = inspect.currentframe().f_back
        assert (inspect.getframeinfo(frame)[2] not in dir(self.__class__)), \
            "unexpected assignment: voice"
        self.__voice = voice

    def get_voice(self):
        return self.__voice
# 抽象クラスを継承
class Dog(Animal):
    def __init__(self):
        self.set_voice("woof")

    def set_voice(self, voice: str):
        self.voice = voice



if __name__ == "__main__":
    print(issubclass(Dog().__class__, Animal)) #true
    print(isinstance(Dog(), Animal)) #true
    dog = Dog()
    print(dog.get_voice()) #woof
    dog.voice = "aaa" # error
    print(dog.voice) # 実行可能

```
## コード2の説明
inspectを利用することにより、親クラスのsetterへのアクセス元が、子クラスのメンバ関数か調べています。
ちょっとメタっぽいプログラムになってしまいました。
子クラス側のコード量自体は減ったと思います。

# 感想
自分はアンダーバー2つをよく使ってたのですが、一般的には使わないみたいですね。
inspectの存在を知らなかったのですが、これを使うとかなり色々できそうですね。

# 参考にしたページ
https://qiita.com/kaneshin/items/269bc5f156d86f8a91c4
https://docs.python.org/ja/3/library/inspect.html
Kotlin 多次元配列の生成方法

Javaだと下のように多次元配列は生成するわけですが、、

```Java
int[][] array = new int[10][10]
```

Kotlinではこう書けば生成できる

```Kotlin
val array = Array(10, {arrayOfNulls<Int>(10)})
```

## 解説
* 多次元配列の生成は`Array()`を使うのがいいのかなぁと思います

```Kotlin
Array(size: Int, init: (Int) -> T)
```

* Arrayのコンストラクタは第一引数に配列のサイズ
* 第二引数に要素を指定する
* 要素はIntを引数にとって要素を返す関数を指定する
* initの引数Intには要素分のインデックスが入る

```Kotlin
Array(10, { index ->
    index // 0から9が順々に
})

// もちろんitで参照できる
Array(10, {it})

// 要素を全て２で初期化する例
Array(10, {index ->
    2
})

// 上はindexを使ってないので省略する
Array(10, {2}})
```

* 以上を踏まえて、要素に配列を指定してあげれば多次元配列になる

```Kotlin
// 0−９で初期化された２次元配列
Array(10, {Array(10, {it})})
```

* 型を指定してnullで初期化する配列を宣言する場合は下でもおｋ

```Kotlin
// Boolean[10][10]
Array(10, { arrayOfNulls<Boolean>(10)})
```

## まとめ
配列生成するのに関数を引数に取るのはなかなかビギナー殺し感ある。便利だけど。
&&での改行のエラー

Rubyの改行ルールを確認しておく。

・Rubyでは、改行を式の終わりと考えるので、;などをつける必要がない代わりに、複数行に渡って式を記述することができない。

・対処法は二つある。一つは、「\（バックスラッシュ）」を文末につけた上で改行する。もう一つは、明らかに文が続いているとRubyが認識してくれるような改行を行う。

以下、今回起こったエラー。

```ruby:sample.rb
if A && 
   B
(処理)
end
```

が、正しく動作するときと、しない時がある。Rails内で起こった。
この改行は、二つ目の「明らかに文章が続く〜」に該当するもので、Rubyの改行規則に従っていると思っていたが、うまくいかなかった。

以下参考。
http://thinca.hatenablog.com/entry/20090131/1233334281

明らかな改行でない場合は、改行は「；」と等価になって評価される。

&&での改行は「明らかな改行」に該当するはずだが、今回は動作が不安定に。いずれの場合も「\」を入れておく。
Ubuntu 16.04でパスワードを忘れたときの対応や諸注意的なの

# 背景
CoderDojo SapporoEastに、1年ぶりにやってきたNinjaが居た。

話を聞くと、
「塾とか部活とかで忙しくて、4ヶ月Ubuntu立ち上げてない。パスワード忘れた」
とのことだったので、シングルユーザーモードでパスワードを変えることにした。

しかし、該当するユーザーアカウントのパスワードを何度も変更しても上手く行かず、その日のDojoの時間をそれに費やしてしまったので、誰かが同じミスで時間を無駄にしないようにここに書き残しておく。

# オチ

パスワード設定時は、NumLockとCapsLock要チェック。

# 流れ

既に、[Ubuntu のログインパスワードを忘れた - Qiita](https://qiita.com/koyudoon/items/556ba331d0b2bf8f5714)という記事が有る。そこを参照でも良い。

## リカバリーモードでログインし、rootプロンプト起動

1. BIOS起動直後にShiftキー連打
2. GRUBメニューが表示されたら `Advanced option for Ubuntu` → `(recovery mode)` と末尾に書かれているイメージを選択してEnterキーで起動 †
3. リカバリーメニューが表示されるので、 `root` を選択してEnterキーで実行。 ‡

† この工程をする前に、シングルユーザーモードで起動するオプションを追記していたりする。シングルユーザーモード（パスワード入力しなくても管理者ログインできるモード）にもしもならなかったら、試して欲しい。

`(recovery mode)` を選択した状態で e キーを押すと、起動オプションスクリプトが表示されるので、 `quiet splash` と書かれている行に ` single` と追記して、 Control + x で保存して終了してシングルユーザーモードで起動する。_（なにとなくしか把握していないでやって上手く行ってしまったので、要調査）_


‡ 今回はプロンプトが起動された後に、
「お前これ管理者モードになるよ。本気でやるんだったらEnter押して。止めるんだったらControl + Dな」
という旨のメッセージが表示された

## rootプロンプトでパスワードを変える

以下のコマンドを順番に実行。

_コマンド例の先頭の `#` は「管理者モードだよ」の表示なので、写さなくて良い。_

```shell-session
# mount -o remount,rw / # ファイルシステム全体を読み書き可でマウントし直す
# pwconv # /etc/passwdと/etc/shadowの整合性を取るようにする
# passwd user # userのパスワードを変更する対話モードに移る
```

この後、新しいパスワードを尋ねられ、入力したらEnterキーを押す。
続いてパスワードの確認をされるので、入力したらEnterキーを押す。

最後に、以下コマンドで再起動。

```shell-session
# shutdown -r now # すぐに再起動させる。
```

## それでもパスワード変更されない。ログインできない。

上の手順を行ってもなおログインできない場合、シングルユーザーモードでログインしてrootプロンプトでログインしたら、以下のコマンドを順番に実行。

```shell-session
# mount -o remount,rw /
# pwconv
# echo 'user:passwd' | chpasswd # user:passwdという文字列をchpasswdに渡す。
```

`chpasswd` は、バッチモードでパスワードを変更するコマンドらしい。そこに `ユーザー名:新しいパスワード` という標準出力を渡してやると、パスワードが変更される。

ただし、この方法はもちろんながら入力したパスワードが表示されてしまうので、あまり使わないほうが良い。

# 改めて、オチ。

> パスワード設定時は、NumLockとCapsLock要チェック。

と最初に書いた。

Ninjaがパスワードをテンキーで入力していたが、_NumLockのかかっている状態で入力していたために、_ **意図したパスワードが入力されていなかった**というオチである。

## どこでNumLockかかっていると気づいたか

Ninjaがログイン画面でテンキーによるパスワード入力時、選択ユーザーが上下したのを見て気づいた。

# 参考資料
* [＠IT：passwdコマンドを実行するとエラーになる](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/428errpasswdcmd.html)
* [linux - Cannot lock /etc/passwd; try again later - Super User](https://superuser.com/questions/296373/cannot-lock-etc-passwd-try-again-later)
* [linux - I can't change user's passwd on ubuntu - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/223965/i-cant-change-users-passwd-on-ubuntu)
MFクラウド請求書APIのPHPクライアントを作った

# 概要

MFクラウド請求書APIのPHPクライアントを作りました。

https://github.com/Traimmu/mf-cloud-invoice-php

動機は、[Rubyのクライアント](https://github.com/moneyforward/mf_cloud-invoice-ruby/)はマネーフォワードの方が公式で作られているものがあったのですが、PHP版は無かったためです。

# MFクラウド請求書とは

クラウドで請求書を発行できるサービスです。超便利です。

APIがベータ版なものの、非常に充実しているので是非使って下さい。
APIから郵送できるとは便利な世の中になったものです。

https://github.com/moneyforward/invoice-api-doc

# 使い方

## 導入

composerでさくっと入ります。

```
composer require traimmu/mf-cloud-invoice
```

## 基本的な動作

こんな感じで使います。

```php
<?php

use Traimmu\MfCloud\Invoice\Client;

$client = new Client('YOUR_ACCESS_TOKEN');

$client->billings()->all(); 
// => 請求書一覧が取得できる

$office = $client->office(); 
// => 自社情報のクラスのインスタンスが返ってくる

echo $office->name; 
// => '株式会社Traimmu'

// 自社の情報をアップデートする
$office->update([
    'name' => 'section9',
    'zip' => '101-1111',
]);
echo $office->name;
// => 'section9'
```

現在、下記のメソッドが用意されています。

- first()
- find(id)
- all()
- create(params)
- update(params)
- delete()

特に難しいところは無いと思います。

## 用語・エンティティ

| 意味 | 取得方法 |
|:-:|:-:|
| 自社  | $client->office() |
| 取引先  | $client->partners()->all()  |
| 請求書  | $client->billings()->all()  |
| 品目  | $client->items()->all()  |

# Laravelとの統合

Laravelとの統合も簡単にできます。これが一番やりたかった。

```php:config/app.php
'providers' => [
    // ...
    Traimmu\MfCloud\Invoice\Misc\ServiceProvider::class,
],

// ...
'aliases' => [
    // ...
    'Invoice' => Traimmu\MfCloud\Invoice\Misc\Facade::class,
],
```

```php:config/services.php
// ...
'mfcloud' => [
    'secret' => env('MFCLOUD_INVOICE_API_TOKEN'),
],
```


```php:tinker
>>> Invoice::partners()->find('0293i4ownw012')
```

# 工夫したところ

`$client->partners->all()` は、Laravelでおなじみの `Illuminate\Support\Collection` を返します。

コレクションの中身には、 `Traimmu\MfCloud\Invoice\Models\Partner` が入っています。

なので、こんな感じに使えます。

```php
<?php
// 1つ以上の部署を持つ取引先を取得
$client->partners()->all()->filter(function ($partner) {
  return count($partner->departments) > 0;
});
```

# 勉強になったこと

マネーフォワードの方が作ったRubyのクライアントを真似して作ったので、そのソースコードを読むのは良い勉強になりました。

またテストコードでモックやスタブを使ったことが無かったので、良い機会になりました。

ぜひぜひ使ってみて下さい。
気に入ったらスターお願いします。笑
TypeScriptで「○○型かどうか」を返す関数を作る

# 困りごと
引数の型が複数定義できるときに、いい感じにチェックしたいのです。

```ts
function isNumber(arg: any): boolean {
  return typeof arg === "number";
}

function isString(arg: any): boolean {
  return typeof arg === "string";
}

function getInt(arg: number | string): number {
  let num: number = 0;
  if (isNumber(arg)) {
    num = arg; // argはnumber or stringなので、number型の変数に代入することはできない
  } else if (isString(arg)) {
    num = parseInt(arg, 10); // argはnumber or stringなので、string型の引数として渡すことはできない
  }
  return 0;
}
```

上記のようなコードでは、number型にstring型かもしれない変数を代入しようとして怒られます。
isNumberという俺関数でチェックしているにもかかわらず・・・です。

人間がコードを読めば、`isNumber`の中でnumber型かどうかをチェック、`isString`でstring型かをチェックしているので、きちんと動作しそうなコードですが、TypeScriptでは怒られるのです。
代わりに、以下のように書けばきちんと通ります。

```ts
if (typeof arg === "number") {
  num = arg; // OK!!!
}
```

# いい感じに型チェックする方法
イコールを三つも書きたくない！！！というみなさんに朗報です。
booleanを返す時に、「○○型かどうか」という情報を返すことができるのです。

```ts
function isNumber(arg: any): arg is number {
  return typeof arg === "number";
}
```

`Type guard` と呼ぶみたいです。

以上です。よろしくお願いします。
Heroku アプリのURLに認証をかける wwwhisper

https://devcenter.heroku.com/articles/wwwhisper

Heroku でアプリを作成すると同時に発行される hoge.herokuapp.com は、アプリ作成と同時に、全世界からアクセス可能になる。この挙動の難点として、開発中のものやテストのためのアプリなどもアクセス可能になってしまうことが挙げられる。

wwhisper は、アプリケーションレベルでの認証をサポートする Heroku Add-on だ。
rack 対応の Ruby のWebアプリ（Railsなど）と Node.js の Webアプリに対応しているとのこと。まあ自前でも大丈夫だろうけど、その手間すら惜しい場合はアリなのでは。

ネットワークレベルでアクセス制御したいひとは、Heroku Private Spaces つかうか、Heroku やめて IaaSつかいましょう。
オブジェクト内の値がtureの要素のキーをカンマ区切りの文字列に変換する

## インプットとアウトプット
タイトルだけではよくわからないと思うので、データを例で示します。

```js:input
const input = {
	'1': false,
	'2': true,
	'3': true,
	'4': false
}
```
例えば上記のようなデータを入力した場合は、次のような文字列に直します。

```js
'2,3'
```

## ユースケース
例えば、アンケートページにチェックボックスを置いて、選択された項目のキーをカンマ区切りの文字列に直してAPIを呼び出すなどが考えられます。
例えば,[Material-UIのCheckbox](http://www.material-ui.com/#/components/checkbox)はtrue/falseで値を管理するので、アプリケーションとしては上記のようなデータ構造になることが考えられます。

![スクリーンショット 2017-10-21 17.05.10.png](https://qiita-image-store.s3.amazonaws.com/0/29971/2521ed15-21b3-7a44-e57f-f4d11d33cb4f.png "スクリーンショット 2017-10-21 17.05.10.png")


## 実装例
```sample.js
const selectedKeysString = Object.keys(input).map(
  (value, index) => {
    if(input[value] === true) {
      return value;
    }
    return null;
  }).filter((element, index, array) => {
    return element !== null;
  }).join(',');
```

### Object.keys()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
オブジェクトからキーを取り出して配列にしてくれるメソッドです。

```js
const input = {
	'1': false,
	'2': true,
	'3': true,
	'4': false
}
```
このオブジェクトが

```js
['1', '2', '3', '4']
```
という配列に変換されます。

### Array.prototype.map()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map
配列の要素を一つずつ取り出して、各要素に対してコールバック関数を適用できます。結果としてはコールバック関数でreturnした値の配列が得られます。コールバック関数の引数は、`value`と`index`です。Object.keysで展開された結果を使って書いてみます。

```map.js
['1', '2', '3', '4'].map(
	// value: 配列の要素の値, index: 対応する添字
	// '1'のときindexは0
  (value, index) => {
    if(input[value] === true) {
    	// inputは入力のオブジェクト
    	// input[value]とすることで、true, falseの値が取得できる
    	// trueの場合はキーであるvalueを返す
      return value;
    }
    return null;	// falseの場合はnullを返す
  })
```
map関数を経て、下記の配列が得られます。

```js
[null, '2', '3', null]
```

このまま文字列に直そうとするとfalseに対応する箇所がnullとなり余計です。

### Array.prototype.filter
引数として与えたテスト関数に適合する値のみの配列を返すメソッドです。

```js
[null, '2', '3', null].filter((element, index, array) => {
	// テスト関数ではelementがnullでなければtrueを返す
    return element !== null;
  })
```
filterを経て下記の配列が得られます。

```js
['2', '3']
```

### Array.prototype.join
引数に与えた文字列を区切り文字として、配列を文字列に変換するメソッドです。

```js
['2', '3'].join(',') // ,区切りで配列の要素をつなげる
```

joinを経てめでたくカンマ区切りの文字列が得られます。

```js
2,3
```
Windows Embedded 8.1で、双方向サポートを有効にして、プリントしたい

#目次
- 使用機器
- 症状
- 原因
- 対処法

#使用機器
- Windows Embedded 8.1
- NUC
- FUJIFILM ASK-300

#症状
NUCにプリンタをUSBで接続し、印刷命令をかけても、印刷できない（オフライン扱いとなる）。

#原因
プリンタのプロパティのポートタブにある、「双方向サポートを有効にする」にチェックが入っていると、
オフライン扱いとなる。
チェックを入れると、印刷はできるようになるが、プリンタがスリープになった場合、NUCの印刷命令から、
プリンタのスリープが解除されず、NUC側は印刷完了扱いとなる。

#対処法
1. コントロールパネル＞プログラムと機能を開き、`Windowsの機能の有効化または無効化`をクリック。
2. `Embedded Features`のプルダウンを開き、`USB Filter`のチェックをはずす。
3. 再起動

以上。
もしあなたが「Hap（またはHap Q）で動画を書き出して」と言われたら(Mac)

# Hapとは
動画のコーデックの一種。低圧縮（ファイルサイズでかい）が、そのぶん高速に再生できる。ものだそうです。

# どうやって変換するの？
https://github.com/Vidvox/hap-in-avfoundation/releases
ここの、
AVF.Batch.Converter.app.zipを落とせば、アプリケーションで変換できます。
「Settings...」でHapまたはHap Alpha、Hap Qで、それぞれ用途に合わせて
書き出せばOK。

# ちゃんと書き出せてるのか確認
ファイルを選択して、⌘+iを押してみる。
そうすると、詳細情報のコーデック：Hap1などと書かれている。
Hapで書き出したはずなのに、Hap1？これでいいの？と不安になる。

# FourCCで確認
このHap1というのは、[FourCC](https://ja.wikipedia.org/wiki/FourCC)と呼ばれるもの。どんなコーデックで、どんなフォーマットか、を4バイトの文字列で表すもの。
詳しくは以下。
https://github.com/Vidvox/hap/blob/master/documentation/HapVideoDRAFT.md#names-and-identifiers
Hap1=Hap。
Hap5=Hap Alpha。
HapY=Hap Q(高画質）
HapM=Hap Q Alpah。
なので、書き出してFourCCを確認できれば、安心して提出することができるよ。
PHPでnamespaceの中に関数を定義

GuzzleHTTPのテストコードを眺めていたら、こんな書き方があるものかと感心した。

https://github.com/guzzle/guzzle/blob/master/tests/bootstrap.php

# 概要

PHPでは `namespace` の後に続く `{}` の中に色々書ける。知らなかった。

その仕様を把握し、使いどころを考える。

# 名前空間付きの関数を定義

下記の場合に使えそう。

- 関数を書いておくだけのファイルを作りたい
- が、グローバル空間を汚染したくないため `files` オートローダーは使いたくない

```php:src/SomeProject/Functions.php
<?php

namespace SomeProject\Functions {

    function test()
    {
        return 'test';
    }

}
```

```php:main.php
<?php

require(__DIR__.'/src/SomeProject/Functions.php');

use SomeProject\Functions;

echo Functions\test(); // => test

echo test(); // => Call to undefined function test()
```

# 特定の名前空間の下で共通で使える関数を定義

ある名前空間に属すクラス間で共通して使いたい関数があるとする。

この場合、静的な関数のみを持つクラスを作るより、名前空間に属する関数を作ったほうがスマートに見える。

Guzzleの例も然りで、PHPUnitの `bootstrap.php` で関数定義すると便利かも。

```php:src/SomeProject/bootstrap.php
<?php

namespace SomeProject {

    function getVersion()
    {
        return '1.0.0';
    }

}
```

```php:src/SomeProject/SomeClass.php
<?php

namespace SomeProject;

class SomeClass
{

    public static function someMethod()
    {
        return getVersion();
    }

}
```


```php:main.php
<?php

require(__DIR__.'/src/SomeProject/bootstrap.php');
require(__DIR__.'/src/SomeProject/SomeClass.php');

echo SomeProject\SomeClass::someMethod(); // => 1.0.0

echo getVersion(); // => Call to undefined function
```
Rancher 2.0 Tech Previewを触る


# 目的
![Kobito.WfLDa3.png](https://qiita-image-store.s3.amazonaws.com/0/40692/015c1aca-296a-09f6-7220-119642d835c3.png "Kobito.WfLDa3.png")

Rancher 2.0のTech previewが出たので触る。

# 前提

- Ubuntu 16.04
- CPU2コア, 4GBメモリ
- docker 17.09-ce
	- 何気に未テストバージョンになるので正しい動作保証されないので注意。

# 手順

## インストール

### Rancherサーバのインストール

```bash:インストールコマンド
$ sudo docker run -d --restart=unless-stopped -v /opt:/var/lib/mysql -p 8080:8080 --name rancher rancher/server:preview
```

これでインストール完了。

![Kobito.JSQf2o.png](https://qiita-image-store.s3.amazonaws.com/0/40692/ed2ee279-8724-8b6f-7fdf-2c63fafb84aa.png "Kobito.JSQf2o.png")




### Rancherエージェントのインストール

#### エージェントのインストールコマンドの取得

ホストタブを選択して、ホストを追加 ボタンをクリック

![Kobito.MQgJG5.png](https://qiita-image-store.s3.amazonaws.com/0/40692/311dbdd7-88a1-e9af-f100-e6d87d1c8d01.png "Kobito.MQgJG5.png")

今回はローカルの環境で利用するので、Customを選択する。
表示されるコマンドをコピーする。

![Kobito.f5pEBc.png](https://qiita-image-store.s3.amazonaws.com/0/40692/91000956-fb7f-67af-e9ad-c1c451a457b4.png "Kobito.f5pEBc.png")

#### エージェントのインストール

管理対象としたいDockerホストにログインし、
先ほど確認したコマンドを実行する。

```bash:エージェントのインストールコマンド(今回の場合)
$ sudo docker run --rm --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v2.0-alpha4 http://192.168.0.5:8080/v3/scripts/C61544B367ABFBDF39F1:1483142400000:CTLTqb0hXPbE2Hw34NmYyhfh6A
```

インストールが終わるとホストタブで管理対象となっていることが確認できる。

![Kobito.imoQoe.png](https://qiita-image-store.s3.amazonaws.com/0/40692/c1b32c7d-5828-d9ad-d37d-a467bda52902.png "Kobito.imoQoe.png")

Rancherのユーザであれば、こっちの方が見慣れているかも。

![Kobito.md2Ldf.png](https://qiita-image-store.s3.amazonaws.com/0/40692/f28abc9f-5860-cb49-9ff9-56f5a12b2823.png "Kobito.md2Ldf.png")

# インストール後

特に何かするわけでもないけれども、k8sベースになったので
固有部分?だけを確認。

コンテナタブを選択すると、k8s関連の機能が見えてくる。

![Kobito.Ef9aBv.png](https://qiita-image-store.s3.amazonaws.com/0/40692/43d66ed8-9960-4f29-1543-b896acf2003c.png "Kobito.Ef9aBv.png")


## Dashboard

k8sのネイティブのダッシュボード

![Kobito.Smz5ad.png](https://qiita-image-store.s3.amazonaws.com/0/40692/f435d16e-a4df-6bca-daf8-6cc8d74c3f62.png "Kobito.Smz5ad.png")


## Shell

kubectlなどのコマンドを実行可能なシェル画面が取れる。

![Kobito.ENQbRL.png](https://qiita-image-store.s3.amazonaws.com/0/40692/338c2bda-6335-84eb-9fb8-3c33bf179047.png "Kobito.ENQbRL.png")

## Config

![Kobito.UASrV5.png](https://qiita-image-store.s3.amazonaws.com/0/40692/c38f1939-06ce-e519-d245-7a79d102e1d1.png "Kobito.UASrV5.png")

# まとめ

Dockerホストさえ準備できれば、

- Rancherサーバのインストールコマンド * 1
- Rancherエージェントのインストールコマンド * 台数分

で環境を準備できるのでええんでないかな??
Pythonのlocals()

チラ裏品質。「うえー」ってなったのでメモっとく。

環境は下記の通り (macOS Sierra + pyenv)

```
Python 3.6.3 (default, Oct 10 2017, 09:48:52)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
```

`locals()` はそのローカル名前空間の名前を辞書形式で返すのかと思いきや、正確には多分違う。
そのローカル名前空間上で、最外殻に至るまでのローカル名前空間からその関数の実行に必要なシンボルをコピって辞書化したもの、みたいだ。

```py3
x = 1
def test():
    x, y = 2, 100
    def test():
        x, z = 3, 200
        print('b', x, y, z, locals())
    print('a', x, y, locals())
    test()
test()
```

```shell-session
a 2 100 {'test': <function test.<locals>.test at 0x10cd37400>, 'x': 2, 'y': 100}
b 3 100 200 {'z': 200, 'x': 3, 'y': 100}
```

「b」の`locals()`の結果にyがあるので「ひぇ」ってなる。仮にそのローカル名前空間の名前と値のマッピングだけであればこれはあってはいけない。
関数をパースする段階で参照専用の名前yを見つけてこの辞書に突っ込んでいる。

https://docs.python.org/3/library/functions.html#locals

> Note The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by the interpreter.

```py3
x = 1
def test():
    x, y = 2, 100
    def test():
        x, z = 3, 200
        print('b', x, y, z, locals())
        locals()['z'] = 300
        print('c', x, y, z, locals())
        locals()['y'] = 300
        print('d', x, y, z, locals())
    print('a', x, y, locals())
    test()
    print('e', x, y, locals())
test()
```

```shell-session
a 2 100 {'test': <function test.<locals>.test at 0x102fd7400>, 'x': 2, 'y': 100}
b 3 100 200 {'z': 200, 'x': 3, 'y': 100}
c 3 100 200 {'z': 200, 'x': 3, 'y': 100}
d 3 100 200 {'z': 200, 'x': 3, 'y': 100}
e 2 100 {'test': <function test.<locals>.test at 0x102fd7400>, 'x': 2, 'y': 100}
```

代入がガン無視されている。注意書きの通りだ。

当然、この挙動は `exec()` にだって影響が出る

https://docs.python.org/3/library/functions.html#exec

> Note The default locals act as described for function locals() below: modifications to the default locals dictionary should not be attempted. Pass an explicit locals dictionary if you need to see effects of the code on locals after function exec() returns.

```py3
def test():
    x = 0
    exec('x = 10', globals(), locals())
    print(x)

test()
```

```
0
```

正しいのは例えばこう

```py3
def test():
    x = 0
    exec_local = {'x': x}
    exec('x = 10', globals(), exec_local)
    x = exec_local['x']
    print(x)

test()
```
Vaporで新規ファイルを追加したら

Server Side Swiftのフレームワーク[Vapor](https://vapor.codes/)で開発していました。
新しいファイルを追加したらビルドができなくなっていた。
その対処法を記します。


#実行環境
* Xcode9.0
* Vapor Toolbox: 2.0.4
* Vapor Framework: 2.2.2
* Apple Swift version 4.0 (swiftlang-900.0.65 clang-900.0.37)


# 問題点

Vaporのプロジェクトに新しいファイルを追加しそこにクラスを作って、ビルドしようとすると作ったクラスが見つからずビルドが失敗しました。
Xcodeプロジェクトを生成し、Xcodeからファイルを追加しています。

下記は`AddFile.swift`を作成し、`AClass`クラスを定義した例です。

```swift
//
//  AddFile.swift
//  SampleRoutingPackageDescription
//
//  Created by satoutakeshi on 2017/10/21.
//

import Foundation
class AClass {
    init(){}
}
```

これを`main.swift`から呼んでみます。

```swift
//Sources/Run/main.swift
let _ = AClass()
```

コマンドラインからビルドしてみます。

```bash
$ vapor build
```

下記のようなエラーがでてビルドが失敗します。

```
$ vapor build
Building Project [Failed]

Command:
build --enable-prefetching

Error (1):
error: terminated(1): /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-build-tool -f '/path/to/.build/debug.yaml' main


Output:
Compile Swift Module 'App' (7 sources)
Compile Swift Module 'Run' (1 sources)
/path/to/Sources/Run/main.swift:131:9: error: use of unresolved identifier 'AClass'
let _ = AClass()
        ^~~~~~
```

`use of unresolved identifier `ということで`main.swift`上で`AClass`を認識していないことがわかります。

# 解決方法

原因は各ファイルのプロジェクトのターゲットメンバーシップが異なることが原因でした。
`main.swift`はデフォルトでは`Run`のモジュールに属していて、新しく追加した`AddFile`が`App`に登録されており、異なったターゲットメンバーシップになっていたのにもかかわらず`AClass`クラスの公開設定が`Internal`(モジュール間のみ公開）になっていました。
そのため、`main.swift`では異なるモジュールの`AClass`クラスを見つけられず`use of unresolved identifier`のエラーが発生していました。

これを解決するためには`AClass`クラスを`public`にします。

```swift
public class AClass {
    public init(){}
}
```

ビルドしてみます。

```bash
$ vapor build
```

上手くいけばビルドが成功するはずです。

```bash
$ vapor build
Building Project [Done]
```



#参考
[swift build use of unresolved identifier](https://stackoverflow.com/questions/45931416/swift-build-use-of-unresolved-identifier)
failed to run command: ebb cover.jpg (RuntimeError)

Re:VIEWでPDFを生成する時のエラー対応。

## エラーメッセージ
```
$ rake pdf
review-pdfmaker config.yml
compiling test.tex
/Library/Ruby/Gems/2.0.0/gems/review-2.3.0/lib/review/pdfmaker.rb:42:in `system_or_raise': failed to run command: ebb cover.jpg (RuntimeError)
	from /Library/Ruby/Gems/2.0.0/gems/review-2.3.0/lib/review/pdfmaker.rb:275:in `block in copy_images'
	from /Library/Ruby/Gems/2.0.0/gems/review-2.3.0/lib/review/pdfmaker.rb:268:in `chdir'
	from /Library/Ruby/Gems/2.0.0/gems/review-2.3.0/lib/review/pdfmaker.rb:268:in `copy_images'
	from /Library/Ruby/Gems/2.0.0/gems/review-2.3.0/lib/review/pdfmaker.rb:235:in `generate_pdf'
	from /Library/Ruby/Gems/2.0.0/gems/review-2.3.0/lib/review/pdfmaker.rb:132:in `execute'
	from /Library/Ruby/Gems/2.0.0/gems/review-2.3.0/lib/review/pdfmaker.rb:86:in `execute'
	from /Library/Ruby/Gems/2.0.0/gems/review-2.3.0/bin/review-pdfmaker:18:in `<top (required)>'
	from /usr/local/bin/review-pdfmaker:23:in `load'
	from /usr/local/bin/review-pdfmaker:23:in `<main>'
rake aborted!
Command failed with status (1): [review-pdfmaker config.yml...]
/Users/test/Rakefile:60:in `block in <top (required)>'
Tasks: TOP => pdf => book.pdf
(See full trace by running task with --trace)
```

## TeX入れよう。
TechBoosterさんのREADMEにも書いてます。
https://github.com/TechBooster/FirstStepReVIEW#全員の原稿を-pdf-化
>pdf を生成する場合は TeX のインストールが必須です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38442/85771eac-43ce-e422-6ebe-cea499f55848.png)

http://tug.org/mactex/

3GBくらいあるので、気長に待ちましょう。（DLに3時間くらいかかりました・・・。）
pkgをinstallして、端末を再起動したら `rake pdf` でPDF生成できるようになりました。:tada:
Macで動画サイトを見る際に無駄に通信量を浪費しない方法


# 概要
- スマホのテザリングやWiMAXでインターネットに接続して動画サイトを見るときに、無駄に高画質で再生して、通信量を浪費しない方法を記載する。
- Youtubeはプレーヤー設定で画質を手動で変更できるが、AbemaTVなどではできないため、この方法を利用している。

# 方法
## 使用するツール
- Network Link Conditioner (with Xcode)

## インストール手順
Network Link Conditionerは、アプリ開発において様々な通信環境での動作を確認するための開発ツールなので、Xcodeを予めインストールする必要がある。

1. App StoreでXcodeをインストールする。
2. Xcodeを起動して、メニューバーの「Xcode」->「Open Developer tool」->「More Developer Tools...」をクリックする。
3. ブラウザでログイン画面が起動するので、ログインする。
4. ログインするとツールのリストが表示されるので、「Hardware IO Tools for Xcode 7.3」をダウンロードする。
5. ダウンロードした.dmgを開いて、「Network Link Conditioner.prePane」をインストールする。
6. Macの「システム環境設定」を開くと、「Network Link Conditioner」のアイコンが作成されているので、それを起動する。
7. Presetで色々なプロファイルがあるので、好きな通信速度のプロファイルを選択して、左側のON/OFFスイッチをONにする。
8. Macの「アクティビティモニタ」で通信量が制限されているか確認する。
getAttribute()とアンボクシング

Servletをやっていて、つい

```java
HttpSession session = request.getSession();
boolean hasError = (Boolean)session.getAttribute("hasError");
```

というコードを書いてしまった。結果、これはNullPointerExceptionを投げてきた。

``getAttribute()``は戻り値がObject型なので、ラッパークラス（ここではBoolean)でキャストする必要がある。
ところが、最初に``getAttribute()``を呼び出した時、戻り値はnullになるので、Boolean型のnullをアンボクシングしてboolean型に代入しようとした結果、NullPointerExceptionになる、という仕組みなのだった。

アンボクシングが起きる際、nullに気をつけるべきだったが、ちょっとこれは個人的に想定外だったので、一応メモをしておく。
githubのプライベートリポジトリをcomposerで引っ張って来る

composer.jsonに以下を追加。

```
{
    "repositories": [
        {
            "type": "vcs",
            "url": "git@github.com:goodlife-retech/test.git"
        }
    ],
    "require": {
        "goodlife-retech/test": "dev-master"
    }
}
```

composer updateすれば

```
RSA key fingerprint is SHA256:*******
Are you sure you want to continue connecting (yes/no)? 
```
と聞かれるので、yesと答えれば引っ張って来る
エビデンス取得マクロツール(スクリーンショットキー押すだけ)

#１．出展元はこちら
■t-hom’s diary
[VBA スクリーンショットを撮るたびに自動でシートに張り付けるマクロ](http://thom.hateblo.jp/entry/2015/11/22/181902)

規約読みました。
流用させて頂いております。ありがとうございます。

#２．クリップボードに入ったスクリーンショットを自動でExcelに張り付けていくマクロ


```vbnet:AutoCapture()
Declare Function OpenClipboard Lib "user32" (Optional ByVal hwnd As Long = 0) As Long
Declare Function CloseClipboard Lib "user32" () As Long
Declare Function EmptyClipboard Lib "user32" () As Long
Public LOCALOFFSET As Long

Sub AutoCapture()

    'クリップボードを空にする。
    OpenClipboard
    EmptyClipboard
    CloseClipboard
                    
    MsgBox "AutoCaptureを開始します。" & vbNewLine & _
        "①貼り付け開始位置にカーソルを置いて" & vbCr & _
        "②貼り付け開始位置変える場合はリセットボタン押して" & vbCr & _
        "③このマクロ起動中はエビデンスに全て貼付けられるから注意", vbInformation
    Dim CB As Variant
    Dim IsFirst As Boolean: IsFirst = True
    Do While True
        CB = Application.ClipboardFormats
        If StrConv(ActiveSheet.Cells(1, 1).Value, vbUpperCase) = "EXIT" Then GoTo Quit
        If CB(1) <> -1 Then
            For i = 1 To UBound(CB)
                If CB(i) = xlClipboardFormatBitmap Then
                    If IsFirst = True Then
                        ActiveSheet.Paste Destination:=ActiveCell
                        IsFirst = False
                        LOCALOFFSET = LOCALOFFSET + CInt(Sheets("メニュー").Range("kankaku").Value)
                    Else
                        ActiveSheet.Paste Destination:=ActiveCell.Offset(LOCALOFFSET, 0)
                        LOCALOFFSET = LOCALOFFSET + CInt(Sheets("メニュー").Range("kankaku").Value)
                    End If
                    
                    'クリップボードを空にする。
                    OpenClipboard
                    EmptyClipboard
                    CloseClipboard
                End If
            Next i
        End If
        DoEvents
    Loop
    
Quit:
    MsgBox "AutoCaptureを停止しました。", vbInformation
    ActiveSheet.Cells(1, 1).ClearContents
End Sub


```

```vbnet:reset()
'貼付け位置をリセット
Sub reset()
    LOCALOFFSET = 0
    MsgBox "リセットしたよ"
End Sub

```

```vbnet:stopMacro()
'マクロを停止する
Sub stopMacro()
    MsgBox "マクロを停止したよ"
    End
End Sub

```

#３．使用準備
①Alt+F11でVBEを開き~~シートでも標準モジュールでもいい~~標準モジュールに上記マクロを貼り付ける※Option Explicitの宣言がある場合は宣言を削除する
②シート名を「メニュー」とし、そこに以下キャプチャの様な感じでボタンを作成。マクロとボタンを関連付ける
・「開始」ボタンに「AutoCapture()」を登録する
・「停止」ボタンに「stopMacro()」を登録する
・「リセット」ボタンに「reset()」を登録する
③どこでもいいのでセルに「kankaku」という名前を付ける

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/208615/daabc8a8-3bd5-5099-5954-6531da8301eb.jpeg)



#４．あとは使うだけ！
①マクロを開始し、スクリーンショットでキャプチャを取るとセルのカーソルが置いてある場所に張り付けられる。※貼付け後はクリップボードは空になる
②２回目以降は名前が付けられたセル「kankaku」から取得した数値分、下にずらして張り付けていく
③貼付け位置を変える時はリセットボタンを押す
④マクロ起動中は、コピーしたものはすべてEXCELシートに張り付けられてしまうため、使用が終わったら停止ボタンでマクロを停止する

#５．使ったらこんな感じ
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/208615/1c79d5af-d0f3-733f-4b29-d7a42d374f6c.jpeg)



おーわり
Chrome おすすめ拡張機能


#Youtube用

- **Enhancer for YouTube**
	- これでデフォルトの画質を設定しておけば、動画を開いた際に、自動的に指定した画質で再生してくれる。
- **Turn Off the Lights for YouTube**
	- プレーヤーの画面部分以外が暗くなり、動画が見やすくなる。
いまさらRedis入門

いまさら入門してみる
　
---
とりあえずざっくりまとめ。
![Redis.png](https://qiita-image-store.s3.amazonaws.com/0/81753/4d3aab74-df58-caf3-25cc-bb1797937972.png)
　
---
# 参考
Redis入門 インメモリKVSによる高速データ管理/Josiah L. Carlson
http://amzn.asia/h4dPfXk
Dropzone 3 のPython版自作アクションテンプレート

# Dropzone 3って?
[Dropzone 3](https://aptonic.com/)はAptonic Software社から販売されているMacのドラッグ&ドロップ拡張ソフトウェアです．
10ドルの有料ソフトですが試用期間15日の試用版もあります．

これを導入するとドラッグしたファイルをメニューバーに「仮置き」したり，特定のアプリで開いたりできるようになります．
<img width="585" alt="Dropzone3.png" src="https://qiita-image-store.s3.amazonaws.com/0/124405/43cb491c-2977-d2f5-b6e3-2f132a85ee73.png">

この仮置き機能は[DragonDrop](https://www.macupdate.com/app/mac/42610/dragondrop)や[Yoink](https://itunes.apple.com/jp/app/yoink-%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0-%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%82%92%E5%BF%AB%E9%81%A9%E3%81%AA%E3%82%82%E3%81%AE%E3%81%AB/id457622435?mt=12)に近いものです．

それらと比べてDropzoneが便利な点は，ドラッグしたファイルにまとめて適用する「アクション」をユーザが自作できることです．私は

- 複数のファイルにまとめて接頭辞・接尾辞を付す
- ファイルの形式を変換する(PDF→EPS等)
- 特定のフォルダにファイルをコピーする

といった使い方をしています．この「アクション」はrubyあるいはpythonで作成することができ．アクションの作り方は[GitHubのリポジトリ](https://github.com/aptonic/dropzone3-actions)で詳しく説明されています．ただ．この公式ドキュメントにpython用の例がなかったのと，自分用の覚え書きのために，以下にアクションの作り方とテンプレートを載せておきます．

# アクションの作り方
まずアクションの作り方なのですが，Dropzoneウィンドウの左上の+マークを押すと出てくるポップアップよりDeverop Action...を選択．

<img width="470" alt="DropzoneDeveropAction.png" src="https://qiita-image-store.s3.amazonaws.com/0/124405/78697f47-c7ba-b776-c1aa-2a11feff17c1.png">

そうすると以下のようなウィンドウで設定を促されるので，適当に入力します．
<img width="363" alt="スクリーンショット 2017-10-21 14.49.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/124405/e0157884-00bf-9040-5308-9be9265aa627.png">

設定項目は以下の通り．

- Name, Description, Creator, URL: それぞれアクション名，説明，作成者，作成者のウェブページです．作成されるコードのヘッダーにコメントとして書かれることになります．
- Language: rubyかpythonより選べます．
- Supported Events: ドラッグで起動するか，クリックで起動するか，あるいはその両方で起動するかを選べます．基本的にDropzoneではドラッグで起動するアクションを作ることになるかと思います．ただ，クリックで起動(Clicks)のチェックを外すとアクションのアイコンが薄い色で描画される様になって見た目が嫌なので，私はクリックにも何らかの機能をもたせることが多いです．
- Supported Types: ファイルだけでなく，選択したテキストをドラッグ&ドロップしてアクションを起動することもできます． 
- Runs Sandboxed: OS Xのサンドボックス化を有効にします．Macの重要なシステムコンポーネント等をいじれなくなります．基本的に有効でOKです．
- Include Commants: アクションのコード中に，アクションの書き方について丁寧な英語コメントが付きます．最初のアクションを作るときだけチェックしておけばよいかも．

# Dropzone 3 のPython版自作アクションテンプレート
上記の設定を終えるとエディタが起動してアクションが編集できるようになります．
pythonだと以下のようにすると良い感じになります．

```python
def dragged():
    dz.begin("Begin") # プログレスバーを開始
    dz.determinate(True) # dz.percentによる進捗状況の逐次報告を有効化

    num = len(items)
    for i, item in enumerate(items): # 複数ファイルがドロップされた場合のためのループ
        pass # ここで何かする

        dz.percent(100 * i / num) # 進捗状況をパーセントで報告．プログレスバーに反映される．

    dz.finish("Finish") # "Macの通知センターに"終了を通知
    dz.url(False) # プログレスバーを消去

def clicked():
    pass # ここで何かする
```

注意すべき点として，クリップボードにURLを転送する`dz.url`が**何故か**プログレスバーを終了する役割も担っているので，URLを使わない場合でも`dz.url(False)`を呼び出しておく必要があります．

# おわりに
普段ターミナルだけで作業している方には無用かもしれませんが，マウスでファイルを移動することがよくある場合にはDropzone 3はとても便利なソフトです．この記事がアクション作成のなにかの参考になれば幸い．
Laravelで簡単にデザイナにサイトを見せる

## 自身のマシンIPアドレスを調べる

###Macの場合(windowsは知りません)
システム環境設定->ネットワーク->Wifi->詳細->TCP/IP
にIPv4という項目があります。

※参考
http://www.geolocation.co.jp/learn/program/03.html

## サーバを起動する
`php artisan serve --host=0.0.0.0`

すると、 `http://[自分のIPアドレス]:0.0.0.0`にアクセスできます。


## 参考
http://tech.innovator.jp.net/entry/2016/08/23/160506
Emacs で矩形挿入

http://emacs.rubikitch.com/rectangle-mark-mode-emacs25/

ここで教えていただきました。便利!!
Emacs 25.1 以上のようですが。。

- C-x spc で矩形モードに
- 文字列を置き換えたい場合は、置き換えたい個所を選択。挿入したい場合は、選択せずに次へ
- C-x r t で string-rectangle mode に。ミニバッファに挿入したい文字列を入力
electronでニコニコ垂れ流しプレイヤーを作ろうとしてハマったことまとめ

#導入
先日[electronでゲームの専ブラ](https://qiita.com/violet2525/items/a9ad88a4a455715628ea)を作ったのですが、引き続きelectronで遊んでます
普段作業中はBGVにニコニコ動画を垂れ流しているのでそのプレイヤーなんかほしいですね、作りましょう

##electronでニコニコを開いたあとに別のブラウザで開くとまたログインしなおさなきゃならなくて面倒だ
→chromeのcookieを持ってこよう
→chromeのcookieはSQLiteらしい
→ライブラリを使おう
→ハマる

##まずはSQLite
ぐぐるといっぱい出てくるのですがことelectronで[Sqlite3](https://www.npmjs.com/package/sqlite3)を使おうとすると面倒なようです
かといってC#とかわからないのでなんとか導入しました
参考にした記事→[Windows 上で Electron + sqlite3 のアプリを動かそうとするとエラーになる場合の対処法](https://qiita.com/noobar/items/0128677c44bb9dde88b2)


##cookieを復号
で、ChromeのCookieは暗号化されているので復号しましょう
[こちら](http://exture-ri.com/2016/02/29/cookie%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%AA%BF%E3%81%B9%E3%81%A6%E3%81%BF%E3%81%9F/)のページを参考にpythonで書くことにします、python知らないけど

###pythonでエラー
で、まあ出ますよね、まるまるコピペしたコードですしね
とりあえず最終的なコードを下に書いておきます　石は投げないでくだちい

```python:sample.py
import sys
sys.path.append("C:\Program Files (x86)\IronPython 2.7\Lib")
sys.path.append("C:\Program Files (x86)\IronPython 2.7\DLLs")
from ctypes import *
from ctypes.wintypes import DWORD
import traceback;
from System import Array, Byte

class DATA_BLOB(Structure):
    _fields_ = [("cbData", DWORD), ("pbData", POINTER(c_char))];

def getData(blobOut):
    cbData = int(blobOut.cbData);
    pbData = blobOut.pbData;
    buffer = c_buffer(cbData);
    memcpy(buffer, pbData, cbData);
    LocalFree(pbData);
    return buffer.raw;

def decrypt(cipherText):
    try:
        test = str(buffer(cipherText))
        bufferIn = c_buffer(test, len(cipherText));
        blobIn = DATA_BLOB(len(cipherText), bufferIn);
        blobOut = DATA_BLOB();
        if CryptUnprotectData(byref(blobIn), None, None, None, None,CRYPTPROTECT_UI_FORBIDDEN, byref(blobOut)):
            return getData(blobOut);
        else:
            raise Exception("Failed to decrypt data");

    except TypeError as e:
        print("type error")

LocalFree = windll.kernel32.LocalFree;
memcpy = cdll.msvcrt.memcpy;
CryptProtectData = windll.crypt32.CryptProtectData;
CryptUnprotectData = windll.crypt32.CryptUnprotectData;
CRYPTPROTECT_UI_FORBIDDEN = 0x01;

lambda x: decrypt(x)
```

sys.path.append～を入れないとctypesが動かなかったので入れました
それ以外は参考ページのコピペです、あとできれいにします　あとで　そのうち　たぶん

##Edge.js
pythonで書いたコードをelectronで動かすためにedge.jsを使います
最初普通のedgejsをインストールしてて動かなくて焦った
electronで使うときは[electron-edge](https://www.npmjs.com/package/electron-edge-js)を使うらしいです

##そしてハマり続ける
とりあえずchromeのcookieを持ってくることはできました
今はこれをelectronのwebviewのcookieにねじこんでからニコニコのページを表示させる的な動きをさせてるけどもうちょっとましな実装にしたいです

また何かはまったら書きます
MCP試験を初めて受験する人むけ情報

# MCP試験を初めて受験する人むけ情報

## 試験概要と範囲

試験の概要と範囲は各試験のページに明記されているので必ず確認しよう。

例：[70-483: C# でのプログラミング](https://www.microsoft.com/ja-jp/learning/exam-70-483.aspx)

その他の試験は [マイクロソフト認定資格試験一覧](https://www.microsoft.com/ja-jp/learning/exam-list.aspx) から探して。

## 問題形式

４０～６０問程度出題される。複数の選択肢から正解を選ぶ問題や、手順を正しい順番に並び替える問題など、問題形式は様々。

[マイクロソフト認定資格試験](https://www.microsoft.com/ja-jp/learning/certification-exams.aspx) の「試験形式および質問のタイプ」にチュートリアル動画があるので確認しておくとよい。

## 受験予約

各試験のページから受験予約できる。予約にはMicrosoftアカウントが必要なので、持ってない人は取得しておこう。

試験会場は各地にある PearsonVUE テストセンターなので、自宅か勤務先の近くで受験できる。

テストセンターにもよるが、平日・休日ともに受験可能。ただ、予約制なので早めに登録をしておかないと予約が埋まってしまうこともある。受験したい日の2週間前くらいには予約しておくとよい。

※予約キャンセルはできるが、試験日まで1週間を切っているとキャンセル料が発生するので注意

## 試験料

￥23,000くらい。受験予約時に支払う方法と、事前にバウチャーを購入する方法がある。学割制度もあるので学生は1万円くらい安く受験できる。

受験料の支払いにはクレジットカードが必要だが、クレジットカードを持っていない場合でも、銀行振り込みで買える代理店からバウチャーを買っておけば受験できる。

受験予約の時に支払う方が楽だが、バウチャーを買う方が色々お得。一度落ちても再試験ができるバウチャーや、模試がついてくるバウチャーもある。

試験料の例

- 受験予約時に支払う場合：￥22,791
- バウチャーを買う場合：￥21,700 (千円くらいお得)
- 再試験付きバウチャーを買う場合：￥29,700（バウチャーを2つ買うよりは安い）
- 再試験＋模試つきバウチャーを買う場合：￥32,400 (ちょっと高いけど不安ならコレ)

バウチャーはキャンペーンで安く販売されることもある。受験予約前に下記のページを確認しておくとよい。

[MCP 受験バウチャーの割引販売](https://www.microsoft.com/ja-jp/learning/local-cloud.aspx#discount)

[認定資格と試験のオファー](https://www.microsoft.com/ja-jp/learning/offers.aspx)

## 試験準備

### 書籍

Exam Ref シリーズというMCP試験勉強向けの本が Micorsoft Press から出版されている。英語だけど苦手でなければ。（試験によっては出版されていないものもある）

例：[Exam Ref 70-483 Programming in C#](https://www.microsoftpressstore.com/store/exam-ref-70-483-programming-in-c-sharp-9780735676824)

※ Microsoft Virtual Academy に登録すると、Microsoft Press Store で電子書籍が半額になるコードがもらえるので、購入を検討している人は是非。

その他、Microsoft が無料の e-book を公開しているので要確認：[Free eBooks from Microsoft Press](https://mva.microsoft.com/ebooks)

### 動画

Microsoft Virtual Academy で受験者向けの動画が提供されていることもある。

例：[Programming in C# Jump Start](https://mva.microsoft.com/en-US/training-courses/programming-in-c-jump-start-14254)

### 模試

よほどの自信が無い限り、模試は買っておいた方がよい。問題に解答することで理解が深まるというメリットもある。

mindhubから [マイクロソフト公式演習テスト](http://jp.mindhub.com/product-p/mu-msft-30day.htm&utm_source=microsoft&utm_medium=certpagejp&utm_campaign=msofficialpractice) が提供されている。ただ、模試を単体で買うより [練習テスト付き Microsoft Exam Replay](http://jp.mindhub.com/MCP-bundles-practice-test-vouchers-p/microsoft_exam_replay_pt.htm) バウチャーを買う方がお得。



### 実際に製品やサービスを使ってみる

実際の製品を触らずに試験に合格するのはたぶん無理なので、一通りの操作を少なくとも1度は試したほうが良い。

Visual Studio なら Community Edition、Azure なら最初の1カ月は約20000円分試用できるなど、無料で使えるものも多い。


## その他所感

何度かMCP試験を受けてきた人からのアドバイス的な。あくまで個人の感想です。

### 試験難易度

難易度は、個人的な感覚だが、試験範囲の内容を実装できる・人に説明できるレベルに達していれば十分合格圏内だと思う。逆に、本を読んだだけ・動画を見ただけ程度では合格は難しい。

### 試験にかかる時間

問題数や個人差にもよるが、全問解答するのに1時間～2時間程度かかる。ただし制限時間もあるので事前に確認しておこう。

かなり集中力を使うので、頭がさえている休日の午前中に受験するのがおススメ。試験結果はその場でわかるので、合格してたら美味しいランチでも食べればいい。

### 受験時の言語

ほとんどの試験は日本語で受験できる。また、試験中に原文（英語）を表示することもできる。

ただ、日本語の試験問題には翻訳ミスや翻訳漏れがあるので、かならず原文を確認するのが良い。（毎回１～２問は不備があった）
redux-persist の flow 型付け


https://github.com/rt2zz/redux-persist

Action の型に Union しておきます。

```js:src/types/index.js
import type { Action as _Action } from './action'
import type { State as _State } from './state'

type RehydrateAction = {
  type: 'persist/REHYDRATE',
  payload: _State,
}

export type State = _State
export type Action = _Action | RehydrateAction
```


reducer などで ```action.payload``` を State type として使えます。

```js:src/containers/System/reducer.js
// @flow
import { REHYDRATE } from 'redux-persist/constants'

import type { Action, System } from '../../types'
import { Actions } from './actionTypes'

export type State = System

export const initialState: State = {
  selectedTab: 1,
}

export default function(state: State = initialState, action: Action): State {
  switch (action.type) {
    case Actions.SWITCH_TAB:
      return {
        ...state,
        selectedTab: action.target,
      }
    case 'persist/REHYDRATE':
      return action.payload.System

    default:
      return state
  }
}
```


[akameco/s2s-examples](https://github.com/akameco/s2s-examples/tree/1ef67ad80edb163374f99c6ed80f0888b0762e5c/shopping-cart/src) のプロジェクト構成に導入する例にしています。
Automatically upload WxBeacon2 data to Ambient 

# WxBeacon2

WxBeacon2
https://weathernews.jp/smart/wxbeacon2/normal.html

Environment Sensor 2JCIE-BL01
https://www.components.omron.com/web/en/solutions/mems-sensors/environment-sensor

OmronMicroDevices/envsensor-observer-py
https://github.com/OmronMicroDevices/envsensor-observer-py

Gathers eight environmental information.
- temperature
- humidity
- light
- uv index
- pressure
- noise
- discomfort index
- heatstroke risk indicator

# Bluetooth Module
Bluetooth®4.0+EDR/LE対応 USBアダプター BSBT4D09BK
http://buffalo.jp/product/peripheral/wireless-adapter/bsbt4d09bk/

https://www.amazon.co.jp/gp/product/B0096FIF0C/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1


# Requirements
- Ubuntu 16.04 (Running on ESXi6.5)
- node.js
- noble
- ambient-lib
- date-utils

`sudo apt-get install -y nodejs npm`
`npm install noble`
`npm install ambient-lib`
`npm install date-utils`

#wx2ambi.js

https://qiita.com/KazuyukiEguchi/items/32c6497496923783fa53

https://gist.github.com/yoshidaken1/10bb1c601d242665e6a438b01ab4c348

https://speakerdeck.com/kyoshida/wxbeacon2falseqi-xiang-tetawoambientniding-qi-de-niupsuru

- Run wx2ambi.js as root

`sudo node ./wx2ambi.js 
on -> stateChange: poweredOn
on -> scanStart
on -> discover: undefined
on -> discover: undefined
on -> discover: Env
12:34:56:ab:cd:ef
on -> scanStop
on -> connect
No=8
Temp=17.27 ℃
Humidity=97.92 %
Luminosity=916 lx
UV Index=0.05
Atom=1010.1 hPa
Noise=35.89 dB
Discomfort index=63.02
Heat=20.85 ℃
Battery=2.928 mv
on -> disconnect
Sat Oct 21 2017 12:40:30
200`

#Ambient
https://ambidata.io/ch/channel.html?id=2430
他人の Node module を修正して使う

# はじめに

本当は本体に取り込んでもらうべきだけれど，取りあえず修正して使いたい場合に
※ fuse-box を元に

# 手順

- github 上で fork
- fork したリポジトリを clone でダウンロード

```
git clone git@github.com:"User"/fuse-box.git
```
- fork 元を upstream に設定

```
git remote add upstream https://github.com/fuse-box/fuse-box.git
git fetch upstream
```

- ブランチを作る

```
git checkout -b foobar-dev
```

- build and test

```
npm run-script test; npm run-script dist
```

- npm link で global module にする

```
npm link
```

- npm link でプロジェクトにインストール(プロジェクトのディレクトリで実行)

```
npm link fuse-box
```

# 開発，修正

```
git pull upstream
git push origin foobar-dev
```
Moment.js で moment.locale('ja') が効かないときは

現環境は moment@^2.19.1 。半年くらい前からドキュメントで理解できなかった部分なので。


https://github.com/moment/moment/issues/2962

```js:index.js
import moment from 'moment'
moment.locale('ja')

moment()
  .startOf('hour')
  .fromNow()

# => 6 minutes ago
```

↓

```js:index.js
import 'moment/locale/ja'

import moment from 'moment'
moment()
  .startOf('hour')
  .fromNow()
# => 6分前
```

これで設定できました。
UNIXという考え方

[『UNIXという考え方』](https://www.amazon.co.jp/UNIX%E3%81%A8%E3%81%84%E3%81%86%E8%80%83%E3%81%88%E6%96%B9%E2%80%95%E3%81%9D%E3%81%AE%E8%A8%AD%E8%A8%88%E6%80%9D%E6%83%B3%E3%81%A8%E5%93%B2%E5%AD%A6-Mike-Gancarz/dp/4274064069)の読書メモ。

## UNIXの基本定理
[定理1] スモール・イズ・ビューティフル
[定理2] 1つのプログラムには1つのことをうまくやらせる
[定理3] できるだけ早く試作する
[定理4] 効率より移植性を優先する
[定理5] 数値データはASCIIフラットファイルに保存する
[定理6] ソフトウェアを梃子(てこ)として使う
[定理7] シェルスクリプトによって梃子(てこ)の効果と移植性を高める
[定理8] 過渡の対話的インターフェースを避ける
[定理9] すべてのプログラムをフィルタとして設計する

# シンプルさの追求
[定理1] スモール・イズ・ビューティフル
[定理2] 1つのプログラムには1つのことをうまくやらせる

`小さなプログラムのメリット`
- 読みやすい
- テストしやすい
- コンピュータリソースの節約
- 移植性が高い
- 無駄な機能を作らなくて済む

YAGNI: You ain't gonna need it
必要になるまで作らない。

`単一責任のメリット`
- 無駄な機能を作らなくて済む
- 移植性が高まる

# 継続的改善による学習、進化
[定理3] できるだけ早く試作する

`小さく、早く試すことのメリット`
- 後の大きなリスクを避けられる
- 学習、進化のスピードが上がる

完璧 or Nothingより、継続的改善と学習の積み重ねによる着実な進化を目指す。

# 依存しない
[定理4] 効率より移植性を優先する
[定理8] 過渡の対話的インターフェースを避ける
[定理9] すべてのプログラムをフィルタとして設計する

`高い移植性のメリット`
- 新しい他のハードウェアにも移植するだけで対応できる。
- あらゆるシステムから処理を実行するためのインタフェースを用意することで、あらゆる入出力に対して対応できる。

プログラムの実行速度より、あらゆるハードウェア、システム上で動く移植性の高さを優先する。
プログラムの速度は、次に来るハードウェアの性能が上がることで克服できるが、ハードウェアに依存して移植できなければ、新しいシステムのために、もう一度最初からプログラムを書き直さないといけなくなる。

# 効率よく
[定理6] ソフトウェアを梃子(てこ)として使う
[定理7] シェルスクリプトによって梃子(てこ)の効果と移植性を高める

- 自動化できるものはどんどん自動化する。
- DRY（Don't　Repeat　Yourself）同じプログラムを何度も書かなくて済む。
- 巨人の肩に乗り、車輪の再発明を避ける。（時には車輪を再発明することも原理を理解するために必要ではある）
- 素直に人の力を借りる。
（注意） pyenv-virtualenv と virtualenv は別のプロダクトです

[pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv) と [virtualenv](https://github.com/pypa/virtualenv) を混同している記事をたまに見かけるので、注意喚起です。

## 概要

[pyenv](https://github.com/pyenv/pyenv) とともに仮想環境を使いたいとき、 pyenv のプラグインである pyenv-virtualenv を使うことがあります。
この pyenv-virtualenv は、 virtualenv とは別のものです。

両者を混同している記事がQiita にもありますが、
以下を見るとわかるように、それぞれ別プロダクトです。ご注意を。


## pyenv-virtualenv 

[pyenv](https://github.com/pyenv/pyenv) のプラグインで、 `pyenv virtualenv` コマンドを使えるようにするもの。

#### 公式サイト
https://github.com/pyenv/pyenv-virtualenv

#### 使用例

新しい仮想環境を作るには、
`$ pyenv virtualenv {pythonバージョン} {仮想環境のディレクトリ}`
を実行します。

例：
`$ pyenv virtualenv 2.7.10 my-virtual-env-2.7.10`
(公式サイトより)

#### 補足

内部的には virtualenv を呼び出しているようです。
（はっきりとは書いていませんが）公式ページに以下のようにあります。

>`pyenv-virtualenv` uses `python -m venv` if it is available and the `virtualenv`
command is not available.

(`venv` は virtualenv が Python 公式に取り入れられたものです (Python 3.3 以降で使用可能))

## virtualenv 

#### 公式サイト
https://github.com/pypa/virtualenv
https://virtualenv.pypa.io/en/stable/

#### 使用例
新しい仮想環境を作るには、
`$ virtualenv {仮想環境ディレクトリ名}`
を実行します。
例：
`$ virtualenv my-virtual-env`

なお `-p` オプションによって、特定の Python インタープリタを指定することもできます。


## 補足 その1

実際のところは、まず「そもそも自分の用途に pyenv は必要なのか？」と考える必要があります。
virtualenv でも、 Python の処理系のバージョンをざっくり指定できますので。

[pyenvが必要かどうかフローチャート - Qiita](https://qiita.com/shibukawa/items/0daab479a2fd2cb8a0e7)

## 補足 その2

[pyenv-virtualenvwrapper](https://github.com/pyenv/pyenv-virtualenvwrapper) と [virtualenvwrapper](https://pypi.python.org/pypi/virtualenvwrapper) もまた、それぞれ別のプロダクトです。
SQLPLUSの実行結果をCSVに出力したい(※可変長は可変長で)

#SQLPLUSの実行結果をCSVに出力したい

業務で最近使うことになったのでメモ

＜やりたいこと＞
DOSバッチからSQLPLUSで以下のSQLファイルを実行し、
実行結果をCSVに出力する。
その際、可変長項目が固定長として出力されてしまうので以下のような記![undefined]()
述にする必要がある。


| オプション | 内容 |
|:-----------|:------------|
| echo off   |        コンソールメッセージを非表示 |
| linesize   |      1行のサイズを決める |
| pagesize   |    指定した行数毎にセパレーターが入る |
| feedback off   |    「X行が選択されました」を非表示 |

```言語:test.sql
set echo off
set linesize 1000
set pagesize 0
set feedback off
spool 'c:\tmp.csv'

SELECT EMP_NAME ||','|| 
       ADDRESS1 ||','|| 
       ADDRESS2 ||','|| 
       ADDRESS3 
FROM EMP;

spool off
exit;
```



![undefined]()

これでうまくいった

ポイントはSELECT項目の横に「<font color="Red">|| ',' ||</font>」をつけるだけ

が、欲を言えば、上記SELECT項目に列名(AS "")を付けて出力したい。。
色々試してはみたが上手くいかずお手上げー

以上！

ちなみに呼出側のバッチは以下

```dos:test.bat
echo off

rem **********************
rem 初期化処理
rem **********************

SET BASEDIR=%~dp0
SET LOG=%BASEDIR%log\%date:~0,4%%date:~5,2%%date:~8,2%_test.log
SET LISTFILE=%BASEDIR%%date:~0,4%%date:~5,2%%date:~8,2%_resultCsvFile.csv
SET SQLFILE=%BASEDIR%sql\test.sql
SET UID=*****
SET PASS=*****
SET SID=*****

rem **********************
rem ログ初期処理
rem **********************
ECHO バッチ処理を開始します >> %LOG%
ECHO 開始時刻：%DATE%%TIME% >> %LOG%

Rem SQL実行
echo /* 接続情報 */ >> %LOG%
echo %UID%/%PASS%@%SID% >> %LOG%
sqlplus -s %UID%/%PASS%@%SID% @%SQLFILE% %LISTFILE%

Rem SQL実行結果判定
IF %ERRORLEVEL% NEQ 0 GOTO ERROR

REM 正常終了
goto NORMAL

Rem **********************
Rem 正常終了
Rem **********************
:NORMAL
ECHO バッチを正常終了します >> %LOG%
ECHO 終了時刻：%DATE%%TIME% >> %LOG%
ECHO エラーコード：%ERRORLEVEL% >> %LOG%
EXIT /B

Rem **********************
Rem 異常終了
Rem **********************
:ERROR
ECHO バッチを異常終了します >> %LOG%
ECHO 終了時刻：%DATE%%TIME% >> %LOG%
ECHO エラーコード：%ERRORLEVEL% >> %LOG%
EXIT /B

echo on
```

おーわり
COUNTIF/VLOOKUPの検索値をセル参照 かつ 【含む】で指定したい場合（あいまい検索）

#1. あいまい検索の基本
※基本的な関数の使い方についてはここでは触れない。
よく忘れるし現場の人も知らない方多いので書いとく。

=COUNTIF(範囲, 検索条件)をベースに説明する。

| No. |あいまい検索内容| 使用例 |意味|
|:-----------|:-----------|:------------|:------------|
| １ | ～で始まる|=COUNTIF(A2:A8,"めたるぎあ*")|  「めたるぎあ」で始まるセルの個数を取得|
| ２ | ～で終わる|=COUNTIF(A2:A8, "\*めたるぎあ")| 「めたるぎあ」で終わるセルの個数を取得|
| ３ | ～を含む|=COUNTIF(A2:A8, "\*めたるぎあ\*")| 「めたるぎあ」を含むセルの個数を取得|
    
#2.【本題】検索値をセル参照で行う場合
| No. |あいまい検索内容| 使用例 |意味|
|:-----------|:-----------|:------------|:------------|
| １ | ～で始まる|=COUNTIF(A2:A8,B2&"\*")|  「B2」で始まるセルの個数を取得|
| ２ | ～で終わる|=COUNTIF(A2:A8, "\*"&B2)| 「B2」で終わるセルの個数を取得|
| ３ | ～を含む|=COUNTIF(A2:A8, "\*"&B2&"\*")| 「B2」を含むセルの個数を取得|

##■結果
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/208356/2513081b-da8c-8666-a9bd-a9931b904f2d.jpeg)

##No.1

| No. |あいまい検索内容| 使用例 |意味|
|:-----------|:-----------|:------------|:------------|
| １ | ～で始まる|=COUNTIF(A2:A8,B2&"*")|  「B2」で始まるセルの個数を取得|

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/208356/48747da9-e15f-b677-96c5-323ac88f77ab.jpeg)

##No.2

| No. |あいまい検索内容| 使用例 |意味|
|:-----------|:-----------|:------------|:------------|
| ２ | ～で終わる|=COUNTIF(A2:A8, "*"&B2)| 「B2」で終わるセルの個数を取得|

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/208356/6cb59830-3bf7-e32a-e072-3794d97d056f.jpeg)

##No.3

| No. |あいまい検索内容| 使用例 |意味|
|:-----------|:-----------|:------------|:------------|
| ３ | ～を含む|=COUNTIF(A2:A8, "\*"&B2&"\*")| 「B2」を含むセルの個数を取得|

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/208356/28fd6d2b-7a83-dcc4-6bad-c743352d117f.jpeg)

おーわり

あ、VLOOKUPでも同じ(笑)　書くの忘れてた

PS.Googleアカウントでのログインが何故かできないのでアカウント作り直した
トップページでヘッダー(共通部分)を表示しないようにする

こんにちは😁

ヘッダーやフッターのないトップページからログインし、ヘッダーやフッターのある管理画面へ遷移するようなサイトを作る際に、レイアウトにapplication.html.erbを使わずにトップページを作りたいと思ったので書いておきます。

# layouts/application.html.erb

まず、application.html.erbはこんな感じです。

```erb:application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>Title</title>
    <%= csrf_meta_tags %>

    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

    <%= render 'shared/head' %>
  </head>

  <body>
  	<div id="wrapper">
  		<%= render 'shared/header' %>
  		<%= render 'shared/left_sidebar' %>
  		<div class="content-page">
  			<!-- Start content -->
        <div class="content">
          <%= yield %>
        </div>
  		</div>
  		<%= render 'shared/right_sidebar' %>
  		<footer class="footer">
  		</footer>
  	</div>
  </body>
</html>
```

# layouts/index.html.erbを作成

viewsのlayoutsフォルダに、index.html.erbを作成します。
このファイルは、トップページのapplication.html.erb的な扱いになります。

```
<!DOCTYPE html>
<html>
  <head>
    <title>Title</title>
    <%= csrf_meta_tags %>

    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

    <%= render 'shared/head' %>
  </head>

  <body>
  	<div id="wrapper">
      <%= yield %>
    </div>
  </body>
</html>
```

# ビューにtopsフォルダを作成

viewsにtopsフォルダを作成して、中にindex.html.erbを作成します。
このindex.html.erbが、layouts/index.html.erbのyield部分になります。

# Topsコントローラを作成する

手動でtops_controller.rbを作成します。
中身は下記のような感じで、indexメソッドを作成して、layoutを定義して半角スペースの後にはレイアウトに指定するビューの名前を入れます。(今回の場合はlayouts/index.html.erb)
layoutを定義することで、application.html.erb以外のレイアウトを使うことができるようになります。

```ruby:tops_controller.rb
class TopsController < ApplicationController
  layout 'index'
  
  def index
  end
end
```

# ルートページに指定する

```ruby:routes.rb
Rails.application.routes.draw do
  root 'tops#index'
end
```

# 完成！

これでレイアウトにlayouts/index.html.erbを指定したので、トップページにヘッダーやフッターがなくなったと思います😁