OmniAICreator/Qiita-1.07M huggingface dataset:
初心者から始めるJava、for文・while文

#はじめに
この記事は備忘録である。
参考書レベルの内容だが、本記事に掲載するコードについては、
**間違えた**ものが中心となる。これは実際にコーディング中に間違えた部分を掲載し、自分で反省するために投稿するという目的によるもの。
また、後日にJavaSilver試験問題の勉強を兼ねて復習するため、深い部分の話はここでは触れない。

##環境
言語：Java11、JDK13.0.2
動作環境：Windows10

#for文
**for文**とは、**条件文**に基づいて、ループから抜けるまで**繰り返し処理を行う**ための、繰り返し処理文のひとつである。回数を指定して繰り返す場合に向いている。

```text:for文の基本形
for (　初期化文　；　条件文　；　更新文　){
　　　　　//繰り返し処理;
}
```
それぞれの役割はこちら。
<ul>
<li>**初期化文**</li>for文内部の繰り返し処理で用いる一時変数を宣言し、その初期化を行う文。カンマ`,`で区切ることで**複数の変数を宣言・初期化**できるが、そのすべてを**同じ変数型**にする必要がある（for文の外部で宣言済みの変数を除く）。
<li>**条件文**</li>**真偽値**を戻す式を用いて、**繰り返し処理を続行する（`true`）**か**for文から抜ける(`false`)**かを判定する文。条件文を複数記述することはできないが、前回扱った**論理積`&&`・論理和`||`**を用いて複合条件を設定することはできる。
<li>**更新文**</li>繰り返し処理を一度終えた後、一時変数の値を変更するときの処理を書く文。初期化文同様、**複数の処理を扱う**ことが出来る。更新文が適用されるか・いつ適用になるか、は特に注意を払う必要がある。
</ul>
for文は入れ子にして記述することができるため、より複雑な繰り返しを行うこともできるが、今回は割愛。
##for文実践

```Java:amount10Years.java

double amount = 100000;

for (int year = 1; year < 10; year++){
  amount *= 1.02;
}
System.out.println("10年後には" + amount + "円になる。");

//何かが足りない……
```
これだと初年度が2年目になってしまい、9回分の複利計算しかできていない。初期値の設定を間違えると回数に響く。

#while文
for文と並び、繰り返し処理を行う文である。想定した条件に達するまでひたすら繰り返す場合に向いているが、for文以上に**無限ループ**を生みやすくなっているので注意が必要。

```text:while文の基本形
while (条件文){
　　　　　//繰り返し処理;
}
```
条件文についてはfor文の説明にあるものを見ていただきたい。

なお別の形として、**do~while文**も存在している。最低1回は繰り返し処理を行うため、必須の処理を含む場合に用いるのがよい。セミコロン`;`の位置にはくれぐれも注意。

```text:do~while文の基本形
do{
　//繰り返し処理;
} while (条件文);
```


##while文実践

```Java:whileAmount150k
double amount = 100000;
int year = 0;

//今度はちゃんと初年度を0にした

while (amount <= 150000) {
    amount *= 1.02;
}
System.out.println(year + "年経てば150000円を超える予定。");

//1年経たずに目標金額に届いただと……
```
こんどは`year++`をwhile文の処理に含めなかったために最終出力がおかしくなってしまった。

#終わりに
すごく便利な文だが、勘違いを残したままだととんでもない結果につながる危険も持っている。金利計算やアルゴリズムなど、絶対に間違えられない領域に使われるためしっかり理解していきたい。
今回の参考に、Javaの資格試験の本を乗せたが、`｛ ｝`（中かっこ）がついてないとか入れ子の構造が深くなっていて理解に時間がかかるとか、`インクリメント`・`デクリメント`が大量に敷き詰められているとか。理解力と集中力の両方が求められるよい問題がそろっている。

#参考
出来るだけ自分で変数や式を書いてコンパイルしているので、完全に引用する場合はその旨記述する。

[やさしいJava 第7版](http://mana.on.coocan.jp/yasaj.html)

[Java SE11 Silver 問題集](https://book.impress.co.jp/books/1118101186)（通称黒本）
Swift iOS13のrootViewControllerの置き換え方（UISceneDelegateの取得）

iOS13からAppDelegateのUIWindowの場所が変更されたそうです
https://stackoverflow.com/questions/56588843/uiapplication-shared-delegate-equivalent-for-scenedelegate-xcode11/60577215#60577215

```swift:swift
// iOS13以降
if #available(iOS 13.0, *) {
    let sceneDelegate = UIApplication.shared.connectedScenes
        .first!.delegate as! SceneDelegate
    sceneDelegate.window!.rootViewController = /* ViewController Instance */

// iOS12以前
} else {
    // UIApplication.shared.keyWindow?.rootViewController
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    appDelegate.window!.rootViewController = /* ViewController Instance */
}
```
Nuxt.jsでcomponentの読み込みを動的に変える方法

Nuxt.jsでcomponentを読み込む時に動的に変えたい時があるかと思います。
（例えば、モーダルウィンドウなどでクリックする場所により、表示するコンポーネントを変えたい場合など）
その場合は、`:is`を使うことで対応可能です。

```vue
<templete>
  <Component :is="componentTitle" />
</templete>

<script>
export default {
  data() {
    return {
      componentTitle: 'componentTitle',
    }
};
</script>

```

あとは、methods等でcomponentTitleの部分を書き換えることで動的に変更することができます。
Windowsじゃなくても.NET Coreのテストカバレッジを出力したい

.NET Core3.1 で開発を進めていたのですが、テストのカバレッジを求められて少し困ったので。
普段は mac 使ってます。

# 環境準備

## プロジェクト初期化

.NET Core3.1 の SDK を利用してテストプロジェクトを作成しておきます。

```
$ dotnet new classlib  -f netcoreapp3.1 -o Example
$ dotnet new xunit -o Example.Tests
```

| Pacakge                   | Version | nuget                                                          |
| ------------------------- | ------- | -------------------------------------------------------------- |
| Microsoft.NET.Test.Sdk    | 16.5.0  | https://www.nuget.org/packages/Microsoft.NET.Test.Sdk/16.5.0   |
| coverlet.collector        | 1.2.0   | https://www.nuget.org/packages/coverlet.collector/             |
| ReportGenerator           | 4.5.0   | https://www.nuget.org/packages/ReportGenerator/                |
| xunit                     | 2.4.0   | https://www.nuget.org/packages/xunit/2.4.0                     |
| xunit.runner.visualstudio | 2.4.0   | https://www.nuget.org/packages/xunit.runner.visualstudio/2.4.0 |

以下のライブラリは追加する必要があります。

```
$ dotnet add package coverlet.collector
$ dotnet add package Microsoft.NET.Test.Sdk -v 16.5.0
$ dotnet add package ReportGenerator
```

## ソース

```Example/Number.cs
namespace Example
{
    public class Number
    {
        public static bool IsEven(int num)
        {
            if (num % 2 == 0)
            {
                return true;
            }
            return false;
        }
    }
}
```

```Example.Tests.NumberTest.cs
using System;
using Xunit;
using Example;
namespace Example.Tests
{
    public class NumberTest
    {
        [Fact]
        public void IsEven_ValuesEqual2_ReturnTrue()
        {
            var actual = Number.IsEven(2);
            Assert.True(actual);
        }
        [Fact]
        public void IsEven_ValuesEqual3_ReturnFalse()
        {
            var actual = Number.IsEven(3);
            Assert.False(actual);
        }
    }
}
```

# 利用方法

## Coverage の出力

```
$ dotnet test --collect:"XPlat Code Coverage"
```

`./TestResults/{hash}/coverage.cobertura.xml`に結果が出力されます。この結果を今回は HTML に変換します。

## HTML の変換

今回はプロジェクトのパッケージとしてインストールしました。この場合は、`.nuget`にある ReportGenerator.dll を指定して実行することになります。

```
$ dotnet ~/.nuget/packages/reportgenerator/4.5.0/tools/netcoreapp3.0/ReportGenerator.dll -reports:./Example.Tests/TestResults/{hash}/coverage.cobertura.xml -targetdir:./Example.Tests/TestResults/out/
```

出力はこんな感じです。

![Coverage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123946/473d9a64-448a-9734-2252-e7c1fdaa23bd.png)

詳細はこんな感じです。

![CoverageNumber.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123946/1168c125-4c2e-cdea-0bee-221db971186c.png)

GitHub にコードがあります。Docker で動くようにしているので簡単に確認できます。気が向いたら見てください 😃

https://github.com/shikazuki/dotnet-core-test-coverage-example
プライベートサブネットの EC2 に SSM で入れない

## 概要

最近 AWS を使ったインフラ構築もするようになりました。ピタゴラスイッチ作ってるみたいで楽しい。
そんな中、VPC のプライベートサブネットに建てた EC2 に SSM Session Manager で入ろうとしたところ入れず困ったので、備忘録としてメモします。

## SSM (Systems Manager) Session Manager とは

[AWS Systems Manager Session Manager \- AWS Systems Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html)

- EC2 に KeyPair を登録したりしなくても EC2 のシェルを叩けて便利。しかも無料。
- `ssm-user` でログインされ、 PW 無しで `sudo` もできる。
- SSM 系のポリシー（詳細忘れました）をアタッチしたロールを、 EC2 のインスタンスプロファイルに割り当てる必要があります。

## やろうとしたこと

タイトルの通りですが、 VPC のプライベートサブネット上に建てた EC2 に Session Manager で入ろうとしたところ、以下のように表示され入ることが出来ませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10092/5a8538b8-8f1a-abdc-46d1-8ef9389577c7.png)

## 原因

Session Manager の要件として、対象の EC2 から 443 ポートへのアウトバウンドアクセスが出来る必要があります。
プライベートサブネットからは基本的に全てのアウトバウンドトラフィックが出ていかないので、これが原因でした。

数日前に別の EC2 を無意識にパブリックサブネットに建てて Session Manager が使えたので、プライベートサブネットでもいけるだろうと思ったところ今回の事象に至りました。

素直に GW サーバーを建てるのが無難そう。

## 参考

- [Systems Manager の前提条件 \- AWS Systems Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-prereqs.html)
- [そのセッションマネージャー、本当に必要？プライベートサブネットのEC2への通信方法を考えてみる ｜ Developers\.IO](https://dev.classmethod.jp/cloud/aws/patterns-about-access-ec2-on-private-subnet/)
ライブラリLightboxをWordpressプラグインにする方法・・テスト

Qiitaで初投稿ですので気になった部分かあればツッコミをお願いいたします(笑)

タイトルの通り「LightboxをWordpressプラグインにする方法」を書いていきます。
わざわざプラグイン化しなくてもいいのですが簡単にテストできるようになるので便利かと思われます。
#LightboxをWordpressプラグインにする方法

おおまかな流れ

- GitHubからダウンロード
- プラグインとして使えるように変更
- 完成・・・

この流れで作成してい行きます。

## まずはファイルのダウンロードから
**Lightbox**
https://lokeshdhakar.com/projects/lightbox2/
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598642/4510320d-7db5-522a-0b4f-ec6b256a3ca9.png)
そしたら解凍してフォルダ名「dist」の中しか使わないので他を削除してフォルダ名「dist」の名前を変更
※今回は自分用なので「light_box」に変更しますｗ

変更したら「light_box」内にphpファイルを作成、とりあえず「lightbox.php」で作成します。
※このファイルはfunction.phpに近いと思って大丈夫かと・・・

##DLとリネーム、作成がおわったら編集開始！
まずプラグインと認識させるために？
一番上に説明等を書きます。


```lightbox.php
/*
Plugin Name: light_box
Plugin URI: 
Description: light_boxを読み込むだけ
Author: 
Version: 0.1
Author URI: 
*/
```

要約すると
Plugin Name: プラグインの名前
Plugin URI: プラグインの説明
Description: プラグインの説明
Version: プラグインのバージョン
Author: プラグイン作者の名前
Author URI: プラグイン作者のURI
License: ライセンス名

こんな感じです。

そしたそのあとに

```lightbox.php
// headに読み込むファイル
function add_head() {
    wp_enqueue_style( 'lightbox-style', plugins_url('light_box') . '/css/lightbox.min.css');
}
add_action( 'wp_enqueue_scripts', 'add_head' );
// /body直前に読み込むファイル
function add_footer() {
    wp_enqueue_script( 'foot-js', plugins_url('light_box') . '/js/lightbox.min.js', array() ,false, true);
}
add_action( 'wp_enqueue_scripts', 'add_footer' );
```

ここまででファイルの編集は一旦終了で圧縮してアップデート→有効化した後に

```wordpress.の投稿ページ等
<a href="画像のURL" data-lightbox="lightbox">imgタグ</a>
```
こんな風に書くだけでこれだけでとりあえず動いてしまいますｗ

ここまででプラグイン自体は動作しますがめんどくさがりの自分は毎回囲うなんてやってられません・・・
手動で囲うのが面倒だから自動で囲ってしまえっ！！

「light_box」内の「lightbox.min.js」を開き最初のコメントアウトの後にJqueryでこちらを追加
※テーマによって編集しないと動きません

```lightbox.min.js
$(function(){
    'use strict';

    //こちらで<article>内の<img>を<a>で囲う
    // articleはテーマによって編集or削除
    $('article img').wrap(`<a href="" data-lightbox="lightbox">`);
 
    //上の<a>がクリックされたらhrefに子要素の<img>のsrcを入れる
    $('[data-lightbox="lightbox"]').on('click', function(){
        var url = $(this).find('img').attr('src');
        $(this).attr('href', url);
    })
});
```
これで自動で画像にlightboxが有効になるはずです。
[iOS13] SceneDelegateでDynamicLinksからのURLをハンドリングする

# 環境
- Xcode 11.3
- Swift 5.1.3
- Firebase 6.16.0
- FirebaseDynamicLinks 4.0.7

# 経緯
「DynamicLinksからアプリを起動した際に、iOS13系でURLをハンドリングできていない」
という問題に最近対応しました。

結局、マルチウィンドウを活用していないことから、SceneDelegateを破棄することで対応しましたが、調べたもの達が可哀想なので供養するために記事にしました。

ちなみにSceneDelegateの破棄対応は３つで完結します。
- `SceneDelegate.swift` を削除
- `info.plist` から `Application Scene Manifest` のkeyを削除
- プロジェクト作成時に`AppDelegate` に自動で組み込まれる `func application(_:configurationForConnecting:options:)` と `func application(_:didDiscardSceneSessions:)` を削除


# 原因
iOS13から `UIApplicationDelegate` の `func application(_:continue:restorationHandler:)` がDynamicLinksから起動した時に呼び出されなくなっていました。
iOS12以前では前述のメソッドで受け取る `userActivity` の `webpageURL` を使って下記のようにできるのですが、

```swift
func application(_ application: UIApplication,
                 continue userActivity: NSUserActivity,
                 restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    print(userActivity.webpageURL!)
}
```

URLは何処へ？:thinking:

# 初期対応
`UISceneDelegate` でUserActivityを受け取れるメソッドがあるだろうと探したら、ちゃんとありました。
 `func scene(_:continue:)` ([公式ドキュメント](https://developer.apple.com/documentation/uikit/uiscenedelegate/3238056-scene))

```swift
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
    print(userActivity.webpageURL!)
}
```

良かった、これで一件落着...





と思いきやです

# 問題
アプリを起動していない時にDyanmicLinksのURLを叩くと先のメソッドが反応しません。
バックグラウンド状態にしておけばちゃんとハンドリングしてくれます。

.....どういうこと:thinking:


# 解決策
同じ悩みを抱えていたこちらの方の記事のおかげで解決しました
[Handling Firebase Dynamic Links in iOS 13 with Scene Delegate](https://prograils.com/posts/firebase-dynamic-links-in-ios13-with-scene-delegate)

>From connectionOptions we need to get the activity.webpageURL object

おぉ...

どうやらSceneDelegateの `func scene(_:willConnectTo:options:)` ([公式ドキュメント](https://developer.apple.com/documentation/uikit/uiscenedelegate/3197914-scene)) に必要な情報が付与されているとのこと。

第3引数に渡されている `UIScene.ConnectionOptions` ([公式ドキュメント](https://developer.apple.com/documentation/uikit/uiscene/connectionoptions))にはUIKitがsceneを生成する際に、生成された際の情報を紐づけてくれているらしく、その中にUserActivityも含まれていました。

以下のようにしてURLを取り出せます

```swift
func scene(_ scene: UIScene,
           willConnectTo session: UISceneSession,
           options connectionOptions: UIScene.ConnectionOptions) {
    // window生成の記述は省略
    guard let userActivity
        = connectionOptions.userActivities
            .first(where: { $0.webpageURL != nil }) else { return }
    print(userActivity.webpageURL!)
}
```


これで本当の一件落着です。


# 余談
iPad(iPadOS)ではSafariを開いた際にUserAgentが変わったことが原因か、
そもそもDynamicLinksが機能しない、みたいな問題もありました。
おそらくリンクのparam設定の問題だったのか、こちらの問題はヌルッと解決しました。
[ダイナミックリンクURLを手動で構築する](https://firebase.google.com/docs/dynamic-links/create-manually?hl=ja)
画像付き:Dockerのインストール手順(Windows OS)

こんにちは、初投稿です。

Dockerって便利ですよね。
簡単に環境構築できて、移管も簡単。

**だがしかし！！！**

**Dockerの環境を作るのは大変だった！！！**


はい。
ということで、今回は私が実際に行ったインストール方法だけでなく、その際に直面した問題についても記載しようと思います。



## インストール手順

まず、インストールしたいPCのOSを調べます。
ここを怠っていたため、私は最初失敗してしまいました。

『Windows10の64bitのインストーラ落とせばいいんでしょ！』

という認識で、Docker for Windowsのインストーラを落としてきて、
環境を構築しようとしていました。

しかし、それは間違っていました。

私の使っていたOSは、
**Windows 10 Home**
であり、Docker for Windowsに必要なHyper-Vというものが入っていなかったのです。。。

そこで、改めて別の方法でインストールを試みました。
手順は以下の通りです。

1. インストールしたい端末のOSを確認(今回はWindows 10 Home)

2. [Docker Toolbox overview](https://docs.docker.com/toolbox/overview/)を開く

3. ページ下方の「Ready to get started?」からWindows OSに関するリンクを開く。
![docker_install_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595799/ca4c578a-0adc-54d8-f99c-3a140d2b9159.png)

4. インストール手順を読み、Step2:Install Docker Toolboxの手順1であるToolbox Releasesから最新のexeファイルをダウンロード(画像の赤枠参照)。少し時間がかかります。
![docker_install_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595799/29c792e8-a3bd-548c-e873-fd2128ba3284.png)
↓↓↓↓↓↓↓↓
![docker_install_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595799/0c8e9f35-639b-282e-1610-7096725691b4.png)
 

5. exeをダウンロード後、実行しインストールを行う。
(私はNext連打しました)
デスクトップ上にDocker Quickstart Terminalが存在すると思うので、それを実行(こちらも少し時間がかかります)。
Dockerのクジラのマークが表示されれば完了。

6.動作確認

以下のコマンドが実行し、「Hello from Docker!」と表示されれば確認完了です。。

```
 docker run hello-world
```


## インストールせずに使いたい方向け(おまけ)

さて、Dockerのインストール手順について記載しました。

ここで、インストールをせず、とりあえずDockerを触ってみたいという方向けの利用方法になります。

使用するのは、Play with Dockerです。
使用する手順は以下の通りです。

1. Play with Dockerを開く
![playwithdocker_!.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595799/e790e1a9-126a-921d-6d8c-857b1c8dccef.png)

2. Loginボタン、dockerを押下。
3. Sign upからユーザ登録を行い、ログイン。
![playwithdocker_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595799/2202f449-50df-1e79-a939-d438e2834dac.png)

4. ログインすると、以下のような画面になるため、Startボタンを押下
![playwithdocker_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595799/0d191715-1456-aa78-3620-a71b6a14bb19.png)



左側の+ADD NEW INSTANCEからインスタンスを起動し、Dockerを利用することができます。


[注意事項]
ここで作成したインスタンスは、作成後4時間で破棄されます。
あくまでも、テスト用として使いましょう。

## さいごに

以上が、Dockerのインストール手順でした！

Twitterとか見ていても、Dockerが使えない為、「Mac買おうかな」と言っている人もいました。
この記事を見て「Windowsでもできるよ！」ということを多くの人に伝えることができればなぁと思い、[私のブログ](https://zhack-blog.com/docker_install/)から記事を抜粋しました。
MoviePyを使ったらいろいろつまづいたのでメモ

動画編集をやりたく，[moviepy](https://github.com/Zulko/moviepy)を使ってみようと思ったがいろいろつまづいたのでメモ．

## 環境

mac Mojave
python 3.6.8

## 結論

「動画ファイルをInputとしてテキストや画像を追加し，Outputとしても動画ファイルを書き出す，」というユースケースなら以下が楽です．

```shell
pip install moviepy==1.0.0

## ※macのQuickTimePlayerでしか動作確認していないため，もしかしたらこっちじゃないと動かないかも
## moviepyのversion1.0.0を少しいじったもの
# pip install -U git+https://github.com/mynkit/moviepy.git@mynkit/dev
```

sample_moviepy.py

```Python
import moviepy.editor as mp


AUDIOPATH = 'hogehoge.mp4'
IMGPATH = 'hogehoge.png'


video = mp.VideoFileClip(AUDIOPATH)

img = (mp.ImageClip(IMGPATH)
          .set_start(1) # 動画の何秒地点から画像を表示させるか
          .set_duration(10) # 何秒間画像を表示させるか
          .resize(height=250) # 画像の高さ
          .margin(right=0, top=0, opacity=0) # 余白の大きさ設定(今回は余白なし)
          .set_pos(('right','bottom'))) # 今回は右下に画像を表示させる

final = mp.CompositeVideoClip([video, img])
# mynkit/devからpip installしてきた場合は `final.subclip(0,10).write_videofile('test.mp4')`のみで良い．
final.subclip(0,10).write_videofile(
    "test.mp4",
    codec='libx264', 
    audio_codec='aac', 
    temp_audiofile='temp-audio.m4a', 
    remove_temp=True
) # 0~10秒までをtest.mp4に出力
```

## つまづきポイント

どうやらwrite_videofileがいろいろよろしくなさそう．

### そもそもwrite_videofileが動かない

現時点(2020/03/07)のMoviePyの最新versionは`1.1.0`ですが，このままwrite_videofileを実行すると以下のエラーが出ます．

```
AttributeError: 'NoneType' object has no attribute 'stdout'
```

[issue938](https://github.com/Zulko/moviepy/issues/938#issuecomment-537883274)をみると，versionを1.0.0に下げろとのこと．とりあえず言われた通りに下げる．

### 今度は出力ファイルから音声が出ない

入力ファイルには確かに音声あるし，jupyter上で

```Python
final.subclip(0,10).ipython_display(width=400)
```

したらちゃんと音声が存在する形でプレビューできた．だけど出力ファイルに音声がない．．

これも[issue876](https://github.com/Zulko/moviepy/issues/876)に記載があった．

[moviepy/video/io/ffmpeg_writer.py](https://github.com/Zulko/moviepy/blob/e7309ddd46273dde1e6019d7b9fd1288672e7a15/moviepy/video/io/ffmpeg_writer.py#L87)に記載されてる`'-i', '-', '-an'`の順番がおかしく，正しくは`'-an', '-i', '-'`とのこと．これはforkした[自分のgithub上](https://github.com/mynkit/moviepy/blob/mynkit/dev/moviepy/video/io/ffmpeg_writer.py)では対応しておいた．

ちなみにこの対応をしなくても，以下の対応だけすればQuickTimePlayerでは再生された．

### macのQuickTimePlayerで再生できない

これで安心か，と思いきや，macのQuickTimePlayerで確認してみるとやはり音がでていない・・

[issue51](https://github.com/Zulko/moviepy/issues/51)や[issue820](https://github.com/Zulko/moviepy/issues/51)でも言われている通り，QuickTimePlayerで再生するためにはwrite_videofileの引数に

```Python
    codec='libx264', 
    audio_codec='aac', 
    temp_audiofile='temp-audio.m4a', 
    remove_temp=True
```

が必要みたい．この状態で動画を書き出したところ，うまくいった．
チルダでnumpyブールarrayを反転

~(チルダ)でnumpyブールarrayを反転

```python
>>> import numpy as np

>>> l1 = np.array([True, False, True])
>>> ~l1
array([False,  True, False])

>>> l2 = np.array([[[True], [False], [True]], [[False], [True], [False]], [[True], [True], [True]]])
>>> ~l2
array([[[False],
        [ True],
        [False]],

       [[ True],
        [False],
        [ True]],

       [[False],
        [False],
        [False]]])
```
製薬企業研究者のためのMySQLインストール方法

# はじめに

ここでは、MAMPのインストールによってMySQL環境を構築する方法を解説します。

# MAMPのインストール

[MAMPのダウンロードページ](https://www.mamp.info/en/windows/)にアクセスします。
「Free Download」をクリックしてインストーラーをダウンロードします。

![MAMP_download.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/edb4829d-b4d4-544c-b0a3-1e1a1213e256.png)

インストーラーを立ち上げ、画面の指示通りに進んでいけばインストールできます。


# MAMPの起動

サーバーを起動するには、MAMPをダブルクリックして立ち上がるウィンドウで、「Start Servers」をクリックします。

![MAMP_start.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/a92517de-0596-7fec-6f06-630c725d1793.png)

すると、サーバーのところが緑色に点灯します。

![MAMP_ready.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/f4bcfdf4-edd1-a4a5-0b6f-0f3cc8138d98.png)

「Open Webstart page」をクリックすると、以下のようなウェブページが立ち上がります。

![MAMP_webpage.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/4b2ba65b-6bce-6c5e-7046-20af88140ac3.png)

ここから、Tools -> phpMyAdminを選択すると、phpMyAdminの管理画面が立ち上がります。

![MAMP_phpmyadmin.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/95797330-5eb3-edce-abeb-2bffa0129e83.png)

Windowsだと、Apache serverが立ち上がらない場合があります。
そんなときは以下の記事を参考に設定を変更すると良いです。
https://qiita.com/saigu/items/75db7df4b7d18804a5e0


# MAMPの停止

サーバーを停止するには、「Stop Servers」をクリックするだけです。

![MAMP_stop.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/24afac6e-dd8f-a0b3-741a-9e732d41a7d1.png)

しばらくすると、サーバーの緑色に転倒していたところが消え、「Start Servers」という表示に変わります。


# まとめ

ここでは、MAMPのインストール方法について解説しました。
Windowsはややインストールしにくいですが、一度インストールできればMySQLを利用する準備は完了です。
Elastic IP　アドレスの解放が選択できない

## Release addresses あるいは アドレスの解放が選択できない時
* アドレスの解放ができないとき
 * このような時は３行目の「アドレスの関連付けの解除」の選択をして解除をしてみましょう。

<img src="https://i.gyazo.com/d766cd8f59a7469993828827e6101996.png" width = "200x200">


すると

<img src="https://i.gyazo.com/b7d34092a5de98f24de30b93dce54aa4.png" width = "200x200">

* 無事アドレスの解放ができるはずです。

## 最後に
まだEC2とかわからなくて「ここの選択でいいのかな？」と思うことってよくありますよね。
例えば某スクールのチーム開発でデプロイを担当する方。「こんなところでつまずくなんて...」と思わず不安に襲われること。
そう言った方々に少しでも助けになれたら幸いです。
[メモ] asyncをどこで使ったか

# はじめに
[こちらを参考にさせていただきました。](https://amzn.to/2JQyFNX)

# アプリ起動してウィジェットをbuildする前に現在地を取得

```dart
class _LoadingScreenState extends State<LoadingScreen> {
  @override
  void initState() {
    super.initState();
    // --- ここで使った ---
    getLocation();
    // ------------------
  }

  void getLocation() async {
    Position position = await Geolocator().getCurrentPosition(
      desiredAccuracy: LocationAccuracy.low,
    );
    print(position);
  }
```

# await忘れててウィジェットつくれないやーつ

>E/flutter (14324): This Overlay widget cannot be marked as needing to build because the framework is already in the process of building widgets.  A widget can be marked as needing to be built during the build phase only if one of its ancestors is currently building. This exception is allowed because the framework builds parent widgets before children, which means a dirty descendant will always be built. Otherwise, the framework might not visit this widget during this build phase.

```dart
  void getLocationData() async {
    var weatherData = ★ここにawaitが必要★ WeatherModel().getLocationWeather();

    Navigator.push(context, MaterialPageRoute(builder: (context) {
      return LocationScreen(
        locationWeather: weatherData,
      );
    }));
  }
```

Dataの取得中にウィジェットを作成しようとするというのは、つまり、プロセスが未完了のデータ(null)を受け取ろうとすることなのでウィジェットの作成に失敗する。
マンドリンオケ指揮者のためのなんちゃって指揮法　その２：脱力と叩き

#結論
* 指揮の基本は脱力です．
* 脱力していないと，間接運動で裏拍が捉えづらくなり，見にくくなってしまいます．
* 脱力といっても，ずっと力を抜くわけではありません．必要最低限の力で振れるようにしましょう．

#1. はじめに
[前回](https://qiita.com/ronaihara/items/981ebea42eb808e74c4f)は，指揮法の最も基本的な分類である，間接運動と直接運動について説明し，「力が入りすぎて，間接運動が直接運動に近くなると指揮が見にくくなるので注意しましょう．」と結論づけました．力を抜くためには，指揮の基本と言われる「脱力」をしなくてはなりません．
今回は，指揮に必要な脱力とは何かを解説します．

# 2. なぜ脱力しないといけないのか？　〜叩きを例にとって
間接運動のなかでも最も基本的な動きに「叩き」があります．文字通り，バチで太鼓をたたくような動きです．

例えば，下の動画で久保田孝さんが使っている動きです．
[![ビデオが開けません．](http://img.youtube.com/vi/Ck9JBh2f-5U/0.jpg)](https://youtu.be/Ck9JBh2f-5U?t=521)

私の師匠の本，「はじめての指揮法」から，２拍子の叩きの図を引用します．
![代替テキスト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594720/1fa86b14-7302-97b7-eddd-c0ada94e4ada.png "ALTテキスト")
線の太さは速度を表します．打点に近くほど速度が早くなり，点後はだんだん速度がゆっくりになっていきます．叩きは，上から手を離したボールが，重力によって地面に引っ張られていき，地面でバウンドして元の高さまで戻ってくるようなイメージです．
ここで，表拍を高さが一番下の打点で示すと，当然裏拍が一番上，ボールを離した元の位置に来ます．バウンドして元の位置に戻ってきたボールの速度が0になっているのと同じように，点を叩いて戻ってきた手も裏拍の位置で速度が0になる必要があります．
当然，打点では力を入れて，腕をバウンドさせる必要があるのですが，力が入りっぱなしでは，腕の速度変化をつけることができません．速度変化をつけて，裏拍をわかりやすく示すためにも脱力が必要です．

# 3. 直接運動でも必要な脱力
直接運動でも，脱力が必要です．
前回も見た，小澤征爾が教える直接運動の動画をもう一度見て見ましょう．
[![ビデオが開けません．](http://img.youtube.com/vi/6fMEp8OGHh8/0.jpg)](https://youtu.be/6fMEp8OGHh8?t=167)
これは，直接運動のなかでも先入法と呼ばれる動きです．動きだした瞬間が拍の点になるのですが，動き出す前は腕に力を入れておいて静止し，動き出す瞬間に力を抜きながら初速をつける必要があります．力が入りっぱなしでは，動き出した腕を制御することができません．このように，直接運動でも脱力が必要です．
また，これまでの解説でもわかるように，「脱力が大事」といっても，常に手の力を抜いているわけではありません．指揮は，腕の筋肉の緊張と弛緩によって拍を示す動きですので，力を入れる必要があるポイントもあります．力を入れるよりも抜くことの方が難しいので，まずは力を抜ける状態を意識的に作ることが必要です．

# 4. 脱力しないとどうなる？
前回も見たこの動画を脱力の観点からもう一度見て見ましょう．
[![ビデオが開けません．](http://img.youtube.com/vi/X_fb_orPKlQ/0.jpg)](https://youtu.be/X_fb_orPKlQ?t=57)
Afterの例は叩きのようですが，裏拍がわかるでしょうか？力がかなりはいっているので，裏拍よりかなり早く，棒が一番上に来てしまっています．このように，脱力をしないと裏拍がわかりにくく，見づらい式になってしまいます．
違う曲ですが，先ほどの久保田孝さんの動きと見比べてみると力の入り方が全く異なるのがわかると思います．

# 5. 脱力の練習方法
脱力はなかなか難しく，意識しないとすぐにはできるようにならないと思います．
下はピアノを弾くときの脱力の例ですが，指揮にも応用できます．
[![ビデオが開けません．](http://img.youtube.com/vi/G0RfOGM-JRQ/0.jpg)](https://youtu.be/G0RfOGM-JRQ?t=37)
私も，立った状態で全く同じことを練習していました．例えば手刀を作って鼻の前を初期位置とし，そこから腕が落ちるように練習するとよいと思います．
初心者の人はぜひトライしてみてください．

#6. おわりに
指揮法の基本である脱力について，叩きを例にとってその必要性を解説し，脱力しないとどうなるかを例示したうえで，脱力の練習方法を解説しました．
指揮する上で最も基本的なことなので，少しずつでよいのでぜひ身につけてください．
[次回](https://qiita.com/ronaihara/items/9a96e7936dfa8dc9fb15)は，指揮者がみんな気になっているであろう，指揮と音の出るタイミングについて書きます．

##参考文献
1. 齊藤秀雄, "指揮法教程", 音楽之友社．
2. 斉田好男，"はじめての指揮法", 音楽之友社．
Hack The Box

#Hack The Box
こんにちは、いっきゅうです。
twitter:[@ikk_hck](https://twitter.com/ikk_hck)

今回はペネトレのサブスクであるHTBの登録方法についてまとめたいと思います。

##登録方法が面白い
まず登録する段階からCTFっぽくなっている。

登録画面にいくと
<img width="685" alt="Screen Shot 2020-03-07 at 19.23.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197716/2c906436-e74a-7639-389f-4252516f650a.png">
でもInvaite Codeをもらってない。これが噂のHack The Boxの登録みたい。
とりあえずDevelopers Toolsでみてみる。
<img width="501" alt="Screen Shot 2020-03-07 at 19.27.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197716/d4cb14c5-e240-4a20-c70f-f2888f5c4bd6.png">
タグのsrc="/js/inviteapi.min.js"が明らかに怪しい。
てことでhttps://www.hackthebox.eu/js/inviteapi.min.jsをみてみると
<img width="814" alt="Screen Shot 2020-03-07 at 19.30.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197716/7abc48dd-b99a-d96d-444f-746eb0d1e843.png">
MakeInviteCode発見。たぶんこれ。
/inviteに戻ってコンソールからMakeInviteCode()を入力。


<img width="619" alt="Screen Shot 2020-03-07 at 19.40.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197716/2e524b06-0ffe-925f-534d-67823b6387c6.png">

得たデータはどうやらBASE64で暗号化されているらしいので解読。
ググれば解読してくれるサイトもある。
解読すると
In order to generate the invite code, make a POST request to /api/invite/generate
を得る。
例によって"https://www.hackthebox.eu/api/invite/generate" にアクセス。
すると
<img width="590" alt="Screen Shot 2020-03-07 at 19.44.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197716/ec493fce-25ba-75ee-e454-3000fc56d962.png">
なるほど。今度はterminalからPOSTで。
`curl -X POST https://www.hackthebox.eu/api/invite/generate
`
するとまたデータが帰ってくるので同じくデコードするとようやくInviteCodeゲット。

始めたばかりでつまずいた人がもしいたら是非参考にしてください。
そうでない人もHackTheBox一緒に楽しみましょう。
では。
Ansibleで条件にマッチするファイルだけ処理する方法

Ansible2.2から追加された[json_queryフィルター](https://docs.ansible.com/ansible/2.3/playbooks_filters.html#json-query-filter)を使って、いくつかある候補のファイルのうち、存在するファイルだけ処理対象とする方法を紹介します。

たとえば、以下のような候補のうち、存在するファイルだけ処理したいとします。

* /var/file1
* /var/hoge/file2
* /var/fuga/file2

よくある書き方だと以下のようなタスクの組合せをファイル毎に書かなければなりません。

```python
- name: check if file exists
  stat:
    path: /var/file1
  register: file1
 
- name: do something with file1
  ...
  when: file1.stat.exists
```

以下のようにすること、ファイルの数にかかわらずタスクを2つ書くだけで済みます。

```python
- name: "check target files existence"
  stat:
    path: "{{ item }}"
  with_items:
    - /var/file1
    - /var/hoge/file2
    - /var/fuga/file3
  register: target_file_existence
 
- name: do something with existing files
  shell: cat {{ item }}
  with_items: "{{ target_file_existence.results | json_query('[? stat.exists==`true`].item') }}"
```

## 解説編

`target_file_existence`変数に格納された、各ファイルの`stat`の結果は、以下のようになっています。

```python
- debug:
    var: target_file_existence.results 
```

```javascript
{
    "target_file_existence": {
        "changed": false,
        "msg": "All items completed",
        "results": [
            {
                ...
                "item": "/var/file1",
                "stat": {
                    ...
                    "exists": true,
                    ...
                }
                ...
            },
            {
                ...
                "item": "/var/hoge/file2",
                "stat": {
                    ...
                    "exists": true,
                    ...
                }
            },
            {
                ...
                "item": "/var/fuga/file3",
                "stat": {
                    "exists": false
                }
            }
        ]
    }
}
```

以下のように記述することで、`target_file_existence`変数の`result`要素に対して、`stat.exists`が`true`である`item`要素(ファイル名)を抽出しています。

```
"{{ target_file_existence.results | json_query('[? stat.exists==`true`].item') }}"
```

## 応用編：候補のうち最初に見つかったファイルを対象にする

候補のうち最初に見つかった見つかったファイルを対象にしたい場合、さらに`first`フィルタを追加すれば簡単に実現できます。

```
"{{ target_file_existence.results | json_query('[? stat.exists==`true`].item') | first }}"
```

## 参考
* [json_queryフィルタのドキュメント](https://docs.ansible.com/ansible/2.3/playbooks_filters.html#json-query-filter)
* クエリの文法: [JMESPath](https://jmespath.org/)
* json_queryフィルターの利用例: [Ansible json_query Example - Parse JSON with Ansible](https://www.middlewareinventory.com/blog/ansible_json_query/)
FirebaseでGoogleログインを実装した時に認証名をオリジナルドメインに変更する

ニッチな分野ですが、案外見つけるまでに時間がかかってしまったので備忘録的に残しておきます。

困っていたこととしては、FirebaseでGoogleログインを実装してみたのですが、ログイン時のドメイン名が「●●●.firebaseapp.com」のままでした。

![login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116375/67e4145d-fc39-07a8-dd85-3c9ecbbbba6e.png)


知り合いにサイトを見せた時に変えた方が良いと指摘をいただきながらも面倒だったので、ずっと後回しにしていました。結論的には[こちら](https://cloud.google.com/identity-platform/docs/how-to-customize-auth-handler)の公式ドキュメントに書いてありました。

変更する箇所を2つです。

1) Google Cloud PlatformのAuthorized redirect URI

Firebaseで設定すると、Google Cloud Platformをあまり設定しなくても実装できます。細かい設定を行いたい場合は、ここを確認する必要があります。Credentials > Oauth 2.0 Client IDsに作成されているWebClientに入ります。

Authorized redirect URIをオリジナルドメインのredirectに変更します。

![auth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116375/11e855d3-547c-654e-2e8b-5800c9e362f8.png)

2) Firebaseの設定

アプリ上で設定している`authDomain`をオリジナルドメインに変更します。

これでオリジナルドメインの認証ができるようになります。
【Rails】ActiveRecord::Validation::valid?

#ActiveRecord::Validation::valid?
任意のタイミングでオブジェクトに対してバリデーションを行うメソッド。
問題があった場合は`member.errors.messages`でエラーメッセージを確認できる。

##バリデーションせずにオブジェクトを作成

```rb
$ cd app/samurai/valid-demo
$ bin/rails console
>member = Member.new()
```
上記の様にMemberを作成した時に、
仮にnameを文字数を1〜10文字で制限をかけていたとしても

```rb
=> #<Member id: nil, name: nil, mail_magazine: nil, email: nil, post_code: nil, tel: nil, created_at: nil, updated_at: nil>
```
作成されてしまいます。

##ActiveRecord::Validation::valid?でバリデーションする

```rb
member.valid?
=> false
```
バリデーションの結果、失敗しました。

```rb
member.save

【実行結果】
   (0.1ms)  begin transaction
   (0.2ms)  rollback transaction
=> false
```
エラーメッセージに対応せず保存しようとするとロールバックし失敗する。

※member.save(validate: false)とすれば、強制的に保存できます。

##コンテキストを指定してバリデーションすることができる

```rb
  # nameの文字数は、1文字から10文字まで
  validates :name,
    length: { minimum: 1, maximum: 10 }, on: :create
 
  # 更新時は、1文字から20文字まで
  validates :name,
    length: { minimum: 1, maximum: 20 }, on: :update
```
上記のコードはnameを新規作成の時は１〜１０文字、編集の時は１〜２０文字に制限を指定している。
画像内に配列があるとき、どうやってeach文を書いたらいいの？

## きっかけ
carrierwaveを使い複数の画像表示をできるようにしました。
詳細ページへもDBからデータを取ってくるためにif文を使用し表示もできていたのですが
メンターから指示のあったif文での書き直しが全てエラーになり、だったら
eachに書き直せとの切り返しがあったため、泣き泣き変更することとなりました。
もしも、そんな変更を余儀なくされ、必要とされる方がおりましたら、
少しでもこちらの記事が参考になればと思います。

## 最初の記述

```ruby:haml
= image_tag "#{@item.images[0].src}"
```
こんな感じで画像表示されておりました。
以下がif文

```ruby:haml
.box-photo__thumbnail
          -if @item.images[1].present?
            %div.brand-item
              = image_tag "#{@item.images[1].src}", alt: 'brand-item'
          - else
          -if @item.images[2].present?
            %div.brand-item
              = image_tag "#{@item.images[2].src}", alt: 'brand-item'
          - else
          -if @item.images[3].present?
            %div.brand-item
              = image_tag "#{@item.images[3].src}", alt: 'brand-item'
          - else
          .box-photo__thumbnail__bottom
          -if @item.images[4].present?
            %div.brand-item
              = image_tag "#{@item.images[4].src}", alt: 'brand-item'
          - else
          -if @item.images[5].present?
            %div.brand-item
              = image_tag "#{@item.images[5].src}", alt: 'brand-item'
          - else
          -if @item.images[6].present?
            %div.brand-item
              = image_tag "#{@item.images[6].src}", alt: 'brand-item'
          - else
          -if @item.images[7].present?
            %div.brand-item
              = image_tag "#{@item.images[7].src}", alt: 'brand-item'
　　　　　　　#以下略

```
まあ綺麗ではないですよね。笑
ただこれ以外の`elsif`　`else if`の記述はエラーになったり１件しか表示されなかったりと不備があったためこちらを使用しておりました。

`each`も考えましたが配列を含む書き方をいくら調べても見つからず諦めておりました
が
配列無視して、scssで画像サイズを整えるという神がかった方法を教えてくださった方がいました。
本当にありがとうございます(>_<)

## each文への書き換え

```ruby:haml
.box-photo__photo
  - @item.images.each_with_index do |image, i|
    = image_tag "#{image.src}"
```
配列無視で、全部を表示されるようにしました。
でも表示したい画像の１つ目はサイズを変えたい。
そこでscssで修正を行うことにしました。

## scssでの修正

```ruby:scss
.box-photo{
      box-sizing: border-box;
      width: 300px;
      height: 420px;
      margin-right: 20px;
      &__photo{
        width: 300px;
        height: 420px;
        font-size: 0;
        img:nth-child(1){
          width: 300px;
          height: 300px;
        }
        img{
        @include item;
        }
      }
    }
  ```
中の様子はおおよそわかるかと思いますが、一部説明しますと
`img:nth-child(1){`の記述がどの画像サイズを変えますとの定義をしている部分です。
詳細は参考ページをご覧ください。

[余白を消す方法](https://konpure.com/2019/02/17/post-9977/)
[nyh-childについて](https://techacademy.jp/magazine/8651)
[足掻いていた時に見ていたeachに関するページ](https://techracho.bpsinc.jp/hachi8833/2018_07_20/59639)

## 終わりに
最後までご覧いただきありがとうございます。
初学者のため、不備や謝りなどございましたら
お手数ですがご指摘等いただけますと幸いです。

どうぞ宜しくお願いします。
1行素数判定コード (Python3)

# 1行素数判定コード
知人の[marien](https://qiita.com/marien)が1行素数判定のコードを作成してくれたのでその紹介です。
（このコードはとにかく１行で書くことを目的としたので計算速度とかは全く気にしておりません）

```Code
print('not sosu') if 0 in [(i + 1 + num) % num for i, num in enumerate(reversed(range(2, int(input()))))] else print('sosu')
```
javascriptで簡単ストップウォッチ

#HTMLを書く

```html:index.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>自作ストップウォッチ</title>
    </head>
    <body>
        <div id="timerLabel">00:00:00</div>
        <button id="startBtn">START</button>
        <button id="stopBtn">STOP</button>
        <button id="resetBtn">RESET</button>
        
        <script src="main.js"></script>
    </body>
</html>
```
#javascriptを書く

```javascript:main.js
'use strict';
{   
    var time = 0;
    var timerLabel = document.getElementById('timerLabel');
    var startBtn = document.getElementById('startBtn');
    var stopBtn = document.getElementById('stopBtn');
    var resetBtn = document.getElementById('resetBtn');
    var id;  // setTimeoutから返される値を入れる変数

    // STARTボタン
    function start() {
        // スタートボタンを押せないようにする（これをしないと何回もスタートボタン押せてしまう）
        startBtn.disabled = true;
        // timeをsetTimeoutで設定したミリ秒ごとに1プラスする
        time++;  
        
        //分・秒・ミリ秒を計算
        var min = Math.floor(time/100/60)
        var sec = Math.floor(time/100);
        var mSec = time % 100;
        // 分・秒・ミリ秒が１桁の場合は、先頭に０をつける
        if (min < 10) min = '0' + min;
        if (sec >= 60) sec = sec % 60; // 秒が60秒以上になった場合の処理（60になったら0になる）
        if (sec < 10) sec = '0' + sec; 
        if (mSec < 10) mSec = '0' + mSec;

        // timerLabelを更新
        timerLabel.innerHTML = min + ':' + sec + ':' + mSec;
        // setTimeoutでstart関数をループさせるイメージ？
        id = setTimeout(start, 10);
    }
    
    // STOPボタン
    function stop() {
        // 停止する
        clearTimeout(id);
        // スタートボタンを押せるようにする
        startBtn.disabled = false;
        
    }
    
    // RESETボタン
    function reset() {
        // 停止する
        clearTimeout(id);
        // タイムを0に戻す
        time = 0;
        // タイマーラベルをリセット
        timerLabel.innerHTML = '00:00:00';
        // スタートボタンを押せるようにする
        startBtn.disabled= false;
    }
        
    // クリックした時の処理
    startBtn.addEventListener('click', start, false); // STARTボタン
    stopBtn.addEventListener('click', stop, false); // STOPボタン
    resetBtn.addEventListener('click', reset, false); // RESETボタン
}
```

#参考にした記事
[javascriptでストップウォッチを作ってみる。忘備録](https://qiita.com/ryomaDsakamoto/items/c49a9d4cd2017405af1b)
[【動画・サンプルコード付き】JavaScriptでつくる簡単ストップウォッチ](https://codeforfun.jp/javascript-stopwatch/)
3Dプリンタ(Ender3)の消費電力を測定してみる

# モチベーション

昨今の事情から外出の頻度が減り、自宅の電気代が気になっている方も多いのではないでしょうか。
どこのご家庭にもあると思われる3Dプリンタは稼働時間が長く、熱源としても消費電力が気になるところです。
ここでは、3Dプリンタを一定の条件で動かしたときの消費電力と消費電力量を測定してみます。

# 測定条件
## 使用した3Dプリンタ

[Creality3D Ender3 Pro](https://www.creality3dofficial.com/products/creality-ender-3-pro-3d-printer)を使いました。
Amazon.co.jpで3万円程度で購入でき、PLAやABSなど使える材料が幅広い上にそれなりの造形精度であるため人気があるようです。
印刷と測定の様子はこちら。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333764/4696d09f-117d-a46d-fceb-7172649b9517.gif" width=100%>



## 消費電力の測定方法

ラトックシステムの[REX-BTWATTCH1](https://www.ratocsystems.com/products/subpage/btwattch1.html)を3Dプリンタの電源に挟んで測定を行います。測定データは本体に蓄積できる他、Bluetoothでダウンロードが可能です。
1分ごとの消費電力量(Wh)を測定できるため、この検証ではそのデータを利用しています。


## 印刷に使用した3Dモデル

おなじみの、Stanford Bunnyを50％に縮小して印刷します。STLファイルはThingiverseより[こちらのもの](https://www.thingiverse.com/thing:11622)をお借りしました。
スライサーは[Ultimaker Cura](https://ultimaker.com/ja/software/ultimaker-cura)を使用します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333764/ecbc9bdd-6323-c6e5-fea1-11629398902c.png" width=100%>

- 解像度：0.28mm
- Infill：50％
- サポート材あり

この設定で、材料の消費は16g、印刷時間は1時間34分と出ます。(後でグラフを示しますが印刷時間の予測はとても正確でした。)
ちなみに、印刷解像度を上げると印刷時間は長くなるものの、材料の消費は少なくなる、すなわち無駄が少なくなる傾向があります。

## 材料の設定

ALUNARのPLA(白)を使います。

- エクストルーダーは200度
- ビルドプレートは60度

の設定です。
ちなみに、Ender3は木造6畳の部屋にドアを閉めて設置しました。
印刷開始時の室内気温は21.5度でした。


# 測定結果

結論から。今回の条件では、

- 印刷時間：1時間35分
- 合計消費電力量：182.4Wh
    - 1kWhあたりの電気代を19.88円(東京電力 従量電灯B 1段階)およそ3.6円
    - 同じく従量電灯Bの3段階（30.57円/1kWh）だとおよそ5.6円

となりました。**平均で114.3Wの消費電力**と言うことになります。液晶テレビと同じくらいですね。
時系列にしてみるとこんな感じ。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333764/c000a67e-ced0-7c25-621c-36f678bd17cd.png" width=100%>



- 赤い折れ線グラフが1分あたりの消費電力(左側の軸)
- 緑の棒グラフが消費電力量の積算グラフ(右側の軸)

です。消費電力がだいぶ変動していますね。
これは、主にビルドプレートの加熱を断続的に行っているためのようです。

実際に印刷をするときには、予熱の上印刷を始めるのですが、下記表に示すように予熱時の消費電力が印刷時に比べて大きくなっています。予熱の際にはビルドプレートの予熱→エクストルーダの予熱の順で行われますが、グラフ上では16:44付近に250W付近まで上がりピークを迎えていることからわかるように、ビルドプレート加熱時には消費電力が大きくなります。(そして表面積が大きいため熱が逃げやすい)

|            | **合計時間(分)** | **合計消費電力量(Wh)** | **平均消費電力(W)** |
| ---------- | ----------- | --------------- | ------------- |
| **待機(参考)** | 5           | 0.28            | 3.43          |
| **印刷**     | 91          | 172.61          | 113.80        |
| **予熱**     | 4           | 9.79            | 146.99        |

大きなモデルを印刷したり、印刷解像度を上げると印刷時間が長くなりますが消費電力も印刷時間にほぼ正比例すると考えられます。ただし、気温によって消費電力は変動する可能性があります。
消費電力の観点ではなるべく熱の逃げにくい部屋でプリントしたほうが有利ですね(密閉型のプリンタもあるくらいですし)。
ちなみに、今回の実験ではプリンタの影響か室温の上昇も見られました。
(印刷開始時は21.5度→印刷終了時は24.5度と3度上昇しています。プリンタ付近の気温ですが。)


## 参考：印刷のトータルコスト
- 室温20度ちょい
- ALUNAR PLA(1kgで2500円)
- プリント解像度0.28mm

とすると、1kgあたりは電気代226.7円と試算できる(もちろん形状にも依存、従量電灯Bの1段階。3段階料金だと348.5円)ため、材料代合わせてもランニングコストは3000円以下となるようです。意外とリーズナブルですね。

# 終わりに

いかがでしたでしょうか。
ご自宅で3Dプリンタが電気を食うと言われて肩身が狭い方、電気代が気になって創作活動にブレーキをかけている方に少しでも背中を押す結果となれば幸いです。
usb_serial のエラー on Ubuntu Linux 

# 環境

- Ubuntu 18.04
- USBシリアルモジュール CP2102
- RobotDyn STM32F103 Dev.Board
- NFC RFID-RC522 モジュール
- ST-Link V2

「Arduino ESP32 と STM32 で NFC RFID-RC522」
https://qiita.com/nanbuwks/items/96c3c2d2af2cf97f3797
の実験をやっている時に、USBシリアルモジュールからデータが受け取れなくなる時がありました。

dmesgでは以下のようにエラーが出ます。

```

[212046.843899] cp210x ttyUSB0: usb_serial_generic_read_bulk_callback - urb stopped: -32
[212048.518972] cp210x ttyUSB0: usb_serial_generic_read_bulk_callback - urb stopped: -32
[212284.985795] cp210x ttyUSB0: failed get req 0x8 size 1 status: -32

```

ぐぐると FT232のニセモノが問題だとか、ARMが原因だとか出てきましたが根拠のあるものでは無さそうです。



# CP2102 USBシリアル変換アダプタ

このモジュール自体はいろんな実験で使っていて割と信頼みがありました。

![IMG_20200218_102556.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1efa1e2b-38ef-1487-a870-2275f0472945.jpeg)


刺した時のdemsは以下の通り。

```

[212467.319926] usb 1-1.2.1.2: new full-speed USB device number 123 using ehci-pci
[212467.460061] usb 1-1.2.1.2: New USB device found, idVendor=10c4, idProduct=ea60
[212467.460063] usb 1-1.2.1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[212467.460064] usb 1-1.2.1.2: Product: CP2102 USB to UART Bridge Controller
[212467.460065] usb 1-1.2.1.2: Manufacturer: Silicon Labs
[212467.460066] usb 1-1.2.1.2: SerialNumber: 0001
[212467.469347] cp210x 1-1.2.1.2:1.0: cp210x converter detected

```

# 解決方法

最初にこの記事をポストしたときには、ボーレートが遅すぎてフロー制御がうまくいってないのではないかという内容でしたが、それは間違いでした。

この実験では RobotDyn STM32F103 Dev.Board へ ST-Link から 3.3V の電源を供給していたのですが、供給力不足だったようです。RFID-RC522が動作した時に電圧降下が起こったかな？

ST-Linkからの電源供給をやめて、USBシリアルから5VをRobotDyn STM32F103 Dev.Board へ供給するようにしたら解消しました。
【HTML】input に paddingが付けられるのか？


~~~ :HTML
<input type="text" value="メールアドレス">
~~~

~~~ :HTML
<style>
input {
  padding-left: 100px;
}
</style>
<input type="text" value="メールアドレス">
~~~

＜style＞の部分で、
CSS のファイルに書いても大丈夫。
但し、上書きされてしまって padding の指定が消されてしまう場合があるので、注意してください。


## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
TeraTerm Macro で NetApp を停止する

#

## 目的
- WindowsOSのサーバから、SSHでNetAppを停止させたい。
- UPS連携しているので、サーバが落ちる前にNetAppを落としたい。
- そうだ。TeraTermを使おう。

## コマンドの雑な解説

```
connect
```

SSH接続の命令のようなもの。タスクで実行する場合は、非表示にしたいので`/V`を指定する。
なお、`.ttl`を呼び出す際も`ttpmacro.exe /V hogehoge.ttl`としておこう。

```
logopen
```

マクロ実行時の標準出力を記録してくれるもの。
なお、ssh接続後、つまり、`connect`後に記載しないとエラーになるので注意されたし。

```
logclose
```

ログの記録を停止するもの。それだけ。

```
wait
```

続く引数に指定されている文言が出力されるまで、待機する。

```
sendln
```

続く引数に指定されているものを送るもの。

## .ttlファイルそのもの

```
;=================================
;Target Machine Info
HOSTADDR = '192.168.11.21'
USERNAME = 'admin'
PASSWORD = 'password0'
PROMPT = '>'
YESNO = '{y|n}'
;=================================

;Commands env
COMMAND = ' '
strconcat COMMAND '/V '
strconcat COMMAND HOSTADDR
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD

;connect
connect COMMAND

;log
logopen 'C:\scripts\storage_shutdown.txt' 1 1

;prompt 
wait PROMPT

sendln 'system node show -node local'
wait PROMPT

sendln 'system node show -node !local'
wait PROMPT

sendln 'system halt -node cluster1-01,cluster1-02 -ignore-quorum-warnings true -skip-lif-migration-before-shutdown true -inhibit-takeover true'
wait YESNO
sendln 'y'
wait YESNO
sendln 'y'

logclose

end
```
Docker コンテナを使って Node.js 開発を始める

![logo-light.svg](https://nodejs.org/static/images/logo-light.svg)

# 2020/10/25 追記

記事内容は、[Zenn.dev](https://zenn.dev/ymasaoka/articles/start-nodejs-development-with-docker) へ移すことにしました。

Qiita での記事内容は削除しました。
Zenn.dev 側で掲載していた内容と同じものを公開しているので、そちらをご確認ください。

- [Docker コンテナを使って Node.js 開発を始める](https://zenn.dev/ymasaoka/articles/start-nodejs-development-with-docker)
SambaでRaspberryPiにファイルサーバーを実装する方法(NAS)

#目標
LAN内で接続できるファイルSambaのファイルサーバーを実装する。
WANから接続できるようにするためには、プラスでVPNの実装が必要です。
[WireGuardでRaspberryPiにVPNを実装する方法](https://qiita.com/kokemaru/items/d828b3484af95718a60e)で詳しく方法を書きました。ubuntuでもやり方は変わらないと思います。rootアカウントで利用できるようにする。

#手順


##Sambaをインストールする

```
$ sudo apt update
$ sudo apt upgrade
sambaをインストールする。
$ sudo apt -y install samba
インストール中、英語でファイルの設定をdhcpようにしておきますか？という質問が出た場合はNOにしておく。
```

設定する内容は以下の通りです。ファイル内の他の設定項目はコメントアウトしても問題ありません。

## Sambaの設定ファイルを編集する

```
Sambaの設定ファイルを編集する
$ sudo vim /etc/samba/smb.conf

#以下の部分は設定ファイルの一番下に追加してください。
[root]
valid users = root
browseable = No
read only = no
writeable = yes
guest ok = no
path = /
guest only = no

#設定ファイルの構文が正しく書かれているかチェックするコマンド
$ testparm
```

##Sambaユーザの追加する
```
# rootアカウントにパスワードがなかった場合、パスワードをつける
$ sudo passwd root
# rootアカウントをSambaユーザアカウントに追加する
$ sudo pdbedit -a user1
# Sambaユーザの確認
$ sudo pdbedit -L
```

##Sambaの起動する

```
# OS起動時Sambaが自動で起動するようにする
$ sudo systemctl enable smbd
# Sambaを起動する
$ sudo systemctl start smbd
# Sambaが起動しているか確認する
$ sudo systemctl status smbd
```

##クライアントから接続する
ファイルエクスプローラーのアドレス欄に

```
\\RaspberryPiのipアドレス\root

# RaspberryPiのipアドレスの確認方法
$ ifconfig
```

と入力すれば接続できる。

サーバーのipアドレスは、サーバー側で以下のコマンドを実行すると確認できる。
認証時のユーザはrootパスワードはSambaユーザを登録したときに入力したパスワード
ファイルをRaspberryPiからコピーするときに『これらのファイルを開くと、コンピューターに害を及ぼす可能性があります』と出てくるので、[http://honda-consulting.com/kyouyuu-keikoku/](http://honda-consulting.com/kyouyuu-keikoku/)に書いてある方法で出てこないようにする。



#もし動かなかったら
ファイヤーウォールの設定で通信が途切れているのかもしれないです。

```
$ sudo ufw allow from any to any app Samba
```

#詰まった点
ファイアーウォールの設定をしていなかったため、動かなかった。

#参考資料
[Ubuntu/DebianでSamba(ファイルサーバー)のインストールと設定](https://saba.omnioo.com/note/509/ubuntudebian%E3%81%A7samba%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E8%A8%AD%E5%AE%9A/)
[日本 Samba ユーザー会](http://www.samba.gr.jp/)
[Sambaの環境構築手順](https://qiita.com/hana_shin/items/e768ef63bdeeef3ada39)
【Rails】Validations

#Validations
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/b3ea8d0c-c9ea-7733-7151-7adb44defb1b.png)


上記の様な会員登録画面があったときユーザーが文字を入力する際に、
入力されるデータが「全角数字であるか」や「数字以外の文字を入力しているか」等の開発者側が確認したいことがある。

Validationsを使用すると、開発者側が確認したいデータの入力形式をユーザが入力する時点で気づかせてくれる。

###文字数の検証

```rb
class Member < ApplicationRecord
  # nameの文字数は、1文字から10文字まで
  validates :name,
    length: { minimum: 1, maximum: 10 }
end
```
上記の様に記載することで「氏名」を入力するフォームに関して、
文字数を1〜10文字までというルール設定ができる。

###条件付きで検証
「メールマガジンを受け取る」にチェックを入れた場合のみ、emailの入力を必須にする。

```models/member.rb
class Member < ApplicationRecord
  # mail_magazineをチェックしたときは、emailは必須
  validates :email,
    presence: { if: '!mail_magazine.blank?' }
end
```
`！mail_magazine.blank?`は「mail_magazine」 にチェックが入ったときのみ真（true）、入らない場合は偽（false）になる。
※「！」が付いているので真偽が逆になる。

つまり、チェックボックスにチェックが付いているときは「presence: true」、チェックが付いていないときは「presence: false」となり、「メールマガジンを受け取るチェックを付けた場合は、メールアドレスを必須にする」が検証できる。

###カスタムバリデーション
「length」や「presence」の様にActiveModel::Validationsモジュールが標準で用意している検証機能ではなく、
自分で検証機能を作成する方法がある。

```rb
# 数字3桁＋ハイフン（-）＋数字4桁の形式であることを検証するクラス
class PostCodeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors.add(attribute, 'は、数字3桁＋ハイフン（-）＋数字4桁の形式で入力してください。') unless value =~ /\A[0-9]{3}-[0-9]{4}\z/
  end
end
 
class Member < ApplicationRecord 
  # post_codeは、数字3桁＋ハイフン（-）＋数字4桁の形式
  validates :post_code,
    post_code: true
end
```
`validate_eachメソッド`では「数字3桁＋ハイフン（-）＋数字4桁」の郵便番号の形式で検証している。
また、`ActiveModel::EachValidator`を継承した独自の検証クラスを定義している。

`validate_eachメソッド`は「length」や「presence」を指定する代わりに「post_code」で指定することができる。

「post_code」とは、検証クラス名の「PostCode」のうち、先頭の大文字「P」は小文字「p」になり、途中の大文字「C」はアンダースコア＋小文字「c」になる決まり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/509beb9a-b3b7-0780-d72e-3ada82d44625.png)

このメソッドの引数には、上記の情報が渡される。
そこで、valueが「数字3桁＋ハイフン（-）＋数字4桁」の形式になっていることを、正規表現（/\A[0-9]{3}-[0-9]{4}\z/）を使用して検証する。
Django のモデル変更で外部キーを指定したらon_deleteを指定する必要が合った話

Djangoで外部キーを設定しようとしたときにon_deleteで悩んだのでまとめてみました。

## していたこと
現在ゲームのトーナメントを開催するwebアプリを作っているので、大会と参加者を結びつけるテーブルが必要でした。

なので参加者テーブルに大会テーブルとユーザテーブルを外部キーで持たせたモデルを作成しました。

```models.py
from django.db import models
from django.contrib.auth.models import User
from games.models import Game


class Participations(models.Model):
    Game = models.ForeignKey(Game)
    User = models.ForeignKey(User)
```

## 起きたこと

マイグレーションで以下のエラーが発生

```
Traceback (most recent call last):
    Game = models.ForeignKey(Game)
TypeError: __init__() missing 1 required positional argument: 'on_delete'
```

on_deleteが無いと怒られてしまいました。

## 原因
原因は単純ですが引数にon_deleteを指定していないことが原因です。

ちなみにDjango2.0から必須になったらしい。

実際に公式のリリースノートを見るとこのように書いています。

>The on_delete argument for ForeignKey and OneToOneField is now required in models and migrations.

>**翻訳**
ForeignKeyおよびOneToOneFieldのon_delete引数は、モデルおよび移行で必要になりました。

[Django 2.0 リリースノート](https://docs.djangoproject.com/en/2.0/releases/2.0/)

## on_deleteの使い方
ではon_deleteとは何でしょう。

参照しているオブジェクトが削除するときの振る舞いです


https://docs.djangoproject.com/ja/3.0/ref/models/fields/

以下に公式リファレンスをもとに簡単にまとめました

#### on_delete=models.CASCADE
外部キーのデータも全部削除しちゃうZe！

#### on_delete=models.PROTECT
削除を出来なくするZe！

#### on_delete=models.SET_NULL
削除されたら変わりにNULLを入れるよ！これを使う時はnull=trueにはしておこうZe！

#### on_delete=models.SET_DEFAULT
削除されたらデフォルトの値を変わりに入れるZe！

#### on_delete=models.SET(hogehoge)
削除されたら関数などを呼び出して任意の値を入れれるZe！

#### on_delete=models.DO_NOTHING
何もしないZe!

## まとめ
目的に合ったon_deleteを入れて豊かなマイグレーションライフだZe!