OmniAICreator/Qiita-1.07M huggingface dataset:
Cognos Analyticsでデータモジュールをソースにしたレポートで選択と検索のプロンプトを使用する方法

#はじめに
Cognosレポート開発時に使用できるプロンプトは豊富にありますが、今回取り上げるのは選択と検索のプロンプトです。ユーザが任意の文字で絞り込み項目を検索でき非常に使い勝手の良いプロンプトです。
ただ、データモジュールをソースとして選択したレポートでは下記のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/7918e65e-c8cc-d57c-e1ee-835e282274ff.png)


本来、プロンプトタブにあるはずの、選択と検索のプロンプトが消えてしまっています。

このままでは、レポートに選択と検索のプロンプトを追加することができません。
今回は2つの方法で、データモジュールをソースにしたレポートで選択と検索のプロンプトを使用する方法をご紹介します。

#１．事前に配置

その名の通り、ソースを選択する前に検索と選択のプロンプトをレポート上に配置してしまうというものです。
新規レポート作成時のソース選択前はもちろんプロンプトタブに表示されますので、事前に選択と検索のプロンプトをレポート上に配置していまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/caf31590-5176-24cd-77d7-c77a8d1631aa.png)

その後、ソースとしてデータモジュールを選択します。
このタイミングでプロンプトの一覧から表示は消えてしまいますが、レポート上に配置してオブジェクトはそのまま使用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/d2b12d3b-a32b-0d6d-0397-f1bd5a9d01c8.png)




#２．コピーで貼り付け

１．の方法を紹介されてもすでにレポートを作成しており、今さら新規に開発できないよといった場合での方法です。
それは別のレポート定義から選択と検索のプロンプトをコピーして持ってくるという方法です。

既存のレポートとは別に新規レポートを作成し選択と検索のプロンプトをレポート上に配置します。
配置したプロンプトを選択し、Ctrl+C コマンドでプロンプトのオブジェクトをクリップボードにコピーします。
※「１個の資産がコピーされました」のメッセージが表示されることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/c3727ee6-04cb-c57d-029d-5df3682b01c1.png)

次に、クリップボードにコピーされたプロンプトを、プロンプトを配置したいレポートに貼り付けます。
プロンプトを配置したい場所を選択し、Ctrl+V コマンドで貼り付けを実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/371729a7-12da-7970-3a7f-0ad23bcb24a7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/a086cd14-6c74-f5dd-dfa4-aa9881bafe93.png)

これで、作成途中のレポート上に選択と検索のプロンプトを配置することができました。

##コピーするのはクエリー情報などの設定がない空のプロンプトかソースが同じものを
レポートの新規作成をせず、すでに選択と検索のプロンプトを使用しているレポートからオブジェクトをコピーすることもあるかと思いますが、その場合は、ソースが同じデータモジュールを使用しているレポート間でのコピーが必要となります。コピー元のプロンプトにクエリーの設定がある場合、コピー元とコピー先でソースが違うとエラーメッセージが表示され貼り付けが実施できません。

そういった意味でも新規作成し真っ新なプロンプト情報のみをコピーすることをオススメします。

#最後に
レポート上に配置されたプロンプトは、使用するクエリーや使用する値、パラメータ名などを整えることで問題なく使用することができそうに見えます。ただ、データモジュールをソースとして際はプロンプトの一覧から消えていることを考えるとサポートしないつもりなのかもしれません。
使用する際は十分なテストを実施し使用することをオススメします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/a13f035c-bc99-11bc-438a-2f6986be6385.png)

一覧から表示が消えて選択と検索のプロンプトの使用を諦めていた方の力になればと思います。
RamboxにFacebookを追加&未読件数表示する

仕事等で使うWebサービスが増えてくると便利なのが[Franz](https://meetfranz.com/)、[Rambox](https://rambox.pro/#home)、[Station](https://getstation.com/)といった、1ウィンドウ内でチャットやメールをそれぞれタブ表示してくれるアプリケーション。比較は[検索すれば記事がたくさん出てくる](https://www.google.co.jp/search?hl=ja&q=Rambox+Franz+Station&lr=lang_ja)のでそちらに任せるけど、その中で僕はいまのところRamboxに落ち着いている。

Ramboxで気に入っているのはカスタムサービスを登録しやすいところだ。Facebookを例に紹介したい。

# カスタムサービスの登録

Ramboxの管理画面の「Add a new Service」で `_Custom Service` を選択すると、Ramboxがサポートしていないサイトでも登録できる。検索してもいいのだけど、実は「Messaging」と「Email」のチェックを両方外すと `_Custom Service` だけが残って簡単に選べる。

カスタムサービスでは、以下を入力すればいい。

* `Name` にサービス名などを入力する。ここは任意の内容でいい。
* `URL` に表示したいWebページのURLを入力する。Facebookなら `https://facebook.com/`など。
* `Logo` にその差異とのアイコンのURLを入力する。

この中では `Logo` が曲者。もしHTMLの知識がなければ、URLの最初の `/` までを抜き出して、その後ろに `favicon.ico` をつなげたものを試してみるといいと思う。Facebookならこうなる。

```
https://facebook.com/favicon.ico
```

HTMLの知識があれば、Webページのソースを見て、アイコン指定に使われている `<link rel="shortcut icon" href-"...">` タグを探し、 `href` のURLを指定する。Facebookで確認すると、次のタグが見つかった。

```
<link rel="shortcut icon" href="https://static.xx.fbcdn.net/rsrc.php/yo/r/iRmz9lCMBD2.ico">
```

この場合 `https://static.xx.fbcdn.net/rsrc.php/yo/r/iRmz9lCMBD2.ico` を指定する。

余談だけど理屈も書いておくと、昔からのサイトアイコン（favicon）の仕様として、トップディレクトリに `favicon.ico` ファイルがあれば特に指定がなくてもサイトアイコンとして使われることになっている。最初の方法はこれを決め打ちで試してみている。ただ、いまどきは `<link rel=...>` タグでアイコンを明示的に指定しているサイトも多い。両方用意されている場合でも、こちらで指定されている画像の方が解像度が高かったりサイト全体ではなくページごとに細かく設定されたものになっていることがある。だから知識があるなら、こちらを試してみた方がいい。

# カスタムサービスに未読件数を表示

カスタムサービスの設定画面で、下部の `Advanced` というところを開くと `Custom Code` というテキストボックスが出てくる。

ここに `document.title` 要素の先頭に未読件数を追加するJavaScriptコードを登録すると、タブのアイコンに未読件数バッジが表示されるようになる。例えばタイトルの先頭に `(2)` などの数字を入れるとこの数字 `2` が未読件数としてバッジ表示される。

コードのサンプルは「[Add a Custom Service · ramboxapp/community-edition Wiki](https://github.com/ramboxapp/community-edition/wiki/Add-a-Custom-Service)」にある。これをFacebookように書きかえたのが、以下のコードだ。

```
function checkUnread() {
    var e = document.getElementById("notificationsCountValue");
    var t = parseInt(e.innerHTML.trim());
    updateBadge(t);
}

function updateBadge(e) {
    e >= 1 ? document.title = "(" + e + ") " + originalTitle : document.title = originalTitle
}
var originalTitle = document.title;
setInterval(checkUnread, 3000);
```

以下のスクリーンショットは登録した `Custome Code` を表示したところだが、登録時の画面もこれと変わらない。左上部では、すでにFacebookアイコンに未読件数がバッジ表示されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55718/079aac77-2134-7d11-6a22-5230d732e456.png)

ちなみに上記コードを参考ページに書かれている通り[JSCompress](https://jscompress.com/)で最小化したのがこちら。これをCustom Codeに登録してもよい。

````
function checkUnread(){var e=document.getElementById("notificationsCountValue");updateBadge(parseInt(e.innerHTML.trim()))}function updateBadge(e){document.title=1<=e?"("+e+") "+originalTitle:originalTitle}var originalTitle=document.title;setInterval(checkUnread,3e3);
```

# 参考

* [Add a Custom Service · ramboxapp/community-edition Wiki](https://github.com/ramboxapp/community-edition/wiki/Add-a-Custom-Service)
* [Rambox のタブに Backlog を追加して、未読数を表示する - Qiita](https://qiita.com/matsuoshi/items/45bc3f177b87272fe7a8)
Docker環境構築するときに(きっと)便利なコマンドたち

この2日ほど、Dockerで色々試行錯誤してたときに便利だったコマンドたちです。

## &lt;none&gt;でできたイメージを一括削除

何も考えずに作っているとVMの容量が100%になっちゃうときがあります(ありました)。
`docker image prune`でキレイにできます。こちらは`images`ではなく`image`のようです。

```bash：commandline
$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:18abcdefghijklmnopqrstuvwxyz19abcdefghijklmnopqrstuvwxyz20abcdef
deleted: sha256:21abcdefghijklmnopqrstuvwxyz22abcdefghijklmnopqrstuvwxyz23abcdef
.
.
.

Total reclaimed space: 5.344GB
```
最後に空いた容量をドヤ顔で教えてくれます。

## --rmオプションで終了時にコンテナ削除

基本ですが一応……
`--rm`オプションをつけると、コンテナを終了させたときにコンテナ自体も削除してくれます。
検証してるときは何度も同じコンテナ名で起動/終了をさせると思うので必須です。
ちなみに`-d`オプション(バックグラウンド起動)のときにも有効です。昔はできなかった気がするなぁと思って調べたらどっかのバージョンからできるようになったんですね。

```bash:commandline
$ docker run --rm -it jupyter/notebook:latest bash
``` 


## ENTRYPOINTを無効にして起動

DockerfileにENTRYPOINTを指定して、`docker run`時に何かしらを一緒に起動することができますが、環境構築時はシェルを起動していろいろと検証を行いたいときがあるとおもいます。いちいちDockerfileをいじらなくても、起動時に無効にすることが可能です。

```bash:commandline
$ docker run --entrypoint '' --rm -it jupyter/notebook:latest bash
``` 
`--entrypoint ''`と明示的に空にすることで無効にできるようです。

## 起動しているコンテナからイメージ作成

あるコンテナで作業したのをイメージとして残しときたい、とか思ったときに便利なのがcommitです。

```
$ docker commit 33aabcdefg33 test-docker-commit-image
sha256:24abcdefghijklmnopqrstuvwxyz25abcdefghijklmnopqrstuvwxyz26abcdef
$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
test-docker-commit-image   latest              f2abcdefg1f        7 seconds ago       4.81GB
```
`docker commit <コンテナID> <作成するイメージ名>`で指定します。
当然ですが、Dockerfileから作っているわけではないので再現性がありません。


## イメージからDockerfile作成

そんな感じでコンテナから残したイメージをDockerfile化したい、といったとき。
そのものずばりなコマンドはないのですが、historyである程度どういう作業をしたかが把握できます。ここからDockerfileに反映していくといいかなと思います。

```
$ docker history test-docker-commit-image:latest
IMAGE               CREATED              CREATED BY                                      SIZE                COMMENT
af14d0dd9f68        About a minute ago                                                   19.9MB              
b4abcdefgh51        6 hours ago          /bin/sh -c #(nop)  ENTRYPOINT ["/bin/sh" "...   0B                  
70abcdefgh99        6 hours ago          /bin/sh -c #(nop)  EXPOSE 8888/tcp              0B                  
26abcdefghe5        6 hours ago          /bin/sh -c #(nop) WORKDIR /notebook             0B                  
a6abcdefghaa        6 hours ago          /bin/sh -c #(nop)  VOLUME [/notebook]           0B     
```
`--no-trunc`オプションをつけると`CREATED BY`の部分が省略されずに表示されます。
ただ……試した環境が悪かったのか、手動で`apt-get update`や`apt-get install`したのが表示されずあれ？となってます。ちょっと検証が必要ですがこういうコマンドもあるんだということで。

昔、太古のバイナリファイルしかない環境で、gdbとかnmとかobjdumpを駆使して泣きそうになりながらソースに反映したのを思い出しました……。


## 参考文献

https://qiita.com/DQNEO/items/e3a03a14beb616630032
https://qiita.com/nju33/items/733e16511f3b8e739d54
#VsCode でカーソル行を下にコピーするショートカットは Shift+Alt+Down or Shift+Option+Down


[【Windows版】VS Code キーボードショートカット一覧 （オススメ付き） - Qiita](https://qiita.com/TakahiRoyte/items/cdab6fca64da386a690b)

>Shift+Alt+Down | カーソル行を下にコピー | editor.action.copyLinesDownAction | ★
>Shift+Alt+Up | カーソル行を上にコピー | editor.action.copyLinesUpAction | ★



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2769








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Rails Guide】まとめ

# 6. 2番めのモデルを追加する

```ruby:app/models/comment.rb
class Comment < ApplicationRecord
  belongs_to :article
end
```

referencesキーワードは、モデルの特殊なデータ型を表す。
指定されたモデル名の後ろに_idを追加した名前を持つ新しいカラムをデーターベーステーブルに作成

```ruby:db/schema.rb
class CreateComments <  ActiveRecord::Migration[6.0]
def change
  create_table :comments do |t|
    t.string :commenter
    t.text   :body
    t.references :article, null: false, foreign_key: true
    t.timestamps
  end
end
end 
```
t.references はarticle_idという名前のinteger型のカラムとインデックスとarticlesのidカラムを指す外部キー制約を設定する


`dependent: :destroy` 
削除のオプション
FizzBuzz問題やってみた

Qiitaでの初めての投稿となります。

## はじめに

面接を受けたとき、
FizzBuzz問題をホワイトボードに書かされたのですが、
私としてはイマイチな結果となってしまった為、
戒めの意味を込めつつ、FizzBuzz問題を復習しようと思いました。
筆者は javascript メインに触っているので javascript で問題を解いていきます。

## FizzBuzz問題

1～100までを順に出力して、出力する数字が

3で割り切れる場合は「**Fizz**」
5で割り切れる場合は「**Buzz**」
両者で割り切れる場合は「**Fizz Buzz**」

と数字の代わりに出力する

参考元：[Fizz Buzz (Wikipedia)](https://ja.wikipedia.org/wiki/Fizz_Buzz)

## やってみる

```javascript

const num = 100;

for (let i = 1; i <= num; i++) {
  if(i % 3 === 0 && i % 5 === 0) {
    console.log('FizzBuzz');
  } else if(i % 3 === 0) {
    console.log('Fizz');
  } else if(i % 5 === 0) {
    console.log('Buzz');
  } else {
    console.log(i);
  }
}
```

### 結果

```
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz
Fizz 22 23 Fizz Buz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz
41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 
FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 
79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 
Fizz Buzz
```

## ルールの追加①

**console.log** を一度だけしか使わない。

```javascript

const num = 100;

for (let i = 1; i <= num; i++) {
  let printWard = i;
  if(i % 3 === 0 && i % 5 === 0) {
    printWard = 'FizzBuzz';
  } else if(i % 3 === 0) {
    printWard = 'Fizz';
  } else if(i % 5 === 0) {
    printWard = 'Buzz';
  } 
  console.log(printWard);
}
```

コレはまだ簡単だった

## ルールの追加②

if文を**三項演算子**で記述

```javascript

const num = 100;

for (let i = 1; i <= num; i++) {
  console.log(i % 3 === 0 ? (i % 5 === 0 ? 'FizzBuzz' : 'Fizz') : (i % 5 === 0 ? 'Buzz' : i));
}
```
直ぐには出来なかったのですが
時間をかけつつ、なんとか出来ました。

### ルールの追加②修正

```javascript
const num = 100;

for (let i = 0; ++i <= num;) {
  console.log(
    (i % 3 === 0 ? '' : 'Fizz'
    + i % 5 === 0 ? '' : 'Buzz')
    || i);
}
```

シンプルに短く掛けた気がする。
個人的にはとても満足


## 最後

僕みたいに、
プログラミング問題は知っているが、やったことが無いって方はいるのではないでしょうか？
いざやってみると同じ問題でも、
テクニカルに書いたり、分かりやすく書いてみたりと
様々な解き方ができますし、
実際、面接の場で書いてたのにも関わらず楽しくなって書いてしまってました。

あと、ホワイトボードにプログラム書いたのはいいのですが、
手がめっちゃ汚れるので、ウェットティッシュください。
QualityForward APIとNode.jsライブラリを使って一日の作業件数を集計する

[QualityForward](http://bit.ly/2T9OPbp)はクラウドベースのテスト管理サービスです。Web APIを提供しています。そのWeb APIを使いやすくするため、[Node.jsライブラリも開発中](https://github.com/goofmint/qualityforward-node)です。

今回はそのNode.jsライブラリを使って、一日の作業件数を集計してみます。

## 準備

まずはライブラリを読み込みます。APIキーは.envファイルに書き出しています。

```js
import * as dotenv from 'dotenv';
dotenv.config();

import { QualityForward} from 'qualityforward-node';
```

## 必要な変数の準備

まず今日の作業分を集計するので、必要な変数と当てはまるテストケースを格納する変数を用意します。

```js
(async () => {
  const toDay = new Date;
  let result = [];
  // 後の処理もこの中に記述
})();
```

QualityForwardオブジェクトの初期化をします。

```js
const client = new QualityForward(process.env.API_KEY);
```

## テストフェーズの取得

最初にテストフェーズをすべて取得します。

```js
const testPhases = await client.getTestPhases();
```

次にすべてのテストフェーズについて、テストケースを取得します。

```js
for (const testPhase of testPhases) {
  for (const testSuiteAssignment of testPhase.test_suite_assignments) {
    const testCycles = await testSuiteAssignment.getTestCycles();
    // : 次の処理はこの中に記述
  }
}
```

## テスト結果の取得

すべてのテストサイクルについて、テスト結果を取得します。テスト結果の中で本日作業分をフィルタリングします。

```js
for (const testCycle of testCycles) {
  const testResults = await testCycle.getTestResults();
  const ary = testResults.filter(t => {
    if (t.executed_at.getFullYear() === toDay.getFullYear() &&
        t.executed_at.getMonth() === toDay.getMonth() &&
        t.executed_at.getDate() === toDay.getDate()) {
      return t;
    }
  });
  Array.prototype.push.apply(result, ary);
}
```

## テスト結果ごとにグルーピングする

TestResultが取得できたら、例えばテスト結果ごとにグルーピングしてみます。

```js
const group = {};
for (let testResult of result) {
  if (!group[testResult.result]) group[testResult.result] = 0;
  group[testResult.result]++;
}
console.log(`本日の作業結果`);
for (let result in group) {
  console.log(`  ${result} : ${group[result]}件`);
}
```

そうすると以下のような出力が得られます。

```
$ npx ts-node test.ts 
本日の作業結果
  pass : 4件
  fail : 1件
  skip : 1件
  cut : 1件
  block : 1件
  qa : 1件
```

作業件数を蓄積していくことで、品質の可視化にも繋がるでしょう。

## まとめ

QualityForwardを使えばExcelなどで行っていた煩雑なテスト管理がクラウドベースでできるようになります。ライブラリを使うことで既存システムとの連携も用意です。ぜひお試しください！

[QualityForward](http://bit.ly/2T9OPbp)
【Docker】GitHubと連携してDockerイメージを自動ビルドする手順

## はじめに
GitHubに`push`したらDockerイメージが自動ビルドできる
`Automated Builds`
を設定したときの手順を備忘録としてまとめました。

【背景】
先日愛用のMacBookが壊れてしまったのですが、一時的に別端末に開発環境を構築するハメになったのですが、Dockerも使っていなかったので**「かなり面倒」**でした。

そのため、**Dockerfileにも保険**をかけておこうと思い導入したのが経緯です。

以下参照した公式サイトです。
[Set up automated builds | Docker Documentation](https://docs.docker.com/docker-hub/builds/)

## この記事が役に立つ方
- DockerとGitHubを使用していて、自動ビルドは導入していない方

## この記事のメリット
- 常に最新のDockerイメージがDockerHubにある状態を維持出来る。

## 環境
- macOS Catalina 10.15.1
- zsh: 5.7.1
- Docker: 19.03.5

## 前提
今回は開発途中からDockerイメージの自動ビルドを行います。

以下２つのアカウントは取得済とします。

- GitHub
- DockerHub

スムーズに設定するためにそれぞれ**事前にログイン**しておきましょう。

## 1.アカウントの連携
[Docker Hub](https://hub.docker.com/)にアクセス。
↓
![スクリーンショット 2019-11-26 11.46.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/4baed1ff-1638-adea-5be7-87bc4431d771.png)
ログイン後、アカウント名をクリックし、**Account Settings**をクリック。
↓
![スクリーンショット 2019-11-26 11.46.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/df79927b-db44-7424-147e-fae5c5d4f681.png)
左側メニューの中から**Linked Accounts**をクリック。
↓
![スクリーンショット 2019-11-26 11.46.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/66cc9ad1-cbec-4d06-a20b-954ef82e415b.png)
**GitHub**側の**Connect**をクリック。
※他にBitbucketも連携可能です。

ログインしていれば出てきた画面で**Authorize docker**をクリックして連携完了。

## 2.リポジトリの連携
次はリポジトリ同士の連携です。

まずはDockerHubのリポジトリを作成します。
![スクリーンショット 2019-11-26 12.05.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/382b1a84-7e01-7bfc-0ac7-758fc512a3cf.png)
①上部メニューの**Repositories**をクリック
②**Create Repository**をクリック

↓
![スクリーンショット 2019-11-26 12.06.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/29194ddf-5d8c-88c2-cb05-838a3e8b63ec.png)
リポジトリ名とDockerイメージの詳細説明を任意で設定し、GitHubアイコンをクリック。
↓
![スクリーンショット 2019-11-26 12.13.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/2c5cad6b-6afc-bb90-6bc8-ee7c3ab9d0d1.png)
どのリポジトリと連携するかをプルダウンメニューから選ぶ。
必要があればどの**Branch**を対象として自動ビルドするかも設定する。（デフォルトはmaster）
↓
リポジトリ同士の連携完了。

## 確認
DockerHubのヘッダーメニューにある**Repositories**
↓
作成したリポジトリ名をクリック
↓
**Builds**タブをクリック
↓
**Automated Builds**にビルドの状況が表示されています。

その他、**Recent Builds**からビルドされた時点それぞれのログ、Dockerfile、READMEがブラウザ上で確認出来るようになっています。便利。


## おわりに
最後まで読んで頂きありがとうございました:smile:

最新のDockerイメージがDockerHubに上がっていれば、端末が壊れたり別端末から作業をするときにも開発環境をすぐ戻せるので安心ですね:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
[Set up automated builds | Docker Documentation](https://docs.docker.com/docker-hub/builds/)
CentOS7でDHCPでIPアドレスを取れていたのに今朝なぜか繋がらなくなった時の解決メモ

お世話になっております。

件名の通り
CentOS7でDHCPでIPアドレスを取れていたのに今朝なぜか繋がらなくなった時の解決メモ
をメモらせて頂きます。

現在
CentOSでのipconfig　ifconfigは……
https://qiita.com/Bopllq0916/items/17a9514dcd2711806479
```
ip a
```
との事……

うーん
1:lo:
2:enp3s0:
3:virbr0：
4:virbr0-nic：
でドレも取れていない希ガス……
ipconfig/renewみたいなのはCentOS7で何だろ？？？
【React】クリックされたボタンのフォーカスを外す

Reactにおいて、ボタンがクリックされた後もフォーカスされるのが嫌だったので外したかった。

```tsx
const Button: React.FC = () => {
  const onClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
    e.currentTarget.blur();
  }
  return (
    <button onClick={onClick}>ボタン</button>
  )
}
```
これでいけた。

```typescript
e.target
```
これにはイベントが **発火した** DOM要素が入っていて、

```typescript
e.currentTarget
```
これにはイベントが **発火された** DOM要素が入ってるらしい。
(参考：[Reactビギナーズガイドをtypescriptで勉強し直してわかったこと③【event.targetの作法】](https://qiita.com/HiroshiAkutsu/items/57de9bf817b656ec62c6))

blurってのはfocusの対義語らしい。
Looker開発者のためのガイドライン

## 注意
1年間のLooker運用経験＆登壇や他企業のユーザーさんとのやりとりを経て、
ちょこちょこ書き直したいポイントが出てきています。時間を見つけてブラッシュアップする予定です。


## この記事について
* Lookerの基本思想と導入した理由をベースに、活用に向けた指針をまとめたものです。
    * 弊社ではこの通りに運用を開始したところです（201911時点）
* Tipsではなく、もう少し原理的なものをまとめたつもりです。
* 目的に応じて、意味が感じられないときには無理に則る必要はありません。

## 命名規則
* measureには、集計関数または一般的な用語を使って名前を付けるようにする。
    * 例: sumはtotal_[field]、countはnum_of_[field]、averageはavg_[field] など。
    * https://discourse.looker.com/t/naming-fields-for-readability/712
* 比率を示すmeasureには"何あたりの"という説明も必要。
    * 例: orders percent (注文の割合) → orders per purchasing customers (購入者顧客当たりの注文数)
* yes/noのどちらが何を示しているものなのかわからなくならないよう、yesnoフィールドには明確に名前を付ける。
    * 例: Returned (返品済み) → Orders Is Returned (返品済みオーダー)
* Lookerではディメンション名の最後に期間を追加するため、ディメンショングループ に「date (日付)」または「time (時刻)」などをつけないようにする。
    * 例: created_date は created_date_dateとなってしまう。
    * これは避けられない場合もあると思う。

## データの持ち方とフィルタリングに関する指針について
*  前提となる考え方としては、**データへのアクセス権限**、**定義変更等による管理コスト**、**ミスリードの回避**の3点が重要です。

## Project/Model/Explore/Viewの構造をどう決めるか
* 考慮すべき事項アレコレ
    * データソース別に参照権限を設定できる
    * ProjectごとにGitのレポジトリが充てられる
    * Projectをまたいだviewの参照はできない（厳密に言うと[できなくはない](https://docs.looker.com/ja/data-modeling/learning-lookml/importing-projects)が、Projectごとにアクセスの権限を分けていることが多いはずなのでイレギュラーという認識）
        * viewの中でmeasureの集計定義を行うため、同一のProject内で完結させないと集計定義の管理コストが増大する
    * Modelをまたいだviewの参照はできる

## viewの定義
* 分析に必要のないfieldはview定義時に削除 or コメントアウトしておく。
* measureの定義時に一時集計を行うため、その他fieldの定義についてもgroup by句になる発想。
* その後切り口としてpivot/filterする可能性のあるfieldについては、group by句のイメージで保持しておく。

* Label/Descriptionはちゃんと書く
    * 文章を書ききる（例：新規有料 → 新規有料ユーザー数）
    * 使い方より成り立ちを書く（例:〇〇の時に使う → 〇〇が△△のユーザーの数）
    * DataDictionaryを使うときにも影響する

## フィルタリングのタイミング指針
*  すべてのユーザーのExploreから除外されている必要があるもの（テストユーザー、内部指示など）は【sql_always_where および sql_always_having】 にてフィルタリング
    * ユーザーが変更できないフィルタ設定。
    * UIには表示されない (生成されたSQLを参照しない限り見ることができない) 
    * SQLで記述、LookMLの代替コードを使用可: ${field_name}
* 常にフィルタリングしたいが、その範囲を変える可能性があるものは 【always_filter】 を使う
    * 定義しておくと、Exploreに自動的に追加される。
    * ユーザーはフィルタの値を変更することはできるが、フィルタ自体を削除することはできない。
    * デフォルト値をLookerのフィルタ式として記述する。
* 負荷が高すぎるクエリを実行しないようにするためには 【conditionally_filter】 を使う
       * 指定された代替フィルタフィールドの少なくとも1つが選択されている場合に削除できる。

## Connection Timezone設定（2020.7.15追記、最初にやっておけばよかった）
これを設定しておかないとDashboard/Look内の相対参照系フィルタ（過去7日間とか）がUTCで計算されてしまう
現在DWH側で持っているTime系カラムの調整を行っている…
* DatabaseTimezone：接続先DWHに合わせる（弊社の場合BigQuery・UTC）
* QueryTimezone：Asia - Tokyo
GitHubにローカルのプロジェクトをpushしてみよう！

# はじめに
ローカル環境で作成したプロジェクトとGitHubにpushする方法です。
なお、GitのインストールとGitHubアカウントの作成はすでに完了している体で進めていきます。やり方がわからないよーという人は別の記事を参照してみてください。
# 1.GitHub上でリポジトリ作成
最初にGitHubにプロジェクトをpushするリポジトリを作成します。
まず、GitHubにアクセスし、画面右上の＋アイコンをクリックします。メニューからNew Repositoryを選択します。
![スクリーンショット 2019-11-26 13.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398489/b5b70ad7-f6df-2f2b-8135-46fda6c45a95.png)

次にリポジトリの情報を追加していきます。リポジトリ名は必須です。必要に応じてDescriptionやlicenseなどを追加しましょう。
![スクリーンショット 2019-11-26 13.11.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398489/21ab8c7e-2114-39cd-87d7-39532b91e017.png)

入力が完了したらCreate Repositoryを選択します。

以下の画面が表示されたらリポジトリの作成が完了しました。
![スクリーンショット 2019-11-26 13.14.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398489/86905b07-de41-4ee2-f71f-9f793bf10075.png)

# 2.ローカルの環境を`git init`する
次にpushしたいファイルのディレクトリに移動し下記コマンドを実行します。

```
$ git init
$ git add .
$ git commit -m ‘First commit.’
```
1つずつ軽い解説をします。

`git init`はリポジトリを新規作成するときに使用するコマンドです。pushしたいプロジェクトのディレクトリまで移動し、`git init`を実行します。

完了したら次に`git add .`を実行します。`git add .`はワーキング・ツリーの中でコンテンツ（ファイルなど）を見つけてインデックスに追加するコマンドです。（ワーキング・ツリーやインデックスの説明はここでは割愛します。気になる人は調べてみてください。）

最後に`git commit -m ‘First commit.’`を実行します。これでコンテンツが先程`git init`で作成したリポジトリに追加されます。`-m`はコミット時のメッセージを記述するオプションです。ここでは最初のコミットなのでFirst commitにしています。

# 3.リモートリポジトリ(GitHub)の登録
先程作成したGitHubのリポジトリを登録します。GitHub上で作成したリポジトリのページにアクセスします。1番上に出ているURLをコピーします。
![スクリーンショット 2019-11-26 13.31.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398489/7e5bb104-bd6a-1cf9-81aa-c46b4123ca4f.png)

pushしたいプロジェクトのディレクトリで

```
$ git remote add origin 上記画面でコピーした内容
```
を実行します。
具体的には

```
$ git remote add origin https://github.com/Shinnopo/NewRepository.git
```
のようになると思います。

これでリモートリポジトリの登録が完了しました。

# 4.GitHubにpush
いよいよGitHubにpushします。
先程と同じディレクトリで

```
$ git push origin master
```
を実行します。

GitHubのリポジトリにアクセスしてファイルが追加されていたら成功です！

なお、すべてのファイルをpushしたいときは

```
$ git push -u origin --all
```
を実行すればOKです。

# まとめ
これでローカル上のプロジェクトをGitHubにpushすることができました。今後はGitHubでバージョン管理しながらプロジェクトの開発ができますね！

# 参考文献
https://blog.urouro.net/entry/2012/12/22/164157
Excel 参照入力、VLOOKUP関数を使わない

# VLOOKUP関数を 使わない Excel 参照入力

できるだけ簡単に参照入力を設定したい。

【設定】参照用データ表の項目名の属性（条件、参照）を選択する。
設定作業は、これで終わり！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/d7479951-6a99-66f0-aba5-471f5000f3e3.png)

［分類］項目を絞り込み条件として、［コード］［品名］［単価］項目を参照する。

たくさんあるデータをどの項目で絞り込んで、どの項目を参照するかを設定する。
項目名の上にある［項目属性］（条件1、参照1など）を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/c5a270a4-8d4d-ea92-25c3-ca5ec3297153.png)


- （条件）・・・・・絞り込む条件項目
- （参照）・・・・・参照画面に表示する項目

###［分類］で、［冷蔵庫］を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/066382cc-7ec8-3444-e1c2-08e3bfd749cc.png)

コード欄には、［冷蔵庫］のリストが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/5acbaef5-19f6-20db-2ab4-eeca58f61c25.png)

###［分類］で、［乾燥機］を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/6f009eb0-2fe9-3bc3-acfb-71585e910e5c.png)

コード欄には、［乾燥機］のリストが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/4575e59e-f02b-576e-8a47-684fac0877d5.png)

###［品名］［単価］は、自動入力される。
［コード］を選択すると、［品名］［単価］は、自動入力される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/467d5c5b-2406-ff6c-900b-cbec1303085c.png)

##データシートをユーザーフォームで編集する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/e958e05d-c8e2-91c0-53b2-f88bfe2b981f.png)


#エクセルカード HARI（ダウンロード）
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/03a71c09-2b92-48bd-9874-541e665b1be4.png)](https://www.excel-access-japan.com/excelcard-hari/)
アカデミックにおけるソフトウェア工学

# ソフトウェア工学と大学

読者の皆様はじめまして．青山研究室 通称 NISEです！
南山大学 理工学部 ソフトウェア工学科 並びに 南山大学大学院 理工学研究科 ソフトウェア工学専攻の学生で構成されている研究室で，ソフトウェア工学の世界でも有名な青山幹雄教授を筆頭とする研究室です．

<img width="535" alt="NISE_Network_Information_and_Software_Engineering_Laboratory__NISEについて_.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123597/40987d11-9c63-7d55-7640-e3612b84ca99.jpeg">

ご興味がある方はこちらから [NISE](http://www.nise.org/jp/index.html)

日本の真ん中にある愛知県名古屋市にある大学に1つです.ちなみに名古屋大学のお隣さんにあります．本当に近いです．学力の差はあるかもしれませんがｗ

この大学では，日本最古のソフトウェア工学を教える学科があります．他にもオペレーションズ・リサーチを教えているシステム数理学科もあり，そのバラエティに富んだ内容を体系的に学ぶことができます．

うちの研究室では，ソフトウェア工学の中でも，機械学習工学や，IoT，グラフモデルといった最新の研究をしている方々が多いです．

ちなみに，例としてあげると，

- [機械学習によるグラフモデル OSS 開発コミュニティ構造の特徴量分析方法の提案と評価](http://www.st.nanzan-u.ac.jp/info/ma-thesis/2018/aoyama/pdf/m17se003.pdf)

- [IoT システムのためのエッジアーキテクチャ設計方法論の提案と評価](http://www.st.nanzan-u.ac.jp/info/ma-thesis/2017/aoyama/pdf/m16se002.pdf)

- [ブロックチェーンに基づく SLA 契約の自動化方法とそのプラットフォームの提案と評価](http://www.st.nanzan-u.ac.jp/info/ma-thesis/2016/se/m15se007.pdf)

などなどあります．

気になる方は，こちら→ [修士論文集](http://www.st.nanzan-u.ac.jp/info/ma-thesis/2016/se/m15se007.pdf)や[卒業論文](http://www.st.nanzan-u.ac.jp/info/gr-thesis/)を参照してください．

ほかにも，研究室では，

- React Nativeを用いたiOS開発
- 焼きそばをつくる学祭
- スマートハウスの模型の展示
- 360度画像を用いたクイズ
- エトセトラエトセトラ

を行っています．

もし，これを読んでいる高校生や，中学生がいたらぜひ，南山大学を志望してみてはいかがでしょうか？？

# アカデミックと現場，（現実）との乖離

もしかすると，皆さんは，こちらの記事を読んだことがある方もいらっしゃると思います！

- [最近のソフトウェア工学に思うこと](http://bonotake.hatenablog.com/entry/2018/09/06/072800)

ココに書いてあることが，すべてではないと自分はおもいます．その思いを自分のブログに綴ったのが，こちらになります．

- [software2 tattsumブログ](https://tattsum.com/2019/11/software2/)

短い文章で，拙い文章でもあるんですが，読んでいただけると幸いです．

現場のソフトウェアエンジニアの人って，ただ，肩書きがソフトウェアエンジニアだけのひとと，ちゃんと他との差別化をするためにどういうソフトウェアを開発しているのかを主張しているエンジニアの人と結構たくさんいるなーとおもいます．

ソフトウェアエンジニアってかなり曖昧で抽象的なんだなと学生の身分でも思わされたりします．

その上で，ソフトウェアの世界に飛び込み，ソフトウェアとななんぞやと考え続ける４〜９年間で沢山の人との交流もありました．

学会に出ている人は結構みんな知り合いが多いです．〇〇大学の何々ですといえば，あーあの教授の...といってもらえるほど比較的狭い世界の中でエコシステムが形成されています．

少ない人の中でもバックグラウンドは様々で，人の人生は10人いたら，１０通りっていうんだなーとしみじみ思うところです．

先日．ある学会に参加したときに，ある方が，

### 参加する人の顔ぶれが変わってないなー．顔ぶれというか，参加した人の所属が変わりないなーと

と言っていたのが，記憶に新しいです．

ソフトウェアを研究している大学は日本を探してもいくらでもでてくるわけではありません．それも，情報工学と位置づけられたり，経済の分野と位置づけられていたりと大学によって，ソフトウェア工学の根付かれ方は様々です．

では，企業はどうでしょうか？
大手と呼ばれるメーカーさんや，通信系の会社さんはもちろん参加せています．でも，その参加している人が替わることはめったになく，同じ人が昔からの付き合いで参加されているなと感じてしまうこともあります．

まあ，感じ方はひとそれぞれなので，ココに書いてあることに共感できる人もいればできないひともいると思います．

でも，少なからず，日本のアカデミックでは，ソフトウェアというのはあまり重要視されていないんじゃないかと危機感を感じてしまいます．
少ない人の同じような価値観を持った人たちがすべてのものやことがソフトウェアに食べられてしまった世の中に対して，日本として，企業として，一個人としてどう行動，生活，貢献していくかを考えるには不十分かなとおもいます．

ソフトウェアがサービスを食べ尽くすいま，時代はまたたく間に変わり，次はAIがそれを喰らい尽くすと言われています．

そんな世の中の変化についていける人材がはたして，この日本の大学という今までの仕組みでたくさん排出されていくのかは，これから社会の基盤を担っていく我々にかかってくると考えています．

時代は若者に厳しいかもしれませんが，時代を創っていく若者になるためにこの研究室はあり続けたいと思っています．
CentOS8でdocker buildのdnf installが失敗する

# CentOS8でdocker buildのdnf installが失敗する
社内VPNでNginxを立てようとしたときの話。
CentOS8とDockerをインストールし、docker buildを行ったところdnf installが上手くいかずハマったのでメモ。

## 環境
* CentOS Linux release 8.0.1905 (Core)
* Docker version 18.06.3-ce, build d7080c1

* SELinux

```
# getenforce
Enforcing
```

* Firewalld

```
# firewall-cmd --list-all
public (active)
target: ACCEPT
icmp-block-inversion: no
interfaces: enp1s0
sources: 192.168.0.0/16
services: cockpit dhcpv6-client http https ssh
ports: 8000/tcp
protocols: 
masquerade: no
forward-ports: 
source-ports: 
icmp-blocks: 
rich rules:
```
# Dockerのサービス変更

```
# vi /usr/lib/systemd/system/docker.service
```

Dockerサービスにて生成されるファイルパスの変更とDNS指定を行いました

```
Environment="DOCKER_OPTS=-g /mnt/HDD/docker/system --dns=8.8.8.8"
ExecStart=/usr/bin/dockerd $DOCKER_OPTS
```

Dockerサービスを再起動

```
# systemctl daemon-reload
# systemctl restart docker
```


## Dockerfile
```
# cat Dockerfile
FROM centos:8 
MAINTAINER name <email>

EXPOSE 80

RUN dnf install -y nginx 
CMD ["nginx", "-g", "daemon off;"]
```

## ビルドしてみた
```
# docker build -t nginx -f Dockerfile .
```

dnf installで失敗する。
AppStreamやBase、Extrasに0MBと表示され、dnf install nginxが失敗しました

## 対策

Dockerfileにpingを書いてみたところ、IPアドレス指定であれば反応があるが、URL指定だと失敗しました。
よって、DNSによる名前解決ができず、dnf installが失敗しているようです。
docker buildで下記のようにホストのネットワークを指定したところ問題なくビルドできました。

```
# docker build -t nginx -f Dockerfile --network host .
```

## さいごに

役に立ちましたら、いいねのクリックをお願いします。
楽天 RMS WEBSERVICEで店舗運営支援サービスの作成

# RMS WEBSERVICEとは？
RMS WEBSERVICEとは、RMS情報にアクセスするAPIのサービス名。

# 店舗運営支援サービスとは？

楽天が提供するWEB APIを使いサービスを提供することができ
店舗はそれを利用することができる。

https://service.rms.rakuten.co.jp/docs/rms/rms.html

# サービスを提供するには？

開発サポートプログラムに参加しなければならない。
ランクが３つ用意されており、今回は月額1万円のMemberランクで参加してみる。

https://service.rms.rakuten.co.jp/vendorInfo


# RMS WEB SERVICE管理画面

製品IDは楽天が設定した値、製品名は契約時に設定した値が表示される。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74913/fd6373c6-c996-3bf2-d941-039c26448774.png" width="80%">

製品IDを押下すると詳細画面に遷移する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74913/2a298827-6b1a-a375-4351-53ed43390eb8.png" width="80%">

+ サービスシークレット
    + APIの認証に必要 
+ ライセンス有効日数
    + 90日毎に開発したサービスのライセンスが切れるので、店舗側は発行済みライセンスを再契約する必要がある。
+ 利用店舗登録
    + 店舗のURLを入力して、利用店舗登録・承認依頼ボタンを押下。
    + 楽天から店舗へAPI利用申請 承認メールが送信される。
    + <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74913/0b728f1f-5262-7e23-eab7-b69309e92852.png" width="80%">


+ 利用店舗一覧
    + ライセンス一覧画面に遷移し、契約済みの店舗一覧が表示される。
    + 各店舗の有効期限と状態が表示される。
    + <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74913/fecb6900-4934-c38b-489b-1f3e68036808.png" width="80%">

+ 利用API編集
    + サービスで使用するAPIを編集することができる。
    + 注意欄に記載があるが、変更すると店舗側にメールが送信される。
    + <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74913/4caed036-4b77-c552-8557-ca81b636b8fb.png" width="80%">


# APIの承認方法

APIの認証に必要な情報は２つ

* 製品詳細情報にあるサービスシークレット
* 各店舗が承認した時に発行されるライセンスキー

>serviceSecretとlicenseKeyをコロン(:)をセパレータとして結合し
Base64エンコードした値を"ESA "と接続したものを認証情報として利用します。
例) serviceSecret=aaa, licenseKey=bbb　の場合、aaa:bbbをBase64エンコードした値(YWFhOmJiYg==)を利用して、以下の情報を認証情報に設定します。
　ESA YWFhOmJiYg==

javaでの実装例
> String authorization = "ESA " + java.util.Base64.getEncoder().encodeToString((serviceSecret + ":" + licenseKey).getBytes());

リクエストヘッダーに承認情報を設定する
> Header[] headers = new Header[]{
          new BasicHeader("Authorization", authorization),
          new BasicHeader("Content-Type", "application/JSON; charset=utf-8")
      };

# 店舗側

+ RMSにログイン
    + 2 各種申請・設定変更メニューから
    + システム開発企業からのAPIアクセス許可設定の設定変更を押下

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74913/6aa6c79a-3c28-f885-4bff-21caf3af74a7.png" width="80%">

ご利用中の製品に表示されているライセンスキーを開発企業に通知する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74913/fcdd918e-0df2-e41e-2b19-e549d3ec7a0f.png" width="80%">
Auto Windows Update 完全自動化


# ストーリー

2019年12月現在、Windows7のサポート終了に向けて動いている今日この頃。
この記事はすぐに必要無くなるでしょう。しかし。
Windows Update って再起動何度もするから面倒なんですよね。
中小企業だとキッティング作業は自前だったりして大変。
Windows10になってからは、[Windows 10 のダウンロード](https://www.microsoft.com/ja-jp/software-download/windows10)から「今すぐアップデート」ボタンを押すと一発で最新になるんです。便利な時代になりました。

# 概要

Powershellを利用して、Windows Updateを自動化する方法には現在２系統存在しているようです。
[MURA](https://github.com/MuraAtVwnet)氏が源流になっているものと、[MichalGajda](https://social.technet.microsoft.com/profile/michalgajda/)氏が源流のものです。
そのうち、MURA氏の方を利用して、自動にこぎつけるまでの部分のスクリプトを書きました。
余裕がある人はMichalGajdaのやり方がベストプラクティスな気がします。
追記：コメント頂いた中からearthdiverさんのものを追記しました。

# 設定補助スクリプト

ユーザーアカウントのパスワードバイパス設定・スタートアップフォルダ・UACの３つが一度に開くスクリプトです。
この記事一番のポイントです。あとは他記事でも取り扱っています。

``` powershell:setuphelper.cmd
netplwiz
start shell:startup
UserAccountControlSettings
```

コマンドラインで統一したかったのですが、再起動が必要になりそうなのでやめました。
[Windows7にて、コマンドラインから「UAC」を無効にする](https://qiita.com/rohinomiya/items/50f2bfaad2c93308abdd)

# スタートアップスクリプト

`%SYSTEMDRIVE%\WindowsUpdate\AutoWindowsUpdate.ps1`と同じフォルダに配置します。

```powershell:%SYSTEMDRIVE%\WindowsUpdate\Launch.cmd
rem
cls
@echo off
powershell -NoLogo -NoProfile -ExecutionPolicy RemoteSigned -File "C:\WindowsUpdate\AutoWindowsUpdate.ps1 Full"
pause
```

このショートカット「Launch.lnk」を事前に作成しておきます。
ショートカットのプロパティ設定で「詳細設定」-「管理者として実行」のチェックを入れておきましょう。
出来たショートカットをスタートアップフォルダとデスクトップにコピーします。

# 使用手引き

1. %SYSTEMDRIVE%\WindowsUpdate\AutoWindowsUpdate.ps1を配置
1. %SYSTEMDRIVE%\WindowsUpdate\Launch.cmdを配置
1. setuphelper.cmdを実行
1. スタートアップとデスクトップにLaunch.lnkを配置
1. UACを無効化
1. パスワードバイパス設定
1. ショートカットから起動

# 系統１

[フルオートでWindows Updateする](https://www.vwnet.jp/Windows/PowerShell/FullAutoWU.htm)

https://github.com/MuraAtVwnet/WindowsUpdate

## 系統１の派生

[Windows Updateを自動で再起動とアップデートを繰り返すバッチファイルを作る](https://qwerty.work/blog/2017/05/windowsupdate-fullauto-script.php)

# 系統２

[Windows Update PowerShell Module](https://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc)

## 系統２の派生

[【Management】Windows Update Powershell Module (1)](https://blogs.technet.microsoft.com/junichia/2013/05/21/managementwindows-update-powershell-module-1/)
[PowerShellによるWindowsUpdateの自動化](https://f-journey.com/it/windowsupdate_by_powershell/)
[PowerShellでWindows Updateを自動化した](https://qiita.com/maitake9116/items/a2b988099a936eb8d1a1)
[WindowsUpdateをPowershellで制御してみた](https://ameblo.jp/mitchell-mafty/entry-11986741488.html)

# 系統３

[Yet Another Windows Update Automation](https://qiita.com/earthdiver1/items/223fc953e1547dfcbb79)

**Excelsior!**
AWSのサブアカウントを作る

今日はAWSのサブアカウント（支払いクレカが一緒の別アカウント）を作る方法をメモります
大した事ではないのだけど
割と「どっからやるんだぁ？これぇ」ってなるので

メモりますよ～メモメモ

# 【マイ組織】にアクセス

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529242/6caa9d3a-9d96-f9be-0554-3285ac578c45.png)

# 【アカウントの追加】を押す

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529242/b1397296-a169-509e-8f38-d24c6d07d86e.png)

# 【アカウントの作成】を押す

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529242/5be0d21b-4ea6-43ef-cc5e-74d8da2b16b6.png)


# 必要事項を記入して【作成】を押す

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529242/fb7600dd-5231-aed2-fdaf-74ae6e864e22.png)

# 作成されるぜ

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529242/90ffc5e7-196b-873d-b8bc-72d979d1f781.png)

# メアド宛に招待メールが来ているので、その中の【Getting Started Resources】を押す

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529242/dc8a7482-75f1-8256-bfa6-4f0ee6882d73.png)

# AWSサイトに飛ぶので【AWSアカウントを作成する】を押す

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529242/5a041ec5-a119-9c0a-00cf-02238df6d5a6.png)

# 【既存のAWSアカウントでログイン】を押す

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529242/ab2350b1-b8c6-14ef-3bac-d8e4229c3f81.png)

# 【ルートアカウント認証情報を使用してログイン】を押す

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529242/c95e2840-802e-4a99-98cd-9754e636f5b5.png)

# さっき設定したメアドを入力して【次へ】を押す

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529242/92bd8472-b130-c843-5ed8-a3c643a5235a.png)

# 【パスワードをお忘れですか？】を押す

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529242/b367426f-cf4e-2da4-1718-a79d4c0711c0.png)

ん？
ここまでパスワード設定するとこあったっけ・・・？

てことで、パスワードリセットを応用しちゃおう

他の正解フローあるんかいな…？
ママエアロ（適当）

# 画像認証コードを入力して【Eメールを送信する】を押す

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529242/b0e0471b-a6cf-71e4-9846-a2aefec4ec17.png)

# パスワードを設定

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529242/943e5106-8620-48e7-e0c7-8046f04a64a8.png)

あとは分かるな？
ってことで

成し遂げたぜ。
agora.io Video SDK for Flutter クイックスタートガイド

#概要
agora.ioにFlutter用のVideoSDKが公開されています。

Flutterは、Google社が開発したAndroid / iOS向けクロスプラットフォームのフレームワークで、
開発言語は「Dart」というオブジェクト指向言語を利用します。

この記事では以下のサンプルのビルドを紹介します。
[サンプル](https://github.com/AgoraIO-Community/Agora-Flutter-Quickstart)



(※ReactNativeとの比較が気になるところですが、agora.ioにReact用のSDKも公開されていますので、ご参考にしてください。→[agora.io クイックスタートガイド React Native用](https://qiita.com/v-cube/items/5d413ccf49089b350ba0))



##ビルド方法

※前準備としてFlutterのインストールと設定までしておいてください。
[Flutter(windowsの場合)](https://flutter.dev/docs/get-started/install/windows)


1.[サンプルプロジェクト](https://github.com/AgoraIO-Community/Agora-Flutter-Quickstart)をダウンロード
2.ファイルの展開
3.settings.dartにAPP IDを追記
(/lib/src/utils/settings.dart)

```settings.dart
const APP_ID = "***";
```

4.プロジェクトのルートフォルダへ移動
5.パッケージの追加

```
$ flutter packages get
```

6.実機ビルド

```
$ flutter run
```

##アプリの画面
###入室前
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505696/30d06e60-7744-1a07-2761-73228cb41727.png" width="50%">

###入室後
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505696/2ba6281c-c1bd-0118-1003-e4597878c3e6.jpeg" width="50%">

##関連リンク
・[VideoSDKのFlutter用のプラグインはありますか？](https://vcube-support.zendesk.com/hc/ja/articles/360036536872)
・[Real-Time Messaging SDKのFlutter用のプラグインはありますか？](https://vcube-support.zendesk.com/hc/ja/articles/360038823931)
・[agora.ioサンプルコードのリポジトリはどこにありますか？](https://vcube-support.zendesk.com/hc/ja/articles/360034562711)


#最後に
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=f2c8d2c5ff8740bd0f3f)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=f2c8d2c5ff8740bd0f3f)
Nuxt.js + Heroku で環境変数が通らない時の確認事項

heroku で環境変数がうまく通らなかったことがあったので自分用にメモ。
##1. nuxt.configに正しく env が設定されていますか？

```nuxt.config.js
  env: {
    API_KEY: process.env.API_KEY || '',
    AUTH_DOMAIN: process.env.AUTH_DOMAIN || '',
    DATABASE_URL: process.env.DATABASE_URL || '',
    PROJECT_ID: process.env.PROJECT_ID || '',
    STORAGE_BUCKET: process.env.STORAGE_BUCKET || '',
    MESSAGING_SENDER_ID: process.env.MESSAGING_SENDER_ID || '',
    APP_ID: process.env.APP_ID || '',
  },
```

##2. herokuに正しく環境変数が設定されていますか？
https://dashboard.heroku.com/apps/{app-name}/settings で確認できます。
Firebaseの場合、valueは`'abc'`だと通らないかもです。
`abc`と言う書き方になっているかチェックしましょう。

<img width="1118" alt="スクリーンショット 2019-11-26 12.57.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107167/2c0cb480-274d-0c11-655a-7096b8da3586.png">

##3. herokuの環境変数を設定した後、コンパイルし直しましたか？
webpackなどを使っている場合、herokuで環境変数をセットした後、 **コンパイルし直す**必要があります。再起動ではダメみたいです。
プッシュせずにコンパイルする方法は[いくつかある](https://stackoverflow.com/questions/9713183/recompile-heroku-slug-without-push-or-config-change)ようですが一番簡単なのは空のコミットを作ってプッシュしちゃうのが良いでしょう。

```
git commit --allow-empty -m "empty commit"
git push heroku master
```

---
もし何か間違いあれば教えてください。
【クラウド初心者向け】Amazon Connectの録音確認

# 概要
- 問い合わせフローで「通話記録動作の設定」ボックスを置くことにより自動的に通話を録音する。
- 録音した通話は、通話終了後少し経つと聞けるようになる。

## 使用ユーザー
-  IAMユーザー

## 手順
1. AWSにサインインします。
    1. アカウント、ユーザー名、パスワードを入力してサインインします。  
     [アカウント内（IAM）で作成したユーザーを使用してコンソールにサインインする](https://qiita.com/echolimitless/items/129495c920217916a14f#%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E5%86%85iam%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%81%99%E3%82%8B)

1. 『AWSマネジメントコンソール』画面の右上にある《リージョン名》をクリックし、ドロップダウンます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/02487090-54eb-e851-6d7a-674e88da61c9.png)

1. 『AWSマネジメントコンソール』画面にある「サービスを検索」にConnectと入力し、検索結果から《Amazon Connect》をクリックし、Amazon Connect コンソール[（https://console.aws.amazon.com/connect/）](https://console.aws.amazon.com/connect/)を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/28aff404-d3ae-b201-9ebb-b9839bde6ebf.png)

1. Amazon Connectのインスタンス一覧が表示されるので、該当のインスタンスをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/5846170a-bf01-6560-6687-9f970722c1bb.png)

1. インスタンスの概要が表示されるので《管理者としてログイン》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/46c1f25e-b2e2-65ce-7972-1aa73f8441cb.png)

1. ダッシュボードの左側のメニューから《問い合わせの検索》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/78f05d85-0243-7209-b76d-b263558a9338.png)

1. 「問い合わせの検索」画面が表示されるので以下の項目を設定して《検索》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/600b5651-35ab-8053-c149-0e8baa513ec0.png)
    1. 開始日：音声を確認したい日付
    2. 終了日：音声を確認したい日付
    3. タイムゾーン：Japan または、Asia/Tokyo（タイムゾーンを選択すると検索後に表示される問い合わせ履歴の時間が現地時間に修正されます）

1. 画面を下にスクロールして問い合わせ履歴一覧を表示し、再生ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/7132201a-d27f-1e12-e493-c54735bef0f7.png)
    1. 通話の有無に関係なく着信した履歴が全て表示されます。
    1. その中で通話したものだけ「録音/トランスクリプト」欄に記号が表示されます。

1. 再生画面が表示され音声が再生されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/927e626a-3fd8-04e1-ab80-d25fe0a138ad.png)

# 目次に戻る
- [【クラウド初心者向け】Amazon Connectでコールセンターを作る](https://qiita.com/echolimitless/items/e5044c73656f8ae29f93#%E7%9B%AE%E6%AC%A1)
【クラウド初心者向け】Amazon Connectの着信確認までの振り返り

# 振り返り
- 概念図を見ながら、作成した順序と電話番号やルーティングプロファイルなどの関連を整理します。

## 概念図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/b8d0af1d-c351-0251-ef50-f5abbfe34697.png)
- 赤い線：電話を架けた場合の流れ
- 青い線：関連付け
- 赤い数字：作成順序

## 作成順序
- ①：電話番号の取得
- ②：キューの作成
- ③：ルーティングプロファイルの作成
- ④：ユーザー（エージェント）の作成
- ⑤：問い合わせフローの作成

## 関連付け
- 電話番号から問い合わせフローを指定
    - 電話番号に関連づけられる問い合わせフローは一つのみ
- 問い合わせフロー内で呼び出すキューを指定
    - 問い合わせフロー内で指定により呼び出すキューを変えられる
- ルーティングプロファイルが参加するキューを指定
    - 複数のキューに参加可能
- ユーザー（エージェント）が所属するルーティングプロファイルを指定
    - 一つのルーティングプロファイルにしか所属できない

## まとめ
- 作成順序がわかりづらいのは、関連付けを手戻りなく進めるためこの順番で作成しています。
- キューが間に入る事によって、問い合わせフローとルーティングプロファイルが固定されずに色々と関連づける事ができる。
  （データベースで言う所の多対多の関係をつないでいます）
- 基本はこれだけなので理解できると色々と何をすれば良いかが自然とわかるようになります。

# 目次に戻る
- [【クラウド初心者向け】Amazon Connectでコールセンターを作る](https://qiita.com/echolimitless/items/e5044c73656f8ae29f93#%E7%9B%AE%E6%AC%A1)
iOS 9 の端末でIn-Houseがダウンロードできない時メモ

iOSアプリをInHouseで配布したのでいざiOS9端末で取ろうとしたら
「アプリ名 は現在ダウンロードできません」 のダイアログが出たのでその原因メモ

## 結論
InHouseのipa置き場に置く、plistファイルのbundleIDが実際のものと違っていた

## 原因
ipaのbundleId
```jp.bizen.ios.exemple.app-enterprise```

InHouse plist
```jp.bizen.ios.exemple.app-e```

開発途中でbundleIdの管理方法が変わってしまったため起きた。
Xcodeに繋いでログを見ながらインストールしないと気づかなかったです :weary: 

## Xcode 11 でインストール失敗のログを読む
1. Xcodeに端末を接続
2. 上部 [Window] -> [Devices and Simulators] -> [Open Console]
3. 右上のフィルタに Failed と入れる
4. ダウンロードを開始する

ずらずら出てくるが

```
BundleValidator: Failed bundleIdentifier: jp.bizen.ios.exemple.app-e does not match expected bundleIdentifier: jp.bizen.ios.exemple.app-enterprise

 [ApplicationWorkspace]: Failed to install application: jp.bizen.ios.exemple.app-e; /var/mobile/Media/Downloads/-..../-....; Error Domain=SSErrorDomain Code=143 "(null)"

```

こんな感じで出てきます。
Dropbox API , python3 , cronで自動バックアップ

# python3.6 で dropbox のバックアップ取ろうぜ

参考にしたサイト
https://tech-k-labs.xyz/post/dropbox/

インストールしようぜ


```

pip install dropbox

```





vim dropbox-upload.py


```

import dropbox
TOKEN = "あなたのとーくん"
dbx = dropbox.Dropbox(TOKEN)
print(dbx.users_get_current_account())


```






# 実行

```

python3.6 dropbox-upload.py

```



**ここまでで、dropboxAPIの準備OK**




# ファイルをアップロード

トークン、PATH_LOCAL、PATH_DBX を任意のものに変更。

vim dropbox-upload.py

```

import dropbox

TOKEN = "あなたのとーくん"

dbx = dropbox.Dropbox(TOKEN)


PATH_LOCAL = "/home/hideki/hoge.txt"
PATH_DBX = "/hoge.txt"

with open(PATH_LOCAL, "rb") as f:
    dbx.files_upload(f.read(), PATH_DBX,mode=dropbox.files.WriteMode.overwrite)



```



# python の パスを探す

```

which python3.6

```

/bin/python3.6 ← cronで設定するので、メモっとく。


# cron で動かそう


```

vim cron.txt

```






```

MAILTO=your@your.com
SHELL=/bin/sh
#SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin

*/1 * * * * /bin/python3.6 /home/hideki/dropbox-upload.py


```


```

crontab cron.txt

```


**OK**
【クラウド初心者向け】Amazon Connectのユーザー（エージェント）作成

# 概要
- お客様の電話を受け取って対応する人。
- ソフトフォンを利用してお客様からの電話を受け取ります。
- ユーザー（エージェント）は複数のルーティングプロファイルを割り当てる事ができます。

## 使用ユーザー
-  IAMユーザー

## 手順
1. AWSにサインインします。
    1. アカウント、ユーザー名、パスワードを入力してサインインします。  
     [アカウント内（IAM）で作成したユーザーを使用してコンソールにサインインする](https://qiita.com/echolimitless/items/129495c920217916a14f#%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E5%86%85iam%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%81%99%E3%82%8B)

1. 『AWSマネジメントコンソール』画面の右上にある《リージョン名》をクリックし、ドロップダウンます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/02487090-54eb-e851-6d7a-674e88da61c9.png)

1. 『AWSマネジメントコンソール』画面にある「サービスを検索」にConnectと入力し、検索結果から《Amazon Connect》をクリックし、Amazon Connect コンソール[（https://console.aws.amazon.com/connect/）](https://console.aws.amazon.com/connect/)を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/28aff404-d3ae-b201-9ebb-b9839bde6ebf.png)

1. Amazon Connectのインスタンス一覧が表示されるので、該当のインスタンスをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/5846170a-bf01-6560-6687-9f970722c1bb.png)

1. インスタンスの概要が表示されるので《管理者としてログイン》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/46c1f25e-b2e2-65ce-7972-1aa73f8441cb.png)

1. ダッシュボードの左側のメニューから《ユーザー管理》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/bbdb9ad8-f4b8-54c4-5216-438dad4f8d52.png)

1. 《新しいユーザーの追加》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/47631056-b7e7-b9b1-bc77-785e65e7907d.png)

1. 「作成」が選択されていることを確認し、《次へ》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/8c784420-f86d-b85b-34ef-113959a1cfb5.png)

1. 以下の項目を入力、選択し、《保存》をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/55997a4c-5c0a-de62-3e1d-683c65d2783b.png)
    1. 名：適当な名を入力します。
    1. 姓：適当な姓を入力します。
    1. ログイン名：適当なログイン名を入力します。
    1. パスワード、パスワード確認：適当なパスワードを入力します。
    1. ルーティングプロファイル：[【クラウド初心者向け】Amazon Connectのルーティングプロファイル作成](https://qiita.com/echolimitless/items/329d9af13fc715b58ee7)で作成したキューを選択します。
    1. セキュリティプロファイル：「Agent」を選択します。  
    （セキュリティプロファイルはAmazon Connect内ユーザーの権限設定です。）

1. 登録が完了し、ユーザー（エージェント）が一覧に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/bb2a31b4-2c41-8ac6-d394-8617e28f66b5.png)

# 参考サイト
- [エージェントのセットアップ](https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/connect-agents.html)
- [Amazon Connect のユーザーの管理](https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/manage-users.html)
- [アクセス許可の割り当て: セキュリティプロファイル](https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/connect-security-profiles.html)

# 目次に戻る
- [【クラウド初心者向け】Amazon Connectでコールセンターを作る](https://qiita.com/echolimitless/items/e5044c73656f8ae29f93#%E7%9B%AE%E6%AC%A1)
PyQt5 マルチスレッド　２つのやり方　サブクラス式　moveToThread式

![pyqt5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125746/588168ee-de98-9962-91c4-ebf2caa73041.gif)


```python

import time
 
from PyQt5.QtCore import QObject, pyqtSignal, QThread
 
from PyQt5.QtWidgets import QProgressBar, QApplication, QPushButton, QDialog, QGridLayout
 
 
class TestWorker1(QThread):
    _signal = pyqtSignal(int)
 
    def __init__(self):
        super(TestWorker1, self).__init__()
 
    def run(self):
        for i in range(101):
            print(i)
            self._signal.emit(i)
            time.sleep(0.01)
 
 
class TestWorker2(QObject):
    _signal = pyqtSignal(int)
    finished = pyqtSignal()
 
    def __init__(self):
        super(TestWorker2, self).__init__()
 
    def run(self):
        for i in range(101):
            print(i)
            self._signal.emit(i)
            time.sleep(0.01)
        self.finished.emit()
 
 
class ThreadDialog(QDialog):
    def __init__(self):
        super(ThreadDialog, self).__init__()
 
        self.grid_layout = QGridLayout(self)
        self.progress = QProgressBar(self)
        self.grid_layout.addWidget(self.progress, 0, 0, 1, 2)
        self.pushbutton1 = QPushButton('サブクラス式', self)
        self.grid_layout.addWidget(self.pushbutton1, 1, 0, 1, 1)
        self.pushbutton2 = QPushButton('movetothread式', self)
        self.grid_layout.addWidget(self.pushbutton2, 1, 1, 1, 1)
 
        self.pushbutton1.clicked.connect(self.pushbutton1_clicked)
        self.pushbutton2.clicked.connect(self.pushbutton2_clicked)
 
    def pushbutton1_clicked(self):
        self.test_worker1 = TestWorker1()
        self.test_worker1._signal.connect(self.progress.setValue)
        self.test_worker1.start()
 
    def pushbutton2_clicked(self):
        self.test_worker2 = TestWorker2()
        self.test_thread2 = QThread()
        self.test_worker2.moveToThread(self.test_thread2)
        self.test_worker2._signal.connect(self.progress.setValue)
        self.test_worker2.finished.connect(self.test_worker2_finished)
        self.test_thread2.started.connect(self.test_worker2.run)
        self.test_thread2.start()
 
    def test_worker2_finished(self):
        self.test_thread2.quit()
        self.test_thread2.wait()
 
 
if __name__ == '__main__':
    import sys
 
    app = QApplication(sys.argv)
    thread_dialog = ThreadDialog()
    thread_dialog.show()
    app.exec_()