OmniAICreator/Qiita-1.07M huggingface dataset:
競技プログラミング私的チートシート（Java）

メモ。順次加筆。

## 余りを切り上げる

```java
public static int roundUp(int a, int b) {
    return (a + b - 1) / b;
}
```

## 最大公約数

ユークリッドの互除法を使って計算を行う。

参考:
[ユークリッドの互除法の証明と不定方程式 | 高校数学の美しい物語](https://mathtrain.jp/euclid)

```java
private static long gcd(long a, long b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}
```

例えば、a=370 b=273とすると、

|Loop|a|b|
|:-:|:-:|:-:
|1|370|273
|2|273|370 % 273 = 117
|3|117|273 % 117 = 39
|4|39|117 % 39 = 0

b=0になったとき、`return a`によりaの値が返される。
その値が最大公約数である。

## 最小公倍数

最大公約数を利用して計算する。

参考:
[最大公約数と最小公倍数の積の性質の２通りの証明 | 高校数学の美しい物語](https://mathtrain.jp/abequalgl)

```java
private static long lcm(long a, long b) {
    return a * b / gcd(a, b);
}
```

## 回転行列

```java
double rad = Math.toRadians(60);
double ux = (tx-sx)*Math.cos(rad) - (ty-sy)*Math.sin(rad)+sx;
double uy = (tx-sx)*Math.sin(rad) + (ty-sy)*Math.cos(rad)+sy;
Point u = new Point(ux, uy);
```

## 組み合わせの数

## 順列の数

## 順列の列挙

## 組み合わせの列挙

## 幅優先探索

```java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class DFS {

    private class Graph {
        List<List<Integer>> graph;
        boolean[] seen;

        public Graph(int n) {
            graph = new ArrayList<>();
            seen = new boolean[n];
            for (int i = 0; i < n; i++) {
                graph.add(new ArrayList());
                seen[i] = false;
            }
        }

        public void add(int from, int to) {
            graph.get(from).add(to);
            graph.get(to).add(from);
        }

        public void search(int v) {
            seen[v] = true;

            for (int next : graph.get(v)) {
                if (seen[next]) continue;
                search(next);
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        final int N = sc.nextInt();
        final int M = sc.nextInt();

        Graph graph = new DFS().new Graph(N);

        for (int i = 0; i < M; i++) {
            final int A = Integer.valueOf(sc.next());
            final int B = Integer.valueOf(sc.next());
            graph.add(A, B);
        }

        graph.search(0);
    }
}
```
face detection documents

https://www.pyimagesearch.com/2018/02/26/face-detection-with-opencv-and-deep-learning/

https://www.pyimagesearch.com/2020/03/16/detecting-covid-19-in-x-ray-images-with-keras-tensorflow-and-deep-learning/

https://www.pyimagesearch.com/2020/05/04/covid-19-face-mask-detector-with-opencv-keras-tensorflow-and-deep-learning/


openCV find Contours
https://blog.csdn.net/u011947630/article/details/81382086
https://blog.csdn.net/farmwang/article/details/74456719
[自分用メモ] Azure Active Directory を削除する際のWSAD同期ユーザーをPowerShellで削除

AzureADのディレクトリーを削除するとき、Windows ADと同期させていた場合に同期ユーザーについてポータルからは削除できない。
ユーザーはPowershellでは削除可能。削除してからディレクトリーを削除。（そのほかにもディレクトリーが削除できないケースあり、ケースバイケースで対応）

Azure ADにログイン 
```Connect-AzureAD -TenantId xxxxxxxxxxxxxxxxxx```


AzureADユーザー情報を確認
```Get-AzureADUser```

AzureADユーザーを削除する
```Remove-AzureADUser -ObjectID xxxxxxxxxx```
Win10から、Ubuntuへのリモートデスクトップを可能にする設定

#はじめに
サブPCをUbuntuサーバとして利用しようとしているが、Desktop版なのでモニタとマウスとキーボードがないと操作が出来ない
メインPCと交互に繋ぎ変えてしようしていたが、めんどくさ過ぎるので、メインPCからサブPCへリモートデスクトップ出来るように設定した

#環境
- メインPC(Win10)
- サブPC(Ubuntu 18.04.4 LTS (Bionic Beaver))

#手順
[Windowsのリモートデスクトップ接続アプリからUbuntuに接続する方法 ](https://linux.just4fun.biz/?Ubuntu/Windows%E3%81%8B%E3%82%89Ubuntu%E3%81%AB%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B)を参考に設定

#参考URL
- [Windowsのリモートデスクトップ接続アプリからUbuntuに接続する方法 ](https://linux.just4fun.biz/?Ubuntu/Windows%E3%81%8B%E3%82%89Ubuntu%E3%81%AB%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B)

ページいらんかった・・・（　＾ω＾）
Laravel 値を持たせてリダイレクトさせる

# 目的

- 値を持たせた状態でリダイレクトを行う方法をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いて導入 |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いて導入 |

# 前提情報

- とあるアプリのFooControllerに下記のような記載があるとする。

    ```php
    public function index() {
        return redirect('/user_home');
    }

    public function user_home() {
        return view('home.user_home');
    }
    ```
- ルーティングファイルには下記の内容が記載されているものとする。

    ```web.php
    Route::get('/user_home', FooController@user_home);
    ```
- indexアクションが読み込まれると`/user_home`にリダイレクト→ルーティングの記載によりuser_homeアクションに入る→homeディレクトリにあるuser_home.blade.phpがビューとして出力されると言う流れである。

# 具体例

- indexアクション内で連想配列`$strings`を定義して値を格納する。
- 連想配列`$strings`をリダイレクト先のuser_homeアクションで受け取り、連想配列$redirect_stringsに格納する方法を下記に記載する。
- 下記にFooControllerの内容を記載する。

    ```php
    public function index() {
        //変数の定義
        $strings = [
             'str_1' => 'test1',
             'str_2' => 'test2',
             'str_3' => 'test3',
        ]
        return redirect('/user_home')->withInput($strings);
    }
                             //値を受け取るので下記にRequestを記載する
    public function user_home(Request $request) {
        //redirect時の$stringsの値は$requestのoldに格納されている。
        //値を取り出して連想配列に格納する。
        $redirect_strings = [
            'redirect_str_1' => $request->old('str_1'),
            'redirect_str_2' => $request->old('str_2'),
            'redirect_str_3' => $request->old('str_3'),
        ]
        return view('home.user_home');
    }
    ```

# 参考文献

- [https://readouble.com/laravel/7.x/ja/requests.html](https://readouble.com/laravel/7.x/ja/requests.html)
基本ソフトウェアについて色々調べてみた（１）

どうも初めまして！　

最近基本情報技術者の資格取得に向けて勉強中な駆け出しエンジニアのワカです。

#■この記事を書こうと思ったきっかけ
最近書籍を購入して勉強しているのですが、暗記ばかりでなかなか身にならないと思いました。

そこで基本情報に書かれている内容を自分なりに解釈したものをここに備忘録として書き残すことにしました。
そうすれば手も動かせるし人にみられると思うとその分責任感出ますしね！

あと個人的に今自作PCを作りたいとも考えているのでこの機会に詳しくなっとこうと思ったのも理由の一つです笑

もしかすると間違っている点などあるかもしれませんので、その時は指摘していただけると嬉しいです。

#◼️オペレーティングシステム(OS)

早速ですがオペレーティングシステムという言葉をご存知でしょうか？
あまりなじみのない言葉だと思いますが 「OS」 と聞くと聞いたことがあるという方も多いのではないでしょうか？
この「OS」にはいろんな種類があり例えば Windows MacOS などが挙げられます。これらはすべて**基本ソフトウェア**と呼ばれてます

うん、それは知っているけど結局何してるソフトウェアなの？
そう思った私はOSとは何をしているソフトウェアでどんなものがあるのかを調べてみることにしました。

##OSの役割
「OS」が何をしているかというと…参考書にはこのように書いてありました。

>コンピューター内部のハードウェア様々な周辺機器を管理する。他メモリ管理ファイル管理そしてワープロソフトなどのアプリケーションに「今あなたが動作していいですよ」と 実行機会を与えるタスク管理などを行います。

ふむふむ…なんかよくわからんがとりあえず**コンピュータを動かすために必要**なんやなってことはわかった。


## ソフトウェアの分類
ソフトウェアというものは大きく分けると**応用ソフトウェア**と**システムソフトウェア**の二つに分かれます。

・**応用ソフトウェア例**・・・ワープロや表計算などの各種アプリケーションソフト
・**システムソフトウェア**・・・OSや言語プロセッサ各種サービスプログラムなど
（・**ミドルウェア**・・・データベース管理ソフトウェアや各種開発支援用ソフトウェアなど）


基本ソフトウェアはさらに細かく三つのプログラムに分けることができます。

###【制御プログラム】←OSの中核はこのプログラム
コンピューターが効率的に利用できるように縁の下の力持ちとして働くソフトウェア。OSの中枢はこのプログラムに 一般にこのプログラムのことを **カーネル** と呼びます。 

■カーネル
メモリ管理をプロセス管理などに機能を限定した 「マイクロカーネル」と
多くの機能を網羅した「モノリシックカーネル」があります。

###【言語処理プログラム】
 C 言語や Java などのプログラミング言語で 書かれたプログラムを コンピューターが理解できる機械語に翻訳するプログラム

###【サービスプログラム】
コンピューターの機能を補う補助的なプログラムのこと。 例えばファイル圧縮プログラムだとか動かします

##代表的なOS

| OS名 | 詳細 |
|:-:|:--|
| WindowsOS  | 現在最も広く使われている マイクロソフト社 製 の OS です gui グラフィックユーザーインターフェースと言って マウスなどの ポインティングデバイスを使って 画面を操作することでコンピュータに命令を伝えます  | 
| MacOS  |グラフィックデザインなどをクリエイティブ方面でよく利用されているアップル社 製 の OS です gui を実装した OS の 先駆けとしても知られています   | 
| MS-DOS  |Windows の普及以前に 広く使われていた Microsoft 社製の OS です cui キャラクターユーザーインターフェース と言ってキーボードを使って文字打つのコマンドを入力することでコンピューターに命令を伝えます   |   
| UNIX  |サーバーなどに使われることの多い OS です 大勢のユーザーが同時に利用できるように考えられてます   |   
| LINUX  | UNIX 互換性のある OS です オープンソース のソフトウェアで無償で利用することができます  |   
 

##API(application program interface)
API とは OS の用意しているハードウェアの利用や自身が持つ各種機能をアプリケーションから呼び出せる仕組みがあり、それを呼び出すためのインターフェースのことをいいます

###【APIを使うメリット】

・**開発効率アップ**・・・ API を呼び出すだけで機能が使えるからアプリケーションの作成が楽

・**操作性の統一**・・・ 基本的な麦が共通化されるから操作に迷わない

・**互換性の確保**・・・ ハードウェアが違っても OS が 同じなら無事に多く


#■最後に

ここまで長々と読んでくださりありがとうございました！
少し説明がわかりにくかった部分があるかと思いますが、もしわからないところがあればコメントしていただけると嬉しいです。

では！次の記事にて！
樹脂の劣化を考える　紫外線対策と加水分解

現代の生活において樹脂製品は必要不可欠です。
しかし、成形品は、いろいろと問題が起きています。
今回は、樹脂成形に関するちょっとした戯言になります。
#紫外線
これはIKEAで売っているBYSA ビィーサという物干し用ハンガー になります。
![DSC_0393 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3a4d316f-6ed1-9bb4-be16-f2083dac1a70.jpeg)
![DSC_0394 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ad48837c-a33c-e897-4c96-875c49618adc.jpeg)
破断状況を見てください。
これは応力での破損ではありません。
最終的には、外的要因と言えるかもしれませんが、単純に劣化です。
それも紫外線と思われます。

樹脂は、紫外線に弱い性質を持ちます。
この為に、屋外で使用するものには、それ相応の材質や、塗装を行います。
これが全く皆無なのでしょう。
数年でこのような状態になってしまいました。

#加水分解
つぎは、加水分解です。(塗装）
こちらは、塗装が、加水分解によりベトベトになってしまったものです。
![DSC_0396.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e789cc86-e991-fa55-a6b5-df07ab57bb91.jpeg)
製品としては、使えても、使用には不適切という事で廃棄することになってしまう事が多いでしょう。

溶剤で拭いたりすることで落とす事が可能なようですが、非常に大変です。

靴のソールなどの柔らかい樹脂に使われているポリウレタンなども加水分解で壊れてしまいます。

#材質問題
これは100円ショップの300円のUSB扇風機です。
完全な材質の問題でしょう。
使用したくても、触ると、ボロボロと折れてしまい非常に危険です。
![DSC_0397 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5c59ba55-8a38-446a-84a3-63fbb253db65.jpeg)
#材質と練り物
一例でしたが、樹脂成形は、安価ですが、材質を適したものにしないと、こういった問題が起きます。
そして、塗装の加水分解は、最悪で、加工時は全く問題なくとも10年以内にベトベトになってしまう為に
補修部品の管理すらままなりません。
こちらの塗装についても、適したものを使用すれば良いとのことですが、プロである大手自動車メーカーの製品ですら発生しており
余程化学に精通した人間でなければ、練り物の組成について把握することが難しいといえます。

#塗装
アクリルなどの透明素材は、加工後に、表面のコーティングを兼ねて、塗装を行います。
UV塗装などがそれにあたります。
最近の窓ガラスが緑(エメラルドブルー）なのは、紫外線などの特定波長の遮光の為になっています。
車のヘッドライトが劣化しないようにUV塗装を謡っている製品も存在しましたね。
どこまで厳密に加工されているかによりますが、無対策よりは、効果があるので、成型時に作業をすべき項目の一つと言えますが
上記のように加水分解してしまうものもあり悩ましい問題だったりします。

製品を企画し、設計、開発したうえで、量産するときに、材質、処理は大きな問題であり
どこまで把握し、どう対策するか、知見が非常に必要な分野です。
今回は、戯言を書いてみました。
WindowsのServer CoreにVMware Horizon 7のConnection Serverをインストールする

#概要
・#概要
・WindowsのServer CoreにVMware Horizon 7のConnection Serverをインストールする。
・最低限の設定のみ実施。
・サービスが起動したところのみ確認

#環境

|種別 |ソフトウェア|
|---- |-----------|
|ハイパーバイザ |Hyper-V(Windows 10 1903)|
|OS|Window Server 2016|
|アプリケーション|Connection Server 7.12|

#事前準備

・VMware HorizonのConnection Serverは評価版をダウンロード

# Connection Serverの構築

~~~
cd <インストールバイナリの配置先>
※インストールバイナリの展開は割愛します。

runas /user:<ドメイン管理者> cmd.exe
※Connection Serverはドメインユーザでインストール必要がある。

VMware-Horizon-Connection-Server-x86_64-7.12.0-15770369.exe /s /v"/qn VDM_SERVER_INSTANCE_TYPE=1 VDM_INITIAL_ADMIN_SID=S-1-5-32-544 VDM_SERVER_RECOVERY_PWD=<パスワード> VDM_SERVER_RECOVERY_PWD_REMINDER=""<任意>"""

~~~
Ubuntu導入

#はじめに
自宅サーバを立ち上げたく、色々調べた結果、Ubuntuというものが簡単？そうだったので導入してみた

#環境
- メインPC(Win10)
- 旧PC(VistaPC 32bit・・・)

#課題
| 課題|対策|
|:--|:--|
|導入PCが32bitPCなので、[UbuntuJapanese](https://www.ubuntulinux.jp/download)で公開されているバージョンが利用できない|[こちらのページ](https://releases.ubuntu.com/16.04/)で紹介されている32bit用バージョンを導入することで解決|

#導入手順
#### 1.メインPCにて起動用USBメモリを準備
>
1.[こちらのページ](https://releases.ubuntu.com/16.04/)で紹介されている32bit用のUbuntuのisoイメージを入手
2.[参考URL](https://www.weblogian.com/entry/ubuntu)の**YUMIをダウンロードする**と**YUMIでUbuntu起動用メモリーカードを作る**を参考に起動用USBメモリを準備する

#### 2.VistaPC内のデータを退避
>
1.VistaPCを起動し、必要そうなデータをメインPCに移動する(共有フォルダ準備して移動)

#### 3.USBでPCを起動後、Ubuntuインストール
>
1.[参考URL](https://www.weblogian.com/entry/ubuntu)の**古いPCでUbuntuをメモリーカードから起動する**の項目以降を対応する
>>
書くほどでもないかもしれないですが、F11ボタンは押しっぱなしより、連打の方がうまくいきます
自分はこれがわからず1時間は嵌りました・・・

#### 4.Ubuntuアップデート(16→18.04.4 LTS (Bionic Beaver))
>
1.Ubuntuの**ソフトウェアの更新**を利用し、最新バージョンにアップデート

#参考URL
- [【初心者向け】誰でも出来る不要PCへのリナックスのインストールと下準備](https://www.weblogian.com/entry/ubuntu)
Spring Boot（Gradle）で作ったプロジェクトをHerokuにデプロイする方法

今回は、備忘録として、Spring Boot（Gradle）で作成したウェブアプリをHerokuにデプロイする方法を書きます。


#準備
・Spring Bootで作ったプロジェクト
・Herokuアカウント

#フォルダ
<img width="235" alt="スクリーンショット 2020-06-01 10.49.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577071/b2e578ec-5bea-186c-30e6-5ff4b8c0ef7b.png">
これから作るファイルは、プロジェクトの直下に作成します。

#やること
##①build.gradleに追記
```
task stage(dependsOn: ['build', 'clean'])
build.mustRunAfter clean
```

##②Procfileを作成
```
web: java -Dserver.port=$PORT $JAVA_OPTS -jar build/libs/SampleApp-0.0.1-SNAPSHOT.jar
```

SampleAppには作成したアプリの名前を入れてください。

##③system.propertiesを作成
```
java.runtime.version=11
```

Javaのバージョンを記載してください。ここでは、11を指定しています。

ここまで準備を終えたら、下記コマンドを実行してください。

```
$ git add .
$ git commit -m "first commit."
$ heroku login
$ heroku create
$ git push heroku master
```

プロジェクトが無事にHerokuにデプロイされたはずです。

#データベースを追加したい場合
こちらの記事が大変参考になりましたので、ご覧ください。
[Heroku データベースの管理（ClearDB アドオンによる MySQL の利用）](https://www.ownway.info/Ruby/heroku/how/management/database/cleardb)

ただし、この方法だけだと文字化けする可能性があります。
文字化けした場合、次のコマンドを叩いてみてください。

```
$ heroku config:add DATABASE_URL='mysql://ユーザー名:パスワード@DBのホスト:3306/データベース名?reconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8'
```

正しく設定できているか確認するために、次のコマンドを叩いてみてください。

```
heroku config --app アプリケーションＩＤ
```

以上です。最後まで読んでくださりありがとうございました。

#参考
[Deploying Gradle Apps on Heroku](https://devcenter.heroku.com/articles/deploying-gradle-apps-on-heroku)
[Heroku データベースの管理（ClearDB アドオンによる MySQL の利用）](https://www.ownway.info/Ruby/heroku/how/management/database/cleardb)
[Heroku＋ClearDBで文字化けしていた件](https://omiend.hatenablog.jp/entry/2015/02/17/211134)
IBM i (旧AS400）の自己学習メモ　ツール編０３　VSCodeでRPGソースコードのハイライト

# 自己学習メモインデックス

[IBM i (旧AS400）の自己学習メモ　インデックス](https://qiita.com/You_name_is_YU/items/3964849e7803c8eaf767)

# 概要

たまたま思いつきでGitHubの検索ボックスに`AS400`とか`RPG`とか`IBMi`などのキーワードを入れて何かいい感じのものがないか探してみたら、Visual Studio Codeで利用できるRPGやCLなどのハイライト表示をしてくれる拡張機能を見つけました。
ので、それをQiita記事にまとめようと思います。

# 環境情報

**2020/5/5時点**

- Mac Catalina 10.15.4
- Visual Studio Code 1.44.2
- vscode-ibmi-languages v0.5.3
    - https://github.com/barrettotte/vscode-ibmi-languages

# 環境構築

VSCodeのインストール手順などは不要かなと思いますので割愛します。

VSCodeを起動して拡張機能のアイコンをクリック
<img width="861" alt="スクリーンショット 2020-05-05 9.25.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/e1888069-bb40-f9e4-3d5f-c4d37914a78e.png">

検索ボックスに`ibmi`と入力し、`IBMi Languages`の`Install`ボタンを押下
<img width="861" alt="スクリーンショット 2020-05-05 9.26.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/c750c2b0-0190-9cb7-09ea-21376924aa1d.png">

以上で環境構築は完了です。

# 試しにRPGソースを開く

予めデータ転送ツールなどを利用して、RPGのソースコードをテキストでローカルに取得しておく。
RPGやCLなどのソースコードは、それぞれ対応した拡張子にしておく必要があります。
拡張子の対応表は以下の通りです。

| ファイルの拡張子 | 説明 |
| ----------------------------- | ------------------ |
| .cl, .clp, .clp38 .clle       | Control Language   |
| .dspf, .dspf38                | DDS Display file   |
| .icff                         | DDS ICF file       |
| .lf, .lf38                    | DDS Logical file   |
| .pf, .pf38, .dds              | DDS Physical file  |
| .prtf, .prtf38                | DDS Printer file   |
| .rpg, .rpg38, .sqlrpg         | RPG/400            |
| .rpgle, .sqlrpgle             | RPGLE and SQLRPGLE |

ファイル拡張子`.rpgle`を開くと以下のようなハイライト表示でソースコードが閲覧できます。
<img width="991" alt="スクリーンショット 2020-05-05 9.34.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/19dc9a4a-855b-67c6-13dc-2e97cbf210cd.png">

ハイライト表示と、6桁目の仕様書コードの位置にうっすら罫線が見える状態になっているので、全体的に非常にみやすい印象です。
SEUにちゃんと慣れなければいけないとは思いつつ、ちゃんと色がついたソースコードを参考に、開発を進められるだけでも魅力的だなと思いました。

コードを入力するとコード補完もある程度してくれるようですが、桁位置の自動調整機能などは無いので、注意が必要だなとは感じます。
ちょっとPCわかるくらいのサーバー初心者が自宅サーバーをUbuntuで立ち上げるまでの道筋とメモ

#自宅サーバーでやりたかったこと

**以下、やりたい事を( ..)φメモメモ 出来たら、チェック入れる**

- [ ] ファイルサーバー(家の外でもアクセスできる)
- [ ] メディアサーバー(家の外でもアクセスできる)
- [ ] ファイルサーバーの容量を簡単に追加したい(SATAでHDDつなぐと面倒なので、usbでつないでいきたい)
- [ ] （出来るかわからないけど・・・）Switchとかの外付けHDDとして認識させて、いちいちそれ用に買う必要をなくしたい

#環境
- メインPC(Win10)
- ほこりかぶってたサブPC(Vista→Ubuntu 18.04.4 LTS (Bionic Beaver))
- 転がってるHDD
- 転がってるUsbメモリ

#手順
1. [VistaPcにUbuntuを導入](https://qiita.com/pupo/items/594ced2b4ed0f05aac91)
2. [Win10から、リモート出来るように設定](https://qiita.com/pupo/items/6007a37b67ef8691fb5d)
3. [sambaを利用し、メインPC、サブPC間共用のファイルサーバーを準備する]()
4. [複数のHDDを1台のHDDとして認識させる設定(LVM)]()
TypeScript で MongoDB のデータを削除 (Delete)

TypeScript で MongoDB のデータを削除します。

```ts:mongo_delete.ts
//
//	mongo_delete.ts
//
//					May/05/2020
// ----------------------------------------------------------------
var MongoClient = require('mongodb').MongoClient
require('dotenv').config()

console.log ("*** 開始 ***")

var key:string =process.argv[2]

console.log (key)

const user:string = process.env.user
const password:string = process.env.password
const db_name:string = process.env.db
const collection_name:string = process.env.collection

const host:string = user + ':' + password + '@localhost'
const port:number = 27017

const url:string = 'mongodb://' + host + ':' + port

console.log("Connecting to " + host + ":" + port)

const client = new MongoClient(url,
    {useNewUrlParser: true,useUnifiedTopology: true})

client.connect (function(err)
{
	const db = client.db(db_name)
	const collection = db.collection(collection_name)

	collection.deleteOne({key: key}, function(err,result)
		{
		client.close()

		console.log ("*** 終了 ***")
		})
})

// ----------------------------------------------------------------
```

実行コマンド

```bash
export NODE_PATH=/usr/lib/node_modules
#
ts-node mongo_delete.ts t1162
```
TypeScript で MongoDB のデータを更新 (Update)

TypeScript で MongoDB のデータを更新します。

```ts:mongo_update.ts
//
//	mongo_update.ts
//
//					May/05/2020
// ----------------------------------------------------------------
function get_current_date_proc ()
{
	var today = new Date ();
	var ddx = (1900 + today.getFullYear ()) + "-" + (today.getMonth () +1)
	ddx += "-" + today.getDate ()

	return ddx;
}

// ----------------------------------------------------------------
var MongoClient = require('mongodb').MongoClient
require('dotenv').config()


console.log ("*** 開始 ***")

const key:string =process.argv[2]
const population_in:number =parseInt(process.argv[3])

console.log (key + "\t" + population_in)

const user:string = process.env.user
const password:string = process.env.password
const db_name:string = process.env.db
const collection_name:string = process.env.collection

const host:string = user + ':' + password + '@localhost'
const port:number = 27017

const url:string = 'mongodb://' + host + ':' + port

console.log("Connecting to " + host + ":" + port)

const client = new MongoClient(url,
    {useNewUrlParser: true,useUnifiedTopology: true})

client.connect (function(err)
{
	const db = client.db(db_name)
	const collection = db.collection(collection_name)

	const date_mod = get_current_date_proc ()

	collection.findOne ({key: key},function(err, item)
		{
		console.log ('err = ' + err)
		if (item == null)
			{
			client.close()
			console.log ('*** error *** ' + key + " doesn't exist.")
			console.log ("*** 終了 ***")
			}
		else
			{
			console.log (item.name)

	collection.updateOne({key: key},{ $set:  {'population': population_in,'date_mod': date_mod}},function(err,result)
		{
		client.close()

		console.log (err)
//		console.log (result)
		console.log ("*** 終了 ***")
		})
			}
		})
})

// ----------------------------------------------------------------
```

実行コマンド

```bash
export NODE_PATH=/usr/lib/node_modules
#
ts-node mongo_update.ts t1164 78253900
```
【GAS】スプレットシートから特定のワードを検索し取得する

こんにちわ、さかぐち（[@sakaguchi_mamii](https://twitter.com/sakaguchi_mamii)）です。

今回は以下のスプレットシートから、昨日の日付の内容を取得します。
<img width="342" alt="スクリーンショット 2020-05-05 09.24.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136275/f927e183-a6a0-45a0-895d-3d385e3da897.png">

#スクリプト
```javascript
function myFunction() {

  // 検索したい日付（昨日）
  var now = new Date();
  var yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);
  var search_date = Utilities.formatDate(yesterday, 'Asia/Tokyo', 'yyyy-MM-dd');

  // スプレットシート読み込み
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('シート1');
  const lastRow = sheet.getLastRow();
  var message = '';
  for(let i = 2; i <= lastRow; i++) {
    var date = sheet.getRange(i, 1).getValue();
    // 内容が一致するか
    if(date === search_date){
      message += sheet.getRange(i, 2).getValue() + ',' + sheet.getRange(i, 3).getValue() + '\n';
    }
  }
  console.log(message);
}
```

#最後に

取得できた。
<img width="699" alt="スクリーンショット 2020-05-05 09.26.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136275/6a88b774-75ef-7b4d-2031-b873f7399f37.png">

※投稿内容は所属組織とは一切関係ありません。
TypeScript で MongoDB のデータを読む (Read)

TypeScript で MongoDB のデータを読みます。

```ts:mongo_read.ts
//
//	mongo_read.ts
//
//					May/05/2020
// ----------------------------------------------------------------
const MongoClient = require('mongodb').MongoClient
const assert = require('assert')
require('dotenv').config()

console.log ("*** 開始 ***")

const user:string = process.env.user
const password:string = process.env.password
const db_name:string = process.env.db
const collection_name:string = process.env.collection

const host:string = user + ':' + password + '@localhost'
const port:number = 27017

const url:string = 'mongodb://' + host + ':' + port

console.log("Connecting to " + host + ":" + port)

const client = new MongoClient(url,
    {useNewUrlParser: true,useUnifiedTopology: true})

client.connect (function(err)
{
	const db = client.db(db_name)

	const collection = db.collection(collection_name)

collection.find().each(function(err, item)
	{
	if(item != null)
		{
		var str_out = item.key + "\t" + item.name
		str_out += "\t" + item.population
		str_out += "\t" + item.date_mod
		console.log (str_out)
		}
	else
		{
		console.log ("*** 終了 ***")
		}

        client.close()
	})

})
// ----------------------------------------------------------------
```

実行コマンド

```bash
export NODE_PATH=/usr/lib/node_modules
#
ts-node mongo_read.ts
```
OracleからPostgreSQLへの移行（トランザクションでのエラー発生時の違い）

# トランザクションでエラーが発生した場合の違い

トランザクション処理中にエラーが発生した場合の動作は、OracleとPostgreSQLで違いがあります。
Oracleでは、トランザクション処理中にエラーが発生した場合でのCOMMITするかROLLBACKするかを明示的に指定できます。COMMITすれば、正常に終了したDMLは確定されます。
一方、PostgreSQLではトランザクション処理中にエラーが発生すると実行したDMLは全ては気されます。
システム移行の際はこの違いによりアプリケーション側のエラー処理を変更することになります。


# PostgreSQLとOracleでエラー発生させて確認

前述のOracleとPostgreSQLでのトランザクション処理中にエラーが発生した場合の動きの違いについて、実際に動かして確認しています。

## PostgreSQLの場合

```sql
drop table test1;
create table test1(
  id int not null,
  txt varchar(10),
  constraint pk_test1 primary key(id)
);

begin;
  insert into test1 values(1, 'a');
  insert into test1 values(2, 'a');
  insert into test1 values(3, 'a');
  insert into test1 values(3, 'b'); -- 主キーが重複
★ここで以下のエラーが発生する
ERROR:  duplicate key value violates unique constraint "pk_test1"
DETAIL:  Key (id)=(3) already exists.
```

上のように主キーが重複してエラー発生後、以下のようにcommitしてもid=1,2のデータはcommitされていません。

```
postgres=# commit;
ROLLBACK
postgres=# select * from test1;
 id | txt
----+-----
(0 rows)
```


## Oracleの場合

```sql
drop table test1 purge;
create table test1 (
  id number not null,
  txt varchar2(10),
  constraint pk_test1 primary key(id)
);

insert into test1 values(1, 'a');
insert into test1 values(2, 'a');
insert into test1 values(3, 'a');
insert into test1 values(3, 'b'); -- 主キーが重複
★ここで以下のエラーが発生する
行1でエラーが発生しました。:
ORA-00001: 一意制約(MUDR.PK_TEST1)に反しています
```

上のように主キーが重複してエラー発生後、以下のようにcommitすると正常に実行されたid=1,2,3のデータはcommitされています。

```
SQL> commit;
コミットが完了しました。

SQL> select * from test1;
        ID TXT
---------- ----------
         1 a
         2 a
         3 a
```


# 参考

- [PostgreSQLエンタープライズ・コンソーシアム アプリケーション移行調査編 2.5. トランザクションの取扱い](https://www.pgecons.org/wp-content/uploads/PGECons/2013/WG2/07_ApplicationMigrationResearch.pdf#page=9)
- [PostgreSQLエンタープライズ・コンソーシアム WG2活動報告書 移行ガイドブック](https://pgecons-sec-tech.github.io/tech-report/html_wg2_MigrationGuidebook/wg2_MigrationGuidebook.html#document-contents/wg2/wg2_MigrationGuidebook/assessment/incompatibleResearch_transaction)
Bootstrapに負けてCSSが反映されない？

# CSSにスタイルを記述してもスタイルが反映されない...

head部分の書き順を確認してみましょう。

cssのlinkの後にbootstrapのcssが記述されていませんか？

headタグの中に書いた記述は上から順に反映されていくので、後から記述したものの方が優先されます


### 最後に反映したいものを考えて記述していきましょう。
#Nuxt.js  ERROR  The "path" argument must be of type string. Received undefined                                                               

i missed config ( e.g see bellow, array in array  )

nuxt.config.js

```

export default {
  plugins: [
    ['~/plugins/foo.js']
  ]
}

```

```
$ yarn dev
yarn run v1.17.3

$ nuxt

   ╭─────────────────────────────────────────────╮
   │                                             │
   │   Nuxt.js v2.12.2                           │
   │   Running in development mode (universal)   │
   │                                             │
   │   Listening on: http://localhost:3000/      │
   │                                             │
   ╰─────────────────────────────────────────────╯

ℹ Preparing project for development                                                                                                  08:09:51
ℹ Initial build may take a while                                                                                                     08:09:51
✔ Builder initialized                                                                                                                08:09:51

 08:09:51

  at validateString (internal/validators.js:117:11)
  at Object.extname (path.js:1229:5)
  at node_modules/@nuxt/builder/dist/builder.js:5707:58
  at Array.map (<anonymous>)
  at Builder.normalizePlugins (node_modules/@nuxt/builder/dist/builder.js:5703:28)
  at async Builder.generateRoutesAndFiles (node_modules/@nuxt/builder/dist/builder.js:5665:31)
  at async Builder.build (node_modules/@nuxt/builder/dist/builder.js:5594:5)
  at async Object._buildDev (node_modules/@nuxt/cli/dist/cli-dev.js:102:5)
  at async Object.startDev (node_modules/@nuxt/cli/dist/cli-dev.js:60:7)
  at async Object.run (node_modules/@nuxt/cli/dist/cli-dev.js:47:5)
  at async NuxtCommand.run (node_modules/@nuxt/cli/dist/cli-index.js:2759:7)







```

![image](https://user-images.githubusercontent.com/13635059/80928411-2b2fd580-8ddf-11ea-8db9-2c377caae32d.png)

fix it 

```
export default {
  plugins: [
    '~/plugins/foo.js'
  ]
}
```


# Original by Github issue

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











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
String[] argsの使用方法

import java.util.*;

public class Main {
    
    int ii[];
    
    public static void main(String[] args) throws Exception {
        // プリミティブ型変数の場合初期値にはNULLが入っている、NEWしてインスタンスを生成してあげないと
        //lengthで数えてもNULLなのでエラーになる、argsは何も入ってないと[0]の配列を作るのでNULLではない
        //lengthすれば０を返し、argsを指定すればヌルではないのでクラス名とハッシュコードを返す
        main m=new main();
        Main Mainm=new Main();
        
        System.out.println(Mainm.ii);
        System.out.println(m.i);
    }
}

class main{
    int i[];
}
#node command run script file – Error: Cannot find module '/not-exist-file.js' ( internal/modules/cjs/loader.js )

- 存在しないファイルを実行しようとした時に、このエラーが発生した
- 実行ファイルを指定するとモジュール扱いになる？
- あまり親切なメッセージで教えてくれたりはしないっぽい

```
$ node --version
v12.16.1

$ node /not-exist-file.js
internal/modules/cjs/loader.js:985
  throw err;
  ^

Error: Cannot find module '/not-exist-file.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:982:15)
    at Function.Module._load (internal/modules/cjs/loader.js:864:27)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
    at internal/main/run_main_module.js:18:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}

```

# Original by Github issue

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











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
bashのファイル一覧表(markdown)をワンライナーで取得する

## 目的
- 何かのアプリを開発しているとき、作成したコマンド群の一覧表を作りたいことないですか。それを実現するワンライナーです。さっくり作りたいのでコメントをサースから取り出すとか完璧は求めないです。あくまで表の骨格が作れればいいと思っております。

## 方法
- `Markdown`は素晴らしい記法ですが表形式の手打ち作業は行が多くなると辛いですね。なので、`bash`と`awk`でサクッと作ります。
- `ll`は可読性の高い時間表示に設定します。

```{bash}
$ alias ll
alias ll='ls -l --time-style=+%Y-%m-%d\ %H:%M:%S'

$ ll
合計 300
-rwxrwxr-x 1 hoge hoge 959 2020-04-24 08:51:09 add_comment.cgi
...
 ```
- 考え方は`awk`の`printf()`で項目の区切りに`|`を入れるだけです。

### 作成したワンライナー

```{bash}
$ #基本形
$ ll *cgi |awk '{printf "|%02d|%s|%s|%s||\n",NR,$8,$3,$6}'
```
- 番号、コマンド名、owner(hoge)と修正日と説明文を入れる空欄を`|`で区切ります。
- 表のヘッダをつけたいならawk BEGIN{print ""}にコマンドを追加してもいいでしょう。
- 追加する文字列は`"|#|command名|owner|last update|content|\n| ---- | ---- | ---- | ---- | ---- |"`でOKです。

```{bash}
$ #ヘッダ追加
$ ll *cgi |awk 'BEGIN{print "|#|command名|owner|last update|content|\n| ---- | ---- | ---- | ---- | ---- |"}{printf "|%02d|%s|%s|%s||\n",NR,$8,$3,$6}'
```

## 結果

- 実行すると以下を得ます。

```{bash}
$ ll *cgi |awk 'BEGIN{print "|#|command名|owner|last update|content|\n| ---- | ---- | ---- | ---- | ---- |"}{printf "|%02d|%s|%s|%s||\n",NR,$8,$3,$6}'
|#|command名|owner|last update|content|
| ---- | ---- | ---- | ---- | ---- |
|01|add_comment.cgi|hoge|2020-04-24||
|02|change_passwd.cgi|hoge|2020-04-24||
|03|check_change_passwd.cgi|hoge|2020-04-24||
...
$ 
```

- これをMarkdownファイルに保存するもよし、TyporaなどのMarkdownエディタにコピペするもよし。`Typora`にコピペした画像を貼り付けます。

<img width="791" alt="markdown表.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178143/ab7d8440-2c51-8f4e-5a20-f3de33a92a99.jpeg">

- 誰かのお役に立てれば嬉しいです。
【JavaScript】乱数の作り方

#【JavaScript】乱数の作り方

###0～1未満の値を生成する
```js

    Math.random() * 1
    つまり
    Math.random()
```

###0～3未満の値を生成する
```js

    Math.random() * 3
```
小数点以下の値を含む
    
###0～3未満の整数（0,1,2）を生成する
```js

    Math.floor(Math.random() * 3)
```

切り捨てにMath.floorを使い小数点以下の値を含まない

###0～4未満の整数（0,1,2,3）を生成する
```js

    Math.floor(Math.random() * (1 + 3))
    つまり
    Math.floor(Math.random() * (4))
```

###0～max未満の整数（0,...,max）を生成する
```js

    Math.floor(Math.random() * (1 + max))
```

###min～maxの整数を生成する
```js
    Math.floor(Math.random() * (1 + max - min)) + min
```
###応用:6面ダイス
```js
    Math.floor(Math.random() * 6) + 1;
```
###応用:6面ダイスを2個振る
```js
    (Math.floor(Math.random() * 6) + 1) + (Math.floor(Math.random() * 6) + 1);
```
###応用:12面ダイス
```js
    Math.floor(Math.random() * 12) + 2;
```
##補足
上のような例示はRPGツクールMVのダメージ計算式に入れることもできます。

またRPGツクールMV側でもMath.floor(Math.random*引数)をまとめたMath.randomInt関数が用意されています。

```js

    Math.randomInt = function(max) {
        return Math.floor(max * Math.random());
    };
```
ダメージ計算式にMath.randomInt(6)+1と記述し、分散度を0%、攻撃タイプを必中にすることで1～6を出すことができます。

・分散度……ダメージの揺らぎになるRPGツクール側の要素。既定では20%。
・攻撃タイプ……物理攻撃、魔法攻撃、必中から成るRPGツクール側の要素。攻撃ミスの原因になる。既定では物理攻撃。

謝辞
@kuroudo119様
@trinitroterunon様
【JavaScript】平均の求め方

#【JavaScript】平均の求め方

##平均の求め方

配列(scores)と合計を格納する変数(sum)を用意

```js

    const scores = [10, 23, 34];
    let sum = 0;
```

forEachを使いsumに格納

```js

    scores.forEach(score => {
        sum += score;
    })
```

定数(average)に求めた平均の値を入れる

```js

    const average = sum /scores.length;
```

結果は22.3333...
求める形へと処理する。

```js

    console.log(Math.floor(average));//22　切り捨て
    console.log(Math.ceil(average));//23　切り上げ
    console.log(Math.round(average));//22　四捨五入
    console.log(average.toFixed(1));//22.3　小数点第一位で四捨五入
    console.log(average.toFixed(2));//22.33　小数点第二位で四捨五入
```
Ubuntu Anaconda 環境下でのdlibインストール方法について教えてください。

■環境
　Ubuntu18.04LTS 
　Anaconda1.9.12 
　Python3.7.6

■やりたいこと
　Anaconda環境で管理可能かつ、
　Python3.7.6で動作可能なdlibをインストール。

■質問
　ネットで色々dlib情報を収集しましたが、情報を見つけることができませんでした。
　ご存じの方がいらしましたら教えていただけないでしょうか？

　よろしくお願いします。

　以上
【JavaScript】find,filterメソッドの違い、使い方

#【JavaScript】find,filterメソッドの違い、使い方

##findメソッド
配列から条件に一致した最初の値を返す。

調査対象の配列.find((引数)=>{
  return 条件;
}

```js

    const numbers = [1, 2, 3, 4, 5, 6];
    const foundNumber = numbers.find((number) => {
     return number > 3;
    });
    
    console.log(foundNumber);//4
```

・findメソッドでは1つしか値を取得できない

引数、条件が1つの場合ここまで省略可能

```js
    const foundNumber = numbers.find(number => number > 3);
```

##filterメソッド
配列から条件に一致した値をすべて返す。

調査対象の配列.filter((引数)=>{
  return 条件;
}

```js

    const numbers = [1, 2, 3, 4, 5, 6];
    const filteredNumber = numbers.filter((number) => {
     return number > 3;
    });
    
    console.log(filteredNumber);//[4, 5, 6]
```

引数、条件が1つの場合ここまで省略可能

```js
    const filteredNumber = numbers.filter(number => number > 3);
```
Raspberry pi 4 に Ubuntu MATE を lightdm でインストールする

[Ubuntu 20.04 LTS Server を Raspberry Pi 4 にインストール](https://qiita.com/azumabashi/items/182f365cf7405156788c) ではGUIインストールの手前までをやってみました。

ここでは Ubuntu MATE をインストールしてみます。
作業日：2020年5月5日

次のコマンドを実行します。

```
sudo apt install ubuntu-mate-desktop
```

途中でディスプレイマネージャ gdm3、lightdm のいずれを選択するか聞いてきます。
lightdm を選択しておきました。

インストールが完了したら再起動します。

```
sudo shutdown -r
```
GUIが起動しました。
パスワードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/5c09d8f0-1ccc-763b-63a8-738040822317.png)

デスクトップが表示されます。左上の Activities をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/ec98b3bc-a326-b484-ad62-4ef22eab0cbb.png)

Show Applications をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/dfcff682-879b-01a0-8ccd-8f7b50d08267.png)

各種メニューが出てきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/31b63898-3fe7-4d44-b4a7-19e6ec6bce05.png)

初回の設定は右上の Setting から行うと使い勝手がよさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/5308e336-1348-9291-d484-27dc8f272563.png)

ここからWiFi、キーボードレイアウト、地域、日時などの設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/0b446440-d051-0cf7-9c08-7e528ef8e029.png)
OSXで.devドメインにアクセスできない問題

## 概要
.devドメインのページにアクセスできなくなった
>事前の調査でルータやプロキシに問題はなかった

## 原因
.devドメインに対してリゾルバが誤ったルートネームサーバを設定していた

```:dev
# Lovingly generated by Pow
nameserver 127.0.0.1
port 20560
```


## 解決方法

/etc/resolver以下にあるdevを削除する

```
sudo rm /etc/resolver/dev
```

## 参考
https://superuser.com/questions/1374892/dev-domains-dont-resolve
【JavaScript】文字列を調べる/操作するメソッド

#【JavaScript】文字列を調べる/操作するメソッド

##length
要素の数、文字数を数える。
用途：文字列の数、循環処理など

```js

    const arr ="12345"
    console.log(arr.length);//5

    const arr ="abcdef"
    console.log(arr.length);//6
```

##substring
指定範囲の桁の文字を取得する。
用途：範囲指定の判定など

substring(開始位置,終了位置)

```js

    const arr ="20191231"
    console.log(arr.substring(0,4));//2019
    console.log(arr.substring(4,6));//12
    console.log(arr.substring(6,8));//31
```

##join
配列、オブジェクトの値を1つに結合する。
用途：接頭辞、接尾辞の結合、要素から年月日表記への変換など

結合対象の配列.join.(区切りたい文字)

```js

    const arr =[2019, 12, 31];

    console.log(arr.join('/'));//2019/12/31
    console.log(arr.join());2019,12,31
```

##split
1つの要素を指定した区切り文字で、配列に分割する。
Joinの逆。
用途：文字列から配列を作る場合、時間計測など

```js

    const time = "23:30:59";

    console.log(time.split(":"));//["23","30","59"]
    console.log(time.split());//["23:30:59"]
```

分割代入を使った定数への格納。

```js

    const [hour, minute, second] = time.split(":");
    console.log(hour);//23
    console.log(minute);//30
    console.log(second);//59
```
ゼロから始めるLeetCode Day13 「338. Counting Bits」

#概要
海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

せっかくだし人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day12 「617. Merge Two Binary Trees」](https://qiita.com/KueharX/items/7466834c494bf4de6d90)

基本的にeasyのacceptanceが高い順から解いていこうかと思います。

# 問題
[338. Counting Bits](https://leetcode.com/problems/counting-bits/)

難易度はMediumです。
最近はTop 100 Liked Questionsから優先的に選んでいるので良問が多いっぽいです。数学的な知識があるともちろん有利ですが、仮になくてもじっくり考えれば正解にたどり着くような問題が多くてとても面白いです。

自然数`num`が与えられます。`0≦i≦num`の範囲にある全ての数値iの2進数表現に含まれる1の数を計算し、配列として返します。


この問題も問題文だけだとパッと見ん？ってなりますね。例を見てみましょう。

>Example 1:

>Input: 2
Output: [0,1,1]

こちらの場合は`num`として2が与えられています。
[0,1,2]を2進数に変換すると[0,1,10]になり、これらのそれぞれの値に含まれる1の数をカウントすると`011`、配列に変換すると[0,1,1]となります。こちらの配列を最終的に返します。

>Example 2:

>Input: 5
Output: [0,1,1,2,1,2]

こちらの場合は`num`として5が与えられています。
[0,1,2,3,4,5]を2進数に変換すると[0,1,10,11,100,101]となり、これらの値に含まれる1の数をカウントすると`011212`となり、[0,1,1,2,1,2]となります。

# 解法
まず、返すためのリスト、`ans`を最初に用意し、1からnum+1までの値を繰り返すfor文を使って考えてみましょう。

それぞれの数字に関して2進数変換を行い、1のカウント数をリストに追加し、最終的に最初に用意した`ans`を返します。
この問題で一番重要となるのはやはり2進数変換を行い、1の数をカウントするようなアルゴリズムでしょう。

`ans`のi番目を2で割り、その値をiを2で割った時の余りと足すとうまく変換されます。
何故なら、`num`の値が奇数であれば最後の桁が1となり右シフトを行うことで1を削除し、偶数の場合であれば必ず0となるため、右シフトを行っても同じ値の1となるためです。

こちらの例で考えてみると、例えば`num`が4の場合、

```Python
ans[4/2]+(4%2)
```
となります。
この場合、`ans[0,1,1,2]`の2番目、すなわち1ですね。その1と(4%2)の余りである0が足され、4を2進数変換した際の'100'の1の数である1がリストへと追加されます。

私は以下のように書いてみました。

```Python
class Solution:
    def countBits(self, num: int) -> List[int]:
        ans = [0]
        for i in range(1,num+1):
            ans.append(ans[i//2] + (i%2))
        return ans
# Runtime: 84 ms, faster than 72.90% of Python3 online submissions for Counting Bits.
# Memory Usage: 20.7 MB, less than 5.00% of Python3 online submissions for Counting Bits.
```

この問題は長い時間考え込んでしまいました。
もっとスパッと解法を思い付きたいですね。
【Python】競プロテンプレ【AtCoder】

現在(2020/05/05)使用している
**AtCoderなどの競プロ(Python用)のテンプレ！**
よかったら使ってください〜
（万が一間違いがあったらすいません！）



#競プロテンプレ
1行目は削除して提出することが多いと思うので、
(入力時で)必ず使用する`sys`とそれ以外のライブラリ
の2行に分けている！
また、`input()`より`sys.stdin.readline().rstrip()`の方が明らかに早い！！！
参考記事
[Pythonの知っておくと良い細かい処理速度の違い8個]
(https://www.kumilog.net/entry/python-speed-comp#input-%E3%81%A8-sysstdinreadline)

**(2020/05/17追記)**
`S()`の位置を`LS()`の上に移動(見栄えがよくなかったため)

```python:test.py
import bisect,collections,copy,heapq,itertools,math,numpy,string
import sys
def I(): return int(sys.stdin.readline().rstrip())
def LI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def S(): return sys.stdin.readline().rstrip()
def LS(): return list(sys.stdin.readline().rstrip().split())
N = I()
A = [LI() for _ in range(N)]
```

###※補足1〜ライブラリたちの主な使い道〜
**(2020/05/17追記)**
`np.argmax()`を追記

- **bisect**
    - `bisect()`
- **collections**
    - `deque()`
    - `Counter()`
    - `most_common()`
    - `defaultdict()`
- **copy**
    - `deepcopy()`
- **heapq**
    - `heapify()`
    - `heappush()`
    - `heappop()`
- **itertools**
    - `accumulate()`
    - `groupby()`
    - `product()`重複あり
    - `permutations()`重複なし(順列)
    - `combinations()`重複なし(組み合わせ)
- **math**
    - `gcd()`
    - `ceil()`
    - `factorial()`
- **numpy**
    - `fmax()`
    - `argmax()`
    - `vstack()`
- **string**
    - `ascii_lowercase()`
    - `ascii_uppercase()`
    - `lower()`
    - `upper()`
    - `swapcase()`

###※補足2〜テンプレ使用時の注意点〜
**(2020/05/11追記)**
[ABC167A](https://atcoder.jp/contests/abc167/tasks/abc167_a)
で以下のように文字受け取ると、エラーが出て焦った・・・

```python:NG.py
import sys
def S(): return sys.stdin.readline().rstrip()
S = S()
T = S()
print('Yes' if S==T[:-1] else 'No')
```

`T = S()`
のところで、
`S`は(直前で上書きされて)ただの文字列なのに、`S()`なんて使えないよ！とのエラー！
よくよく考えたら当たり前ですね・・・


こういう時は、以下のように工夫して対処しましょう〜

```python:OK1.py
import sys
def S(): return sys.stdin.readline().rstrip()
S,T = S(),S()
print('Yes' if S==T[:-1] else 'No')
```
これならいける！というか普通にこっちの書き方でよかった・・・

```python:OK2.py
import sys
def S(): return sys.stdin.readline().rstrip()
s = S()
t = S()
print('Yes' if s==t[:-1] else 'No')
```
変数を小文字(大文字の`S`以外)にする〜

おわり！
MacでDjangoとapache(httpd)を連携するぞ！！

# 環境
- Mac (Catarina)
- pyenv使用（今回はPython 3.6.2を使っています）
- anaconda3(mkdirで作成)の中にプロジェクトのmySiteとアプリのmyappを作成済みです

しまりす 太郎さんの
[Macでdjangoとapacheを連携させたい人生だった](https://qiita.com/chatrate/items/76041d23392a5a689532)
を参考にさせていただきました！

ただ解決できなかった所があるので、同じような境遇にいる人の助けになればと思い投稿しています！

初投稿ですが、分かりやすく伝えられるよう努めます。笑


#今回のあらすじ
- Python設定

- mod_wsgi周りのインストール

- apache設定

#Python設定
今回自分が使ったPythonのバージョンは3.6.2です。

ここはどのバージョンでも良いと思います。

ただ、

```
CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.2
```

のようにoptionをつけてインストールしたものである必要があります。

とゆうのも、

```
/Users/username/.pyenv/versions/3.6.2/lib/libpython3.6m.dylib
```

というファイルが無ければ、後々出てくるmod_wsgi.soがpythonを参照することができずエラーを吐かれてしまうからです。

ここがクリアできておらずDjangoのプロジェクトを作っている人は、上記の方法でPythonをインストールし、もう一度プロジェクトを作成してください。。

#mod_wsgi周りのインストール
`pip install mod-wsgi-httpd`

`pip install mod_wsgi`

でmod_wsgi周りのインストールをしてください！

こやつがapacheとDjangoを繋ぐ役割を担っています。


# apache設定
Macにはデフォルトでapacheが入っていますが、それを使うとダメっぽいので最新版をインストールします。

[Apache httpd を macOS に Homebrew でインストールする手順](https://weblabo.oscasierra.net/apache-macos-install-homebrew/)

がとても分かりやすかったです！

次に、

`/usr/local/etc/httpd/httpd.conf`

にコードを追加していきます。ここが最も重要です！


しまりす 太郎さんも仰られていますが、

[【Django入門】apacheを使ってサーバーを動かそう](https://www.sejuku.net/blog/27637)

でのhttpd.confに以下のような追記をすれば良いとゆうのは間違いです。

```
LoadModule /Users/username/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-darwin.so
WSGIScriptAlias / /Users/username/anaconda3/mySite/mySite/wsgi.py
WSGIPythonPath /Users/username/anaconda3/mySite
WSGIPythonPath /Users/username/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages
<Directory /Users/username/anaconda3/mySite/mySite>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
```

私がここで引っ掛かった所が3つあります。

１つ目は、1行目の引数が足りない事件です。正しくは、

```
LoadModule wsgi_module /Users/username/.pyenv/versions/3.6.2/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-darwin.so
```

のようにwsgi_moduleという引数がなければいけません。

２つ目は、5行目いらない事件です。以下のようにコメントアウトするか、消しましょう。

```
#WSGIPythonPath /Users/username/.pyenv/versions/3.6.2/lib/python3.6/site-packages
```

ここはしまりす 太郎さんの方では指摘されていなかった部分です！

自分の環境下だけ必要だったのかなー。

ちなみに、ここをコメントアウトしていないとlocalhostアクセス時に

```
500 Internal Server Error
```

とゆうエラーが吐かれました。

3つ目は、9,10行目が古い事件です。以下のように修正しましょう！

```
<Directory /Users/username/anaconda3/mySite/mySite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
```

ここもしまりす 太郎さんの方では指摘されていなかった部分です！仕様が変わってますね〜

ちなみに、修正せずにいるとlocalhostアクセス時に

```
403 Forbidden
```

とゆうエラーが吐かれました。

ここは特定のIPアドレスからのアクセスだけを許可したりできるので、適宜調整してください！

ここでやっと、

```
sudo brew services restart httpd
```

を叩くと無事Djangoのチュートリアルページが表示されるはずです！

restartになっているのは修正したhttpd.confを読み込み、反映するためですね。

#終わりに

ここまで読んでいただきありがとうございました！
この記事では取り上げていませんが、プロジェクトのsettings.pyのALLOWED_HOSTSを設定していないなどでアクセスできないという問題だったり、他にも色々躓いたりしました。やはり大変ですね〜
ですが自分なりに試行錯誤して解決できたときはやはり最高です。笑
もし不備があれば、ご指摘のほどよろしくお願いします！
初心者によるプログラミング学習ログ 306日目

#100日チャレンジの306日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
306日目は
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>306日目　6～8h<br>・xdデザインカンプからのサイト模写（メンターさん課題）6～7ｈ<br>・xdデザインカンプからの架空LP模写 1日目1h（<a href="https://twitter.com/ririru_123?ref_src=twsrc%5Etfw">@ririru_123</a>）<br>・↑はHTMLのヘッダー部分～プロフィール部分のあたりまで。<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1257406752741404672?ref_src=twsrc%5Etfw">May 4, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
rails s できない。Spring was unable to lacate the root of your project.について

#rails sできない。

Gemfileにspringを入れると"Spring was unable to locate the root of your project.There are no Gemfile present."と表示されてrails sが出来なかった。

<br><br>
#springをGemfileから外して解決。
とりあえずはこれでrails sができるようになった。しかし、springの設定が分からなかったので現在保留中。
このボリュームは現在暗号化中のため、インストールできませんと表示されOSのアップデートに２日もかかった話


　

こんにちはAkiです。
今回はこのボリュームは現在暗号化中のため、インストールできませんと表示されOSのアップデートに２日もかかった話について書いていきたいと思います。

　

知り合いからmacbook proを譲り受けたので、ちょうどいい機会だったので一からシステムを構成していこうと思いOSのアップデートを行ってみたところ下記のようなエラーでOSをアップデートすることができませんでした。


<h2>“このボリュームは現在暗号化中のため、インストールできません”

　

初期化状態のMacにOSのCatalinaをインストールしようとしましたが

“このボリュームは現在暗号化中のため、インストールできません”


と表示されアップデートすることがができませんでした。

　

<h2>解決策
　

結論としてFileVaultの暗号化が終わってから次の作業をしないとOSのアップデートができません。

　<img width="780" alt="fileVault.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/e0ef6988-f501-18dd-c343-005122049157.png">


かなり長いですがひたすら待ちます。

　


　

暗号化が終わるとFileVaultをオフがポップアップできるようになるのでFileVaultをオフにします。

　

FileVaultをオフにするまでまた半日から１日ほどかかります。

　

FileVaultがオフになったら、リカバリーモードでユーティリティーからMacintoshのマウントを解除します。

　

再度Macを起動し、確認してみると無事にCatalinaをインストールできました。

　


　

<h2>まとめ

　

今回はこのボリュームは現在暗号化中のため、インストールできませんと表示されOSのアップデートに２日もかかった話について書いていきました。

　

初期状態からOSをアップデートするまでに割と時間がかかるので、もし急ぎで移行が必要な場合は、バックアップから移行することをお勧めします。


Qiita初投稿で慣れていないのでわかりづらかった方はこちらへどうぞ

https://akiblog.org/cannot-update-os/
[漏洞通告]CVE-2020-11652/CVE-2020-11651/SaltStack存在两个高危漏洞

### 漏洞描述
`Saltstack`是基于Python开发的和C/S架构的开源自动化运维工具,具备远程任务执行,配置管理和监控等功能.近日,亚信安全网络攻防实验室监测到国外安全团队披露`SaltStack`框架存在两个安全漏洞：`认证权限绕过漏洞（CVE-2020-11651）`、`目录遍历漏洞（CVE-2020-11652）`.

### 漏洞编号
CVE-2020-11651
CVE-2020-11652

### 漏洞威胁等级
高危

### 影响范围
SaltStack < 2019.2.4
SaltStack < 3000.2

### 漏洞验证
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/f9bcbd37-90e3-11d8-562e-2f2cea15575f.png)

### 修复建议
1.安装官方补丁
https://repo.saltstack.com
2.升级到最新版本

### 时间轴
[0] 2020/05/01 Charlie Osborne披露漏洞
[1] 2020/05/05 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告

### Reference
https://www.zdnet.com/article/saltstack-salt-critical-bugs-allow-data-center-cloud-server-hijacking-as-root/
【GitHub】Deploy keysを登録しようとしたらKey is already in useと言われた件

具体的な対応手順は書いていません。意思決定の参考情報としてお使いください。

# 事象

デプロイキーを複数のリポジトリで使い回すことはできないようです。

https://help.github.com/ja/github/authenticating-to-github/error-key-already-in-use#deploy-keys
> キーがリポジトリにデプロイキーとして一度添付されたら、他のリポジトリで使用することはできません。 

# 対応手段

対応手段は以下のようなものがあります。

1. リポジトリ別に鍵を作成し、登録する
1. デプロイ用のユーザを作成し、リポジトリに紐付ける

1は手軽に行える反面、SSH設定が必要で、扱うリポジトリが増えるごとに鍵が増えていきます。

2はマシンユーザーと呼ばれ、GitHubが推奨する方法のようです。
https://developer.github.com/v3/guides/managing-deploy-keys/#machine-users
注意すべき点として、個人リポジトリの場合は、collaborator(共同編集者)としてマシンユーザーを追加することになるため、読み取り専用権限を与えることはできません。
読み取り専用権限を与える場合には、organizationを作成し、リポジトリを移譲する必要があります。
https://help.github.com/ja/github/setting-up-and-managing-your-github-user-account/converting-a-user-into-an-organization
AWSで作る運用費を限りなく抑えたWEBサービスのシステム構成

大学時代の友人と３人で、とあるWEBサービスを作ることになったので、
設計するついでにシステム構成を晒したいと思います。
※本記事は本WEBサービスの設計情報となるため、内容が変更・更新されることがあります。

## 要件定義
* AWSを利用したシステム構成で、運用費を可能な限り安くする
    * 可能な限りサーバーレス構成で、フルマネージドなサービスを活用する
    * 固定費のかかるサービスは利用しない
* 運用費は抑えるが、サイトのレスポンスは妥協せずサクサク動作させる
* 落ちない・止まらない構成を実現する
* メンテナンス不要な構成を実現する
* アプリケーションコードはPythonで書く


## システム構成
※[こちらの記事](https://qiita.com/nave-m/items/68425f476b254a1a47b0)で紹介されている[draw.io](https://www.draw.io/)を利用して作図しています。

### フロントアプリはHerokuにホスティング＋バックエンドはAPIGW＋Lambda
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241764/8b9f6d55-e5cf-80f7-6b5c-2d3c3766c549.png)

構成のポイント

* Herokuの無料dynoにPythonの軽量フレームワークであるFlaskアプリをデプロイする
* 静的コンテンツのレスポンス速度向上のため、無料のCloudFlareを導入する。
* FaceBookと連携してユーザの友達関係を使った表示制御を想定する
* Herokuに乗せるフロントアプリからAPI呼び出しを行い、バックエンドの処理と連携する
* ユーザのファイルをHeroku経由でS3にアップロードする。
* プロジェクトを実施するのに必要なファイルはGoogleDriveなどのリンク情報を登録する想定。
vim plugin作成に入門するためにやったこと(主にtest, docの話)

GW、ちょうど時間があったのでvim pluginのhello worldをしてみました。

vim pluginの作成に関するドキュメントは充実している感覚でしたが、test周りだったりci周りなどどうするのが良さそうかあまりわからなかったので、自分なりにやったことをまとめます。

## この記事で書くこと

vim plugin作成周りは以下の記事が凄く参考になるので、そちらを参照してください。

https://qiita.com/Sa2Knight/items/6b26d35af571c239da31
https://qiita.com/bonjin6770@github/items/31e60707ecf2ad6c4496

今回はplugin作成後のtestだったりdocだったりの話を書きます。

## サンプルプロジェクト

足し算をするだけの関数を用意したpluginをサンプルとして作りました。
READMEに利用方法が書いています。
keymapなどは特に変更していないので、autoloadファイルのみ見ればOKです。
autoloadファイルに、`one_plus_one#plus` という関数を作っています。
今回はこれを対象にテストしたり、ciを回します。

https://github.com/mitubaEX/one_plus_one

## testを書いて実行する

今回はtestディレクトリ配下にtestファイルを配置しています。

https://github.com/mitubaEX/one_plus_one/blob/master/test/one_plus_one.vim

今回はtest frameworkとして、[vim-themis](https://github.com/thinca/vim-themis)を利用しています。

他にも[vspec](https://github.com/kana/vim-vspec)などがあると思います。
僕はrspecを書く機会があるので、個人的にvspecが好みだったりします。

実行方法はhelpに書かれている通り、bin/themisをPATHを通して実行できるようにします。
ciでは雑にcloneしてきてtestを実行するので、今回はlocalでもそのようにtestを実行します。

**※間違えてcommitしたくないので、.gitignoreの設定は忘れずに**

### Makefileを設定する

test frameworkをcloneしてきて、testを実行するフローをMakefileを用いて行います。
ciではこれを呼ぶようにします。

https://github.com/mitubaEX/one_plus_one/blob/master/Makefile

### ciの設定

今回はgithub actionsを利用します。
make allで、cloneとtest実行を行います。
これでspecが通ることが確認できればOKです。

https://github.com/mitubaEX/one_plus_one/blob/master/.github/workflows/main.yml

余談ですが、test framework側でテストが落ちたら、終了ステータスを変更してくれるのでciは自動的に落ちてくれます(便利)

## docを書く

基本的に有名なリポジトリのdocを拝借すれば良さそうです。

https://github.com/mitubaEX/one_plus_one/blob/master/doc/one_plus_one.txt

今回は、[easymotion/vim-easymotion](https://github.com/easymotion/vim-easymotion)のdocなどを参考しました。

これでplugin managerでinstallするとhelpも見れるのでよりpluginを利用しやくすなります。

## 終わりに

test, docを書くことでよりpluginの開発、利用が便利になるので、是非書くべきだと思います。
僕もこれから何かしらpluginを作る時はtestなど書いていこうと思います。

そして今回の諸々の情報を元に自分用のテンプレを作りました。
これからvim pluginを作りたいってなった時に利用したいなと思います。

https://github.com/mitubaEX/create_vim_plugin