OmniAICreator/Qiita-1.07M huggingface dataset:
Vue.js ページング処理

Vue.jsでのページング処理実装(書き殴り。ライブラリを使ってもっと綺麗に書きたい...)。

```vue:app.js
new Vue({
    el: '#app',
    data() {
        return {
            // テストデータ
            data: [''],
            // 表示ページ番号
            page: 1,
            // 1ページあたりの表示件数
            perPage: 9,
            // ページ
            pages: [],
        };
    },
    methods: {
        // テストデータ取得
        getTestData() {
            for (let i = 0; i < 200; i++) {
                this.data.push({
                    No: `${i + 1}`,
                    Name: `Test Data#${i + 1}`
                });
            }
        },
        // データの取得件数に応じてページ数を設定
        setPages() {
            let numberOfPages = Math.ceil(this.data.length / this.perPage);
            for (let index = 1; index <= numberOfPages; index++) {
                this.pages.push(index);
            }
        },
        // ページ番号に合わせてテストデータを抽出
        paginate(data) {
            let page = this.page;
            let perPage = this.perPage;
            let from = page * perPage - perPage;
            let to = page * perPage;
            return data.slice(from, to);
        }
    },
    computed: {
        // 表示するテストデータを抽出
        displayedData() {
            return this.paginate(this.data);
        }
    },
    watch: {
        // データ更新に合わせてページ情報更新
        data() {
            this.setPages();
        }
    },
    created() {
        this.getTestData();
    }
})
```

```html:paging.html
<body>
    <div id="app">
        <div>
            <nav>
                <ul>
                    <li>
                        <button type="button" v-if="page != 1" @click="page--"> Previous </button>
                    </li>
                    <li>
                        <button type="button" v-for="pageNumber in pages.slice(page-1, page+5)" @click="page = pageNumber"> {{pageNumber}} </button>
                    </li>
                    <li>
                        <button type="button" @click="page++" v-if="page < pages.length"> Next </button>
                    </li>
                </ul>
            </nav>
            <table>
                <thead>
                    <tr>
                        <th>No.</th>
                        <th>Name</th>
                    </tr>
                </thead>
                <tbody>
                    <tr v-for="data in displayedData">
                        <td>{{data.No}}</td>
                        <td>{{data.Name}}</td>
                    </tr>
                </tbody>
            </table>

        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js"></script>
    <script src="./app.js"></script>
</body>
```
MacでコマンドラインからChromeを開く

毎回Dockとかに置いてあるアイコンをダブルクリックするのは面倒なので。
openコマンドを使うとイケる。

```bash
open /Applications/Google\ Chrome.app/
```

エイリアスを貼っておくと便利。

```bash

alias chrome='open /Applications/Google\ Chrome.app/'
```
2つのGitリポジトリをローカル経由で超簡単に同期する

# 概要
ソースのホスティングサービスを、オンプレ版からクラウド版へ移行したり、BitbucketからGitHubへ移行したりするときがあると思います。しかも一時的に同時並行で開発を進めなきゃいけないなんてこともあります。

同期する作業はミスると怖いですし、手順を覚えるのも面倒、かつやり方を忘れたころにまた同期しなきゃいけない時期が来てしまうということもあって、備忘として記事にしておくことにしました。

この記事は、シェルスクリプトを使って、簡単に2つのGitリポジトリ間を同期する方法を紹介します。

# 前提
- リモートに同期元と同期先2つのブランチが存在していること（GitHubとBitbucketなどホスティングサービスはなんでもOK）
- 英語表記では、同期元をsrc（sourceの略）、同期先をdest（destinationの略）と表記しています

# 初回にやること
### 1. 同期元をローカルにgit clone --mirror
- `git clone --mirror <src_repo>`
- `e.g.) git clone https://github.com/myname/src-repo.git`

### 2. 同期元のディレクトリに移動して、リモートに同期先を登録
- `git remote add <dest_remote_name> <dest_repo>`
- `e.g.) git remote add dest https://bitbucket.org/teamname/dest-repo.git`

### 3. 同期用のシェルスクリプトを準備して実行
同期元のディレクトリから1つ上の階層に上がって、下記のシェルスクリプトを作成します。

```git-sync.sh
#!/bin/bash
   
# 同期元
src_name=src-repo
# 同期先（手順2で指定したものと同一のものを指定）
dest_remote_name=dest
   
if [ -d ./$src_name ]; then
  cd $src_name/
  git fetch origin # 同期元リモートのデータをローカルに取得
  git push --mirror $dest_remote_name # 同期先リモートにローカルのデータを反映
  cd ..
else
  echo 'no target directory'
fi
```

スクリプトが準備できたら、TerminalやCMD上で`./git-sync.sh`と実行すると、同期が完了します。

# 2回目以降にやること
同期元で変更が生じたら、同期元で`git push`後、シェルスクリプトを実行しましょう。

# おわりに
この記事では取り上げていませんが、チームメンバー全員が同じように同期作業を行わなければならないという状況では、JenkinsやCodeBuild、またはcronなどを用いて自動実行するのがおすすめです。
Chrome: オレオレ証明書でもセキュリティ警告画面が出ないようにする方法

オレオレ証明書を使うと、CAに認証されていない証明書なのでブラウザにセキュリティの警告がでる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77729/0bb65875-7486-2d0b-ecd5-20990fa894ff.png)

これが出ないようにするには、今までは自分のマシン上でその証明書を信頼するように設定するだけで良かった

この手の記事はすでにたくさんあるが、Chromeの仕様が最近変わり、今までのやり方では足りないので最新のやり方をまとめてみました。

## 証明書に`SAN(Subject Alternative Name)`を設定する

Chromeでは仕様が変わり、現在では[アクセスするドメイン名の証明書の一般名(CN)を判定せず、`SAN(Subject Alternative Name)のDNS Name`の値でアクセスするドメインとの一致を判定する動作になっている](https://stackoverflow.com/questions/40951939/chrome-accept-self-signed-localhost-certificate)。
なので、`SAN`が設定されるよう証明書を作らないといけない。


opensslの設定ファイル`openssl.cnf`を探す。`CentOS7`だと`/etc/pki/tls/openssl.cnf`にあるが、OSやインストールの仕方によって違うはず

```
find /usr/lib -name openssl.cnf # 例
```

見つけたら、編集前にオリジナルをコピー

次に、`alternate_names`にドメイン名をセットして`openssl.cnf`に追加する. どこに追加してもOK

```
[ alternate_names ]

DNS.1        = example.com
DNS.2        = www.example.com
DNS.3        = mail.example.com
DNS.4        = ftp.example.com
```

次に、`[ v3_ca ]`を同じファイル上で探して変更。

```
subjectAltName      = @alternate_names
keyUsage = digitalSignature, keyEncipherment
```

次に、`copy_extensions`のコメントアウトを外す

```
# Extension copying option: use with caution.
copy_extensions = copy # コメントアウトを外す
```

この設定の後で、オレオレ証明書を発行する。ここまでに設定ファイルで文法エラーがあれば、`openssl`コマンドでエラーがでるはず。

```
openssl genrsa -out private.key 3072
openssl req -new -x509 -key private.key -sha256 -out certificate.pem -days 730
```

## オレオレ証明書が常に信頼されるようにする

生成された`certificate.pem`をローカルに持ってきて、ダブルクリックします。ポップアップが開くので、詳細設定で「常に信頼」されるようにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77729/8bed3680-f6fe-31f0-e32c-43077780287b.png)

この辺は他の記事で言われているやり方と同じ

これで、セキュリティの警告がでなくなり、鍵マークが見えるようになったと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77729/18c56b03-8bd8-771a-ae68-5df678b48080.png)


## まとめ
* `SAN`がセットされるようにopensslの設定を変えてから、証明書を発行する。
* 後は以前と同じように、ローカルマシン上でその証明書を信頼するよう設定を変える。

## 参考
https://stackoverflow.com/questions/21488845/how-can-i-generate-a-self-signed-certificate-with-subjectaltname-using-openssl
https://www.ipentec.com/document/windows-chrime-error-net-err-cert-common-name-invalid-using-ssl-certificate-signed-with-local-ca
アプリ開発のフロー

アプリの開発の流れを順番に書いていく
#企画
企画の段階では、アイデアを出し合って、ターゲットのユーザーの選定、どのような目的でこのアプリを開発するのかを決めていく。
ここで必要なものが企画書になる。
###企画書
企画書とは、新規のプロジェクトのアイデアなどを誰が見ても見易くまとめたものである。
####企画書の内容
1.サービスのゴールを明確化する
アプリを作成する目的を考え、その目的までどのようにすればたどり着けるか示す。

2.ターゲットユーザーを明確化する
アプリの目的を考えて、どのようなターゲットに現状を踏まえてアプローチしていくか示す。

3.ユーザーにメリットをもたらす機能を決定する
ユーザーに役に立つと思った機能を仮説検証し、ターゲットとしているユーザーにヒアリングする。

4.ネイティブアプリかWebアプリかを決める
ユーザーの意見や実装したい機能から選択する。

5.対応するプラットフォーム、デバイスを決める
iosかAndroidかと対応する端末を書く。

6.最低限実装する機能を決める
最低限の機能でリリースしユーザーの反応を見て、アップデートで改善していく。
（最低限の機能で実装するのは、入れたいものを入れてたら時間がかかってしょうがないから）

7.収益プランを立てる
課金、インストールするとき、機能拡張など

#デザイン
どんなデザインにするかを考える時間
#要件定義
要件定義とは、アプリに実装する機能や必要な性能を決め、具体的にどのように実装するかアプリの全体像や機能を検討して要件をブラッシュアップしていき、要件定義書を作成する。
要件定義書は設計図みたいなものなので、細かな部分まで記す。
そのほかに機能一覧やインフラ構成図がある。
#基本設計
基本設計では、アプリの構成や画面のレイアウト、デザイン、操作方法を具体的に決めていきます。
####使う書類
・I/F仕様書・API仕様書
・テーブル定義書
・シーケンス図
・画面定義書/UI仕様書
・単体テスト項目書
#詳細設計・プログラミング・単体テスト
プログラミングに必要なものな情報や手順、データの処理を細かく決めていく。
単体テストでは単体テスト項目書に結果を記入していく。
#QAテスト
バグがないか、設計通りに動くかを確認する。
#プロモーション
アプリを認知してもらうために自社のサイトやSNS、外部サイトで宣伝していく。
#リリース
ストアへの申請や公開後にユーザーが快適にアプリを利用にできるようにするために何かあったときのために運用マニュアルを作る。
自宅のPCでCOVID-19の治療に貢献しよう。「Folding@homeプロジェクト」

##Folding@homeプロジェクトとは
Folding@homeは、分子動力学シミュレーションによりタンパク質のフォールディングを解析するための、ボランティア・分散コンピューティングプロジェクト。世界中の家庭にあるパーソナルコンピュータ・ゲーム機・スマートフォンなどの身近なマシンを、分散コンピューティング技術によって科学研究に利用するプロジェクトである。(wiki抜粋)

このプロジェクトが、2020年の2月末にCOVID-19に対する取り組みを発表したようです。私たちのCPU/GPUのリソースを分けてあげることで、COVID-19の治療を早めることができる可能性があります。

3月26日には、Folding@homeの総演算能力は1EFLOPSに達しました。FLOPSはコンピューティング性能の指標で、1EFLOPSは**秒間100京回の演算**ができることを意味します。

NVIDIAがTwitterで呼びかけをしたことも影響しているのかもしれません。
https://twitter.com/NVIDIAGeForceJP/status/1242678690351374342?s=20

もちろん1人が提供できるリソースには限りがありますが、ただ家でパソコンを放置していれば世界に貢献できるシステムです。世界中の人が協力することでスパコン並みの演算力が実現するなんて、夢がありますね。

##参加方法
Folding@homeプロジェクトに参加するには、専用のソフトウェアをインストールをダウンロードします。

DLリンク↓
https://foldingathome.org/start-folding/

下記リンクからOSにあったインストーラーをダウンロードしてください。
インストールが完了するとブラウザ上で以下のような画面が開きます。
![スクリーンショット (74).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555310/037b6650-e3c5-64a6-8f0b-55fc0867318f.png)
画面左下のボタンで提供するか選択できます。

##[番外編]Microsoftが出したシェルスクリプトを使う
4月7日にMicrosoftが安全にPCのリソースを提供するためのシェルスクリプトをGitHubに公開いしました。
Windowsサンドボックス上でFolding@homeを動かすスクリプトです。

まずはじめに、BIOSから仮想化支援機能を有効化する必要があります。デフォルトではDisabledになっているケースが多いです。
BIOSのCPU configurationからVirtualization Technology(VT-X)を有効化してください。

続いてWindowsのコントロールパネル→プログラムと機能→Windowsの機能の有効化または無効化から
仮想マシン プラットフォームにチェックを入れてください(再起動が必要です。)
![スクリーンショット (78).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555310/89fa56eb-a313-7c92-3f3f-f260c785b07d.png)

以上の設定ができたら、下記スクリプトをコピペして"install_folding_sandbox_on_host.ps1"で保存してください。
https://github.com/microsoft/Windows-Sandbox-Utilities/blob/master/Folding%20In%20Sandbox/install_folding_sandbox_on_host.ps1

その後**管理者権限で実行した**Powershellから
`Powershell.exe -ExecutionPolicy Bypass -File .\install_folding_sandbox_on_host.ps1`
ユーザーごとに指定したい場合は
`Powershell.exe -ExecutionPolicy Bypass -File .\install_folding_sandbox_on_host.ps1 -username <username>`
を実行すればサンドボックス上で安全にリソースを提供することができます。

##まとめ
春休みが5月の頭まで延びて暇な人も多いと思いますが、家で簡単に社会貢献できるのにやらない手はないと思います。

早く収束しますように。
PHPで時刻（00:00:00）を秒に変換する方法

##はじめに

仕事柄、頻繁に時刻であったり記録（●●分●●秒など）を扱う機会が多いです。

PHPで時間（時刻）を計算するには、UNIXタイムスタンプの値を操作することで求めることができますが、「時刻じゃなくて記録（36時間24分56秒などもあり）なんだよな～」、「一度秒にしてから四則計算してこんなことをしたいんだよな～」と思うことが多々ありました。

大したことは全くしていませんが、誰かの参考になれば幸いです。


##時間（00:00:00）から秒へ変換
```php:php
// 時間から秒へ変換(00:00:00→00000秒)
function hour_to_sec(string $str): int
{
    $t = explode(":", $str); //配列（$t[0]（時）、$t[1]（分）、$t[2]（秒））にする
    $h = (int)$t[0];
    if (isset($t[1])) { //分の部分に値が入っているか確認
        $m = (int)$t[1];
    } else {
        $m = 0;
    }
    if (isset($t[2])) { //秒の部分に値が入っているか確認
        $s = (int)$t[2];
    } else {
        $s = 0;
    }
    return ($h * 60 * 60) + ($m * 60) + $s;
}
```
※追記：@campbel2525様よりご指摘いただきまして、関数の引数/戻り値に対して型を指定しました。

秒に変換してしまえば後は煮るなり焼くなりしてお好きなように :)

念のため、再度時間表記（0:00:00）に戻すやり方も記載させていただきます。


##秒から時間(0:00:00)へ変換
```php:php

// 秒⇒時間：分：秒へ変換(0:00:00表記)
function sec_to_hour(int $sec): int
{
    $hours = floor($sec / 3600); //時間
    $minutes = floor(($sec / 60) % 60); //分
    $seconds = floor($sec % 60); //秒
    $hms = sprintf("%2d:%02d:%02d", $hours, $minutes, $seconds);
    return $hms;
}
```
※追記：@campbel2525様よりご指摘いただきまして、関数の引数/戻り値に対して型を指定しました。

後半に出てきた**sprintf**
**指定したフォーマット（形式）で文字列を生成**という感じですかね。
（たまにExcelの表記とかで見ますね）

(型指定子と呼ばれる部分)
**「%」**：第二引数から順番に入れていく部分
**「2」**：桁数（0ありなら03や05などで表記してくれる、無い場合は空白で埋めてくれる）
**「d」**：10進数の整数を指定

この部分を「%2d時%02d分%02d秒」とすれば「1時間23分45秒」などの結果を得ることもできます。


##備考
**ミリ秒**が発生するような場合は上記では**正確な結果が得られません。**
~~stropsで無理やり無くしても...~~
~~ミリ秒ぐらい別に誰も困らないと思っている自分~~

また時間を見つけて記載させていただきます...


##最後に
まだまだコードの書き方含めまして拙い部分が多々あるかと思います。

『もっとこんな方法もあるよ！』

『このやりかたの方が処理が速い』

などありましたら是非コメント欄にて教えていただければ幸いです。


##参考にさせていただいたサイト
>- [PHP 秒数を時分秒に変換](https://oc-technote.com/php/php%20%E7%A7%92%E6%95%B0%E3%82%92%E6%99%82%E5%88%86%E7%A7%92%E3%81%AB%E5%A4%89%E6%8F%9B/)
>- [【PHP入門】sprintf関数の使い方まとめ（0埋め、スペース埋め）](https://www.sejuku.net/blog/24090)
iPhone実機のUDIDを確認する

Appium等でiPhoneの操作を自動化するにあたって、UDIDを調べる必要が出てくる場合があります。

やり方も複数あるので、お好みの方法で。

## Apple Configurator2を使う

App Storeからダウンロードできます

<img width="1329" alt="スクリーンショット 2020-04-08 17.00.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46492/b2b671f8-f099-308f-2f78-4dac79fb41f4.png">


### 手順

まず、iPhoneの実機をMacにUSB接続します。

次に、AppleConfigurator2を起動します。
すると、画面に接続済みのiPhoneが表示されます。

![スクリーンショット 2020-04-08 17.03.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46492/993367e8-987f-ec4d-f1ed-8390f87ae785.png)

ここで、iPhoneをダブルクリックすると、詳細の確認画面に遷移します。

![スクリーンショット 2020-04-08 17.04.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46492/2c81703a-f90e-a50c-8aed-bbfd74a82de5.png)
技術情報、の中程に書いてあります。

## instrumentsコマンドを使う

xcodeが入っていれば（xcrunが実行できれば）こちらでも。

``` zsh
$ instruments -s devices
Known Devices:
MacBook Pro [5F95GCE2-8501-7331-F268-8W13257FT540]
iPhone (13.3.1) [eacad1b2q80560deaewc5abbff2h71bf70418725]
Apple TV (13.4) [22E6713E-D695-4AEB-A647-CBB35E25AD2B] (Simulator)
Apple TV 4K (13.4) [E64976D3-85E0-485B-864B-004930ADD7DB] (Simulator)
Apple TV 4K (at 1080p) (13.4) [17D7BFA4-60BC-4A5C-BAF2-3D01582A7854] (Simulator)
Apple Watch Series 4 - 40mm (6.2) [53411B07-07BA-4FE8-91BC-49CA03CAAD19] (Simulator)
Apple Watch Series 4 - 44mm (6.2) [766EA736-F997-425A-B1EB-08343043E00A] (Simulator)
iPad (7th generation) (13.4) [B9619C39-63F7-4EB0-8E42-F133C1DAE795] (Simulator)
iPad Air (3rd generation) (13.4) [801CF53E-77C6-4537-8E9D-ED7F70ECC55D] (Simulator)
iPad Pro (11-inch) (2nd generation) (13.4) [F06114E6-36DB-4529-BDA3-61487229A224] (Simulator)
以下略
```

シミュレータの場合は末尾に`Simulator`とついているので、これがないもの、今回の例で言うと上から２番めが実機のUDIDです。
curlで -bash: -o: command not found

curlコマンドにはファイル保存する-oオプションがありますが、urlに&があるとshellのバックグラウンドプロセス実行として解釈されてしまい意図通りに動かない。(バックグラウンド処理されるだけなので標準出力に結果は表示される)

```lang:動かない例
$ curl https://www.googleapis.com/books/v1/volumes?q=search+%E6%8A%80%E8%A1%93&maxResults=10 -o result.json
[1] 2950
-bash: -o: command not found
```

&をエスケープするかurlをクォーテーションで囲むことで解決できる

```lang:動く例
$ curl "https://www.googleapis.com/books/v1/volumes?q=search+%E6%8A%80%E8%A1%93&maxResults=10" -o result.json
```
[Node.js]requireで、確実にあるのに中身が空になってしまう(エラーは出ない)

##環境
node：v8.11.3

##プログラム
こんな感じでリポジトリがあるとして、確かにファイルはある。なかったらエラー出ますからね。。。

```javascript:hogeRepository.js
const userRepository = require('../user/userRepository.js');
console.log(userRepository)//出力結果は、{}

```

##原因
この指定しているuserRepository.jsでもrequireを書いているプログラム「hogeRepository.js」をrequiteしてしまっていた。

つまり、お互いをrequireをしてしまうと、どちらかは空になってしまうようだ。

## 解決方法
そもそもお互いをrequireし合っていたのはミスだったのでそれ直したらなおった。
Databricks Introduction について簡単にまとめてみた

##はじめに
今回は Databricks Introduction という動画の内容をまとめてみました。
本動画のリンクは下記参照。

■リンク先
[Introduction to Databricks](https://www.youtube.com/watch?v=WaxMj5_SLUI)



##Databricks とは
###Databricks の特徴
Databricksとは、Databricks 社が開発した 統合データ分析プラットフォームです。 Databricks を利用することで、ユーザは誰でも簡単に高度な解析ソリューションの構築とデプロイが可能となります。
<img width="900" alt="スクリーンショット 2020-04-08 11.18.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/624d920e-ed7f-1f06-8d19-57e31287cfd5.png">

■Databricks の利用手順と利用方法
① データの入ったストレージ（Cloud Storage、Data Warehouse、Delta Lake など）を用意
② ストレージに クラウド上の Apache Spark と Databricks が接続
③ 接続後は以下のサービスを利用することができます

- Notebook や Dashboard など Workspace の作成
- サードパーティ の BI ツールの使用
- Spark アプリのカスタマイズ



###Apache Spark のコンポーネントについて

<img width="650" alt="スクリーンショット 2020-04-08 11.26.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/9d3d19f8-762e-1e8e-4a0d-158984b00765.png">
Apache Spark には以下のコンポーネントが含まれております
■コンポーネント

- Spark Core API
- Spark SQL + DataFrames
- ストリーミング
- MLlib (機械学習)
- GraphX (グラフ計算)

###クラスタの立ち上げ
クラスタは、本番ETLパイプライン、ストリーミング分析、アドホック分析、機械学習などのデータエンジニアリング、データサイエンス、データ分析のワークロードを実行する一連の計算リソースと構成のことです。
<img width="551" alt="スクリーンショット 2020-04-08 15.51.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/3fcaa0a0-0409-7350-2b41-c5a8689646a9.png">
クラスタの立ち上げも簡単で、下記の項目を選択してクリックするだけです。
■選択する項目

- クラスタ名
- Spark のバージョン
- インスタンスタイプ


###豊富なビジュアルデザイン
<img width="974" alt="スクリーンショット 2020-04-08 11.29.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/e7caa455-6404-da84-70ac-dc150db9b6aa.png">
Databricks では以下の様なビジュアルデザインに関する機能があります。

■ビジュアルデザイン機能

- Databricks 内でビジュアル化が可能（エクスポート不要
- 円グラフ、棒グラフ以外にも豊富なビジュアルの選択が可能



###notebook へのアクセス制限
<img width="771" alt="スクリーンショット 2020-04-08 11.30.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/74960425-a765-8469-9c8a-b1d74432980f.png">
notebook には、以下の様な制限を設けることが可能です。

■設定可能な制限

- 指定した notebook の公開設定
- 指定した notebook へのアクセス可能なユーザの指定
- アクセスできるユーザの notebook にたいする操作制限


###コメント機能
<img width="956" alt="スクリーンショット 2020-04-08 11.30.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/7fb214e4-3f84-fbcf-e874-a142f60a0207.png">
ユーザ同士でコメント機能を用いたコミュニケーションも可能です。
これにより、作業の引き継ぎやちょっとした伝達も簡単に行うことができます。


###クラスタの編集と新規作成
<img width="554" alt="スクリーンショット 2020-04-08 16.12.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/515bf8d3-e1b4-43e1-ddc4-d5553c5a331c.png">
Databricks の左端のタブにある「Jobs」を選択することで、既存のクラスタの再編集や、既存のクラスタの設定を用いたまま、新規にクラスタを作成することもできます。

##おわりに
Databricks Introduction についてのまとめは以上となります。
Databricks との特徴と機能について簡単にまとまっており、Databricksをサッと理解するのにとても良い動画なので、リンク先の本動画もぜひ見て下さい。
HoudiniでのHandleの軸を設定するよ+α

#はじめに
###概要
Houdini使い始めの頃、軸の向き(Mayaで言うAxis Orientation)の設定場所がわからなくて苦労したことがあったので備忘録的なもの。

###環境
Houdini17.5.569

#設定の場所
Mayaと同じ感覚で左側のここをクリックしても何も起きない。
どうやら右クリックで表示/非表示の切り替えはできるらしい。
※厳密にはScene View上に表示されているHUD Slider等のパラメーターの表示/非表示の切り替えである。
<img width="787" alt="スクリーンショット 2020-04-08 16.21.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613929/84fb1d96-c577-536e-9edc-d33b35ef90b1.png">

ではどこだろう？
正解はHandleの上で右クリック。これだ！
<img width="514" alt="スクリーンショット 2020-04-08 16.21.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613929/211af66c-1eb2-2e71-659a-236f08c0a920.png">

Align Handleこれだ！
どうやらMキーで切り替えできるらしい。これで直感的に切り替えができる。
各ハンドルについて詳しく見ていこう。

#ハンドルの種類
##Object
オブジェクトに沿った軸。現時点での回転量がわかる。便利。
注意したいのは、変形を実行しているノードのオブジェクト軸が表示されるので、それより上流のノードで作成したRotate等は反映されない。変化値が0であるならWorld軸と一致する。これをずらすにはPivotを移動する必要がある。
##World
ワールド空間座標に沿った軸。回転を加えた後に移動させたい時とかに便利。
モデリングとかしているとよく使う気がする。
##View
今見ているカメラに対しての軸。カメラから見た配置とかを決めるのにいい役割をしてくれる。
この時注意すべき点として移動のZがboxで表示されるのと、rotateのX,Yがhandleで調整できなくなることがある。
##C-Plane
*Construction Plane*に沿った軸。*Construction Plane*の設定は右上のGridアイコンの下のアイコンを左クリックで表示/非表示を設定、右クリックすると調整できるようになる。
##Component
選択したコンポーネントに沿った軸。Pointの場合はNの方向に、Primitiveの場合は面の垂直方向にZ軸が設定される。複数選択の場合はベクトル平均値の向きになる。

この5種類の軸がHoudiniで扱える軸の種類だ。
Mキーで切り替えられて、結果はScene Viewの下に表示されるのでそこで確認すると勝手が良い。

#その他便利な機能
##Yキー(handleの種類の変更)
translate=>translate/rotate=>scaleの順番で変化する。
瞬時に切り替えられて便利。
##controlキー(step値の適用)
handleによる変化の値をステップにできる。
パラメーターでは数値の位ごとに調整できるが、stepでは5ずつとか45ずつ調整できる。差分を作るのに便利。
##Pキー（各種パラメーター表示）
そのハンドルに関連するパラメーターを表示してくれる。
Step値などは**handle Dialogs**で設定できる。**op Dialogs**は**Parameters**を表示してくれるのでとっさの時に使える機能。
handleの右クリックからも表示させることができる。
##",insertキー(pivotの変更)
滅多に使うことはない（大体エクスプレッションを組む。）が、Scene Viewだけの直感的なモデリングでは使うと便利かもしれない。
##;,:キー(オブジェクトスナップ/整列)
参照オブジェクトの表面に接地させる。これもノードで組むことが多いが、pivotと同じように直感的なモデリングでは使うと便利かもしれない。
詳しくは公式記事で:https://www.sidefx.com/ja/docs/houdini/model/aids.html

#おわりに
トランスフォームの軸の変更は***Mキー***。
トランスフォーム系のhandleでの操作はダイレクトに数値を設定するため非破壊的ではないことが多く、使う機会が少ないかもしれないが、直感的な操作とエクスプレッションを適所で使うことで作業効率が上がるだろう、きっと。それでは。しゃーした〜。
BitbucketからGitHubへのプライベートリポジトリ移行時の失敗例

## ログイン画面がループする問題

「[Githubのprivate repositoryに、bitbucketのprivate repositoryをimportする](https://qiita.com/Kur1hara/items/8ae5cf4c4922e12580e6)」という記事を参考にリポジトリの移行をしてみたが、以下のメッセージ画面でBitbucketのログイン情報を入力したにもかかわらず、再度ログイン情報を求められて移行できない。

> Your old project requires credentials for read-only access. We will only temporarily store them for importing.

ググってみたところ「[インポート時のBitbucketのログイン情報はアカウント名ではなくメールアドレスを入れると成功する](https://www.cotegg.com/blog/?p=2167)」という記事を見つけ、もしやと思い、**今まで入力していたメールアドレスではなくアカウント名を入力したところインポートが成功した**。

いつの間に成功パターンが逆になったのか不明だが、問題は解決したので良しとする。

## 何かよくわからないけれども一部のリポジトリのインポートが失敗する例

Web上のインポートツールを使うと、何が問題で失敗したのかわからない簡素な「faild」メッセージが表示されることがある。
試しにCUIで手動で移行してみたところ以下のメッセージが表示された。

> remote: error: GH007: Your push would publish a private email address.
> remote: You can make your email public or disable this protection by visiting:
> remote: http://github.com/settings/emails

親切すぎて多少余計な心配という気もするが素直に指示に従って設定を修正してみたところWeb上のインポートツールからも成功するようになった。
GUIで失敗したらCUIで試すというノウハウはいつでも役に立つ。
【PHP】スクラッチでTwitterクローンを11日間で作成してみた

#このアプリについて
デモは以下をご覧ください。
[コードへのリンク](https://github.com/otake619/twitter_clone_app)

![デモンストレーション.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427892/72dc084e-29fc-636a-1955-b40ee78b2d3c.gif)


#このアプリの機能について
・ログイン/ログアウト
・文章投稿
・投稿削除
・投稿編集
・通知機能(フォローされたアカウント名表示、リプライしたアカウント名表示)
・フォロー/フォロワー表示
・フォロー/フォロー解除

#データベースの仕組み

データベース名【twitter_clone】

テーブル名一覧
・tweets
・users
・followers
・reply
・notice

カラム名一覧【usersテーブル】
・id : 主キー
・name ：アカウント名
・email ：アカウントのメールアドレス
・password ： アカウントのパスワード
・created_at : datetime型で投稿された日時を保管

カラム名一覧【tweetsテーブル】
・id : 主キー
・user_id : usersテーブルのidと連携している各アカウント一意のid
・created_at : datetime型で投稿された日時を保管
・tweet : text型で投稿したメッセージを保管

カラム名一覧【replyテーブル】
・id : 主キー
・reply_user : リプライしたuserのidを保管
・reply_message : text型で投稿したリプライを保管
・replied_tweet_id : リプライしたtweetのidを保管

カラム名一覧【followersテーブル】
・id : 主キー
・user_id : ログインしているアカウントのid
・following_id : フォローしたアカウントのid

カラム名一覧【noticeテーブル】
・id : 主キー
・created_at : datetime型で投稿された日時を保管
・user_id : ログインしているアカウントのid
・follow_check : bool値でフォロー通知のためのカラム(初期値はfalse)
・following_id : フォローしたアカウントのid
・reply_check : bool値でリプライ通知のためのカラム(初期値はfalse)
・reply_user : リプライしたアカウントのid

#アプリの作成工程
・1日目：要件定義
・2日目：データベース設計、コーディング
・3日目-9日目：コーディング
・10日目：フロント改修作業
・11日目：可読性upのためのコード改修作業

#苦労した点とどの様に対処したか

・phpもデータベースも触ったことがほとんどない初心者だったため、
pdo接続からSQLの操作まで一連の流れをつかむのに時間がかかった。
これに対する対処はググりまくって感覚を掴むしかなかった。

・バグ修正の仕方もよく分からなかったが、エンジニアの友人に
エラー文を逃げずに読むこととvar_dumpを使用してその都度
変数の中身を可視化してどの記述がおかしいか特定するように
助言されたためそれを実行した。

#作成した感想
書籍を淡々と読むだけの学習よりかは桁違いに成長を実感した。
完成した時の喜びは半端ではなかった。

#おわりに
つたない記事ですが、最後まで読んでいただきありがとうございました。
次はAmazonクローンやfacebookクローンなどを作ろうと思います。
機会がありましたら、また記事をupするのでよろしくお願いします！
チーム開発（商品詳細編集、削除、編集画面で画像表示）

画像表示の記述
https://gyazo.com/e6c951a879df5745d7c33297a4000357
自分ではわからずチームのメンバーにやってもらい完成

自分で調べた参考サイト
https://yuuma-pg.hatenablog.com/entry/20190617/1560747797
https://qiita.com/gakinchoy7/items/ac1d8e64e33c3ddd377b
https://qiita.com/mylevel/items/bae2204f8a40ff1d2d37
[GCP]Cloud FunctionsのログをCloud Logging(Stackdriver Logging)に出力する方法（Python）

# はじめに
Pythonで書いたCloud FunctionsのログをCloud Logging(Stackdriver Logging)に出力する方法を記載しています。

# 手順
以下のように書きます。
`cloud_logger.setLevel`で指定したレベル以上のものがCloud Loggingに記録されます。

```python
import logging
import google.cloud.logging
from google.cloud.logging.handlers import CloudLoggingHandler

client = google.cloud.logging.Client()
handler = CloudLoggingHandler(client)
cloud_logger = logging.getLogger('cloudLogger')
cloud_logger.setLevel(logging.DEBUG) # defaults to WARN
# cloud_logger.setLevel(logging.INFO) # defaults to WARN
cloud_logger.addHandler(handler)

cloud_logger.debug('debug')
cloud_logger.info('info')
cloud_logger.warn('warn')
```

requirements.txt には以下2つを記載してください。（バージョン番号は省略しています）

```
google-cloud-logging
google-cloud-core
```

`google-cloud-core`を書かない場合は以下のエラーがでました。

```
ERROR: (gcloud.beta.functions.deploy) OperationError: code=3, message=Function failed on loading user code. Error message: __init__() takes 2 positional arguments but 3 were given
```

# 参考
Integration with Python logging module
https://googleapis.dev/python/logging/latest/stdlib-usage.html

Python Logging Module Handler
https://google-cloud-python.readthedocs.io/en/0.32.0/logging/handlers.html
Ruby on Railsのチュートリアル ~第2章Toyアプリケーション~

# はじめに
webアプリケーションを作るための学習記録
（マッチングアプリを作る予定）

こちらのチュートリアルを片っ端から進めていく
【Ruby on Rails チュートリアル】
https://railstutorial.jp/

# 第2章Toyアプリケーション
## まとめ
- Scaffold機能でコードを自動生成すると、Webのあらゆる部分からモデルデータにアクセスしてやりとりできるようになる
- Scaffoldは何よりも手っ取り早いのがとりえだが、これを元にRailsを理解するには向いていない
- RailsではWebアプリケーションの構成にMVC (Model-View-Controller) というモデルを採用している
- Railsが解釈するRESTには、標準的なURLセットと、データモデルとやりとりするためのコントローラアクションが含まれている
- Railsではデータのバリデーション (validation) がサポートされており、データモデルの属性の値に制限をかけることができる
- Railsには、さまざまなデータモデル同士を関連付けを定義するための組み込み関数が多数用意されている
- Railsコンソールを使うと、コマンドラインからRailsアプリケーションとやりとりすることができる

## 所感
- RESTもうちょっと理解したい。
- Scaffoldすごい。POC的に簡単に作るときには重宝しそう
- railsのwebフレームワーク（MVCモデル）の簡潔さに感動している、MとVとCが明確で、余計なもののなさを感じる


## 途中参考にしたページ
- herokuにgit pushしたURLを開くと、Method Not Allowed と表示されてしまう
https://qiita.com/kodai_0122/items/a1f01b18bb3e0ddde62a

- 覚えておくと超便利！Ruby on Railsのscaffoldの使い方【初心者向け】
https://techacademy.jp/magazine/7204

- rails: before_actionとは
https://qiita.com/weedslayer/items/c3ab7ad37d5a1e325989

- Rails ルーティングの基礎とRESTful
https://qiita.com/Tamitchao/items/771e64f4753ff541d444

## 使用したコマンド
rails _5.1.6_ new toy_app
bundle install --without production
bundle update
git init
git add -A
git commit -m "Initialize repository"
git remote add origin git@github.com:アカウント名/リポジトリ名.git
git push -u origin --all
cd /home/ec2-user/environment/toy_app
rails server

git add -A
git commit -am "Add hello"
git status
heroku create リポジトリ名
git push heroku master

rails generate scaffold User name:string email:string
rails db:migrate
rails server
rails routes

rails generate scaffold Micropost content:text user_id:integer
rails db:migrate
rails routes

rails console
first_user = User.first
first_user.microposts
micropost = first_user.microposts.first
micropost.user

git status
git add -A
git commit -m "Finish toy app"
git push
git push heroku
heroku run rails db:migrate
環境分析の手法

# Webマーケティングとは
Webを中心に行われるマーケティングがWebマーケティング

[マーケティング](https://ja.wikipedia.org/wiki/マーケティング)

**マーケティングの究極の目的はセールスを不要にすることである。
マーケティングが目指すものは、顧客を理解し、製品とサービスを顧客に合わせ、おのずから売れるようにすることである。
出典：「マネジメント」　P.F.ドラッカー**

# 環境分析とは
Webマーケティングを行う際に、まずはじめに「環境分析」を行う
環境を把握することで、次の(Webマーケティング)施策につなげる！

例)
　・顧客のニーズは？
　・ビジネスを取りまく市場は？
　・どんな競合がいるのか？
　・自社の強みは？

※下記に記載する分析手法のゴールは**商品を購入すること**

# ユーザー
商品を購入してくれるユーザーをよく知ることが大切
→　**誰に売るのかを決めないと戦略は立てられない！**

### ペルソナ分析
商品を購入する 「理想のユーザー」 を設定するフレームワーク

プロジェクトの関係者が協力してペルソナを作成することによって、
自社が提供する価値を共有でき、**ユーザー像がより明確化**される

■設定する項目
・年齢
・家族
・住まい
・仕事
・ライフスタイル
・対象商品やサービスに対する意識や行動
・情報接触の傾向

### カスタマージャーニーマップ
ユーザーの行動程をジャーニー(旅)に見立てたフレームワーク

ユーザーが商品を認知し、興味を持ち、最終目標(購入)に達する前後の行動傾向とその背景を推測する
クライアントと認識共有するためにマップ化して表現したもので、
**ユーザー視点の理解**や**関係者間の認識整理**に有効で、回遊設計を行う目安となる

※参考画像を探していたら見つけました↓
[カスタマージャーニーマップ作製ツール](https://www.lucidchart.com/pages/ja/examples/customer-journey-mapping-software)

### 4C分析
顧客視点の4要素で分析するフレームワーク
※超簡単に言うと、マーケティングで有名な4P分析の顧客視点版

| 4C分析       | 4P分析|
|:-----------------|:------------------|
| Customer Value （顧客の価値）|Product （商品）|
| Cost to the Customer （顧客の負担コスト）|Price （価格）|
| Convenience （利便性）|Place （流通）|
| Communication （コミュニケーション）|Promotion （販売促進）|

# 外部環境との比較
当然ですが…ユーザーは自社以外にも複数のウェブサイトを見ながら最終的に購入するか決める
**競合する商品と比較して、どう異なるのか**伝える必要がある

- リアルでの競合
 - 同業他社
- ウェブ上での競合
 - ユーザーが参考とするウェブサイト（個人のブログや、ニュースサイトなど）

### 5フォース分析
競争要因別に対象と基準を明確にする分析
上記をもとに自社の収益を得られるポジションを決めるフレームワーク

自社の業界を中心として、下記の力関係が働くことに注目する

- 競争業者（直接競合）
 - 同業他社
 - 値引きとコストカットで利益率が下し、市場自体の魅力が下がる可能性がある

- 買い手（顧客）
 - エンドユーザー
 - 買い手の交渉力が強まると、値下げ圧力などで自社の利益を圧迫する
 - 様々な企業から提供されているコモディティ化された商品では買い手の力が非常に大きな脅威となる

- 供給業者
 - 仕入先
 - 供給業者の交渉力が強まると、自社の利益を奪っていく
 - 例）インテルvsコンピューターメーカー

- 代替品（間接競合）
 - 自社を含む産業の商品が、異なる商品にとって代わられてしまう脅威
 - 例）スマホvsデジカメ、音楽プレーヤー

- 新規参入業者
 - 参入障壁が低く、既存業者の力が弱い場合は、新規参入が容易で競争が激しくなる
 - 新規参入者の脅威は、業界への参入障壁の高さに関わる
 - 新規参入者によって業界構造は一気に変化する可能性がある

### SWOT分析・クロスSWOT分析
もともとは経営資源の最適化を図る経営戦略策定方法の一つ

SWOT分析であげた項目は「状況」であり、実際に使える分析結果ではないため、
さらにクロスSWOT分析を行い該当事業の戦略として落とし込む

#### SWOT分析
- 強み
 - 自社が持つ目標達成に貢献しうる組織の特長
 - なぜユーザーが自社商品を利用してくれるか？
- 弱み
 - 自社が抱える目標達成の障害や弱点となりうる組織の特質
- 機会
 - 自社のチャンスに見える外部環境要因です
 - 政治動向、市場の変化など
- 脅威
 - 自社の障害となる外部環境要因です
 - 政治動向、市場の変化など

#### クロスSWOT分析

- 積極化戦略
 - 自社の強みを使って機会を活かす施策
- 差別化戦略
 - 自社の強みで脅威による悪影響を切り抜ける施策
- 段階的戦略
 - 機会を活かすために自社の弱みを補強する方法を考える
 - 段階的に弱みを改善してチャンスを取り逃がさないようにする施策
- 専守防衛・撤退
 - 自社の弱みを理解し、脅威による影響を避ける、もしくは最小限にすることを考える

※実際のやり方は以下サイトが参考になると思います　↓
[SWOT分析のやり方](https://blog.kairosmarketing.net/marketing-strategy/swot-analysis-20131127/)

### 参考文献
[改訂版・ウェブ解析士 認定試験公式テキスト2020（第11版）]
(https://www.waca.associates/jp/study/courses/materials/textbook/)
新人君向けの課題（うるう年判定プログラム）

フレッシャーズの皆さん、教育担当の皆さんジャンボ！！！！

有望な新人君がシステム開発部に入ってきたのでPHPの課題を出してみました。

Linux上でbash出来る、PHPを少しだけできるとのことだったので少し難しい課題にしてみました。


## 課題

```php
    /**************************************************
     * 課題１: うるう年判定
     *
     * ・起動引数で入力した年がうるう年か平年か判定し結果を出力する
     * ・起動引数が西暦でない場合は、エラー内容を出力する
     * ・try-catch、throw Exceptionを使用する
    **************************************************/
```

## 模範解答（になってる？）

```php
<?php
    try {
        $year = isset($argv[1]) ? $argv[1] : null;
        $is_leap_year = false;
        $result = 0;

        /*
         * 起動引数チェック 
         */
        if (2 != $argc) {
            throw new Exception('引数が不正です');
        }

        if (!is_numeric($year)) {
            throw new Exception('引数が西暦ではありません');
        }

        /*
         * うるう年判定
         */
        // 4で割り切れるか？
        if (0 == $year % 4) {
            // うるう年
            $is_leap_year = true;

            // 100で割り切れるか？
            if (0 == $year % 100) {
                // 平年
                $is_leap_year = false;

                // 400で割り切れるか？
                if (0 == $year % 400) {
                    // うるう年
                    $is_leap_year = true;
                }
            }
        } else {
            // 平年
            $is_leap_year = false;
        }

        /*
         * うるう年判定
         */
        $msg = "$year 年は、うるう年";
        $msg .= $is_leap_year == true ? "です" : "ではありません";
        $msg = "\033[0;36m$msg\033[0m";

    } catch (Exception $e) {
        // エラー
        $msg = "\033[0;31m".$e->getMessage()."\033[0m";
        $result = 1;
    } finally {
        // うるう年判定結果表示
        echo "\033[7mうるう年判定結果:\033[0m $msg\n";
    }

    exit($result);
?>
```

## 動作検証

![2020-04-08_16h13_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537228/fd5630da-29fc-7de0-190f-3ac579dcea0b.png)

出力時の色は遊びですｗ
　
　
　

まだ正式配属前なので　https://prog-8.com/　をやっておいてねーと言っておきました。

本当だったら研修カリキュラムを用意したいのですが、教育担当の私もてんてこ舞いで時間が無くネットの学習サイトを活躍しようかしら。
　
　
　

現場からは以上です。
pdftopng(xpdf)コマンド実行時に、Syntax Errorが出る

## 環境
- macOS Catalina v10.15.4
- xpdf v4.02

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

[xpdf - 公式](http://www.xpdfreader.com/)

```
$ brew install xpdf
```

日本語ファイルで実行すると、`Syntax Error`が出る。

```
$ pdftopng "test.pdf" "./"
Syntax Error: Unknown character collection 'Adobe-Japan1'
```

意訳すると、文字フォント`Adobe-Japan1`が使われてるけど、どういったものかわからない。というエラー。
エラーが発生してもファイルは作成されるが、正常に変換されていないかもしれないためフォント対応が必要。

## フォント対応
v3系は記事が見つかるが、その対応では、v4系には効果がなかった。
以下の手順でエラーが出現しなくなった。

1. `http://www.xpdfreader.com/download.html`から`xpdf-japanese`をDLして解凍する。
    - `$ curl https://xpdfreader-dl.s3.amazonaws.com/xpdf-japanese.tar.gz -o 'files.tar.gz'`
    - `$ tar -zxvf files.tar.gz`で解凍する
2. 解凍後の`xpdf-japanese`配下のファイルを全て、`/usr/local/share/xpdf/japanese`に配置する
    - `$ mkdir -p /usr/local/share/xpdf/japanese`
    - `$ mv ./xpdf-japanese/* /usr/local/share/xpdf/japanese/`
    - `$ rm -rf ./xpdf-japanese files.tar.gz`
3. `add-to-xpdfrc`を`$HOME/.xpdfrc`に追記する。
    - `$ cp /usr/local/share/xpdf/japanese/add-to-xpdfrc $HOME/.xpdfrc`で設定を反映する

これは、1の手順でDLした`xpdf-japanese`ディレクトリ内のREADME(英語)に記載されている公式の方法であるため、READMEを見たほうが確実。
シンボルと%記法

###%s
シンボルの作成

```ruby:ruby
%s!i love soccer!  
%(i love soccer)
#=> :"i love soccer"
```

###%i
シンボルの配列を作成

```ruby:ruby
%i(soccer baseball basketball)   #=>  [:soccer, :baseball, :basketball]
```

###to_sym　＆　to_s
シンボル化と文字列化

```ruby:ruby
string = 'soccer'
string.to_sym  #=>  :soccer

symbol = :baseball
symbol.to_s  #=>  "baseball"
```
【UE4】Construction Script とは【UnrealEngine】 


コンストラクションスクリプトとは
--------------
オブジェクトを配置・移動などの変更をした時に呼び出されるイベント

C++のコンストラクタに書いた時の挙動と全く同じ
ゲームを実行しなくても結果を反映できるところがポイント。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/cf328218-5db3-742b-2f67-4863a272225a.png)

-------------
[コンストラクションスクリプトの使いどころ](https://historia.co.jp/archives/4785/)

[もんしょの巣穴](http://monsho.blog63.fc2.com)
[AndroidStudio git連携]新規ブランチでpushしてもgithubに反映されない

### 状況
新しくプロジェクトを作り、git連携しました。
masterブランチではうまくいっていたのですが、新しくdevelopブランチを作成し、pushしたらgithubに反映されなくなりました。

### 環境
AndroidStudio3.2.1

### 確認したこと
1. masterブランチはpushした内容がgithubに反映されていることを確認済み
2. developブランチのpushは成功している
3. developブランチをpullすると過去にpushした内容を取得できる
4. 2でpushしたはずのgithubリポジトリにdevelopの変更内容は反映されていない

### 結論　
originのURL設定が想定していたものと違っていました。
以前使用していたリポジトリ設定が残っていたようで、githubとoriginの設定先が違うものになっていました。
![スクリーンショット 0032-04-08 14.59.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/615320/51777557-6819-d5a9-0390-ccb342b2b873.png)
HelpApplicationリポジトリにpushしたいのに、sampleリポジトリにpushする設定になっちゃってます…。

###対処
ターミナルからgithubとoriginの設定先を同じものに変更
>参考
https://neet-rookie.hatenablog.com/entry/2020/02/19/152652

pushして無事にgithubに反映されていることが確認できました！
hue APIをたたいてみる

いつものとおり、自分のただのメモです

#用意するもの

- hue bridge[V1] [V2]どちらでもOK
- パソコン
- Wi-Fiルータ

ちなみに、ウチにあるのはV1ですが、音声操作やサポートなどが見捨てられています。（2020/04/08）

#手順
##その１　ローカルIPを探す
IPアドレスをFINGなどのAppで探してもOKですが、面倒なのでブラウザで以下にアクセスすると、ブリッジのIPを割り出してくれます。

https://discovery.meethue.com/

アクセスすると、以下の感じでIPが見つかります。

```
[{"id":"ブリッジの固有ID","internalipaddress":"192.168.3.8"}]
```

##その２　デバッグページを開く

その１動揺にブラウザで、以下のURLにアクセス。
無論、IPはブリッジのIPに書き換えてね
http://192.168.3.8/debug/clip.html

アクセス出来ると以下が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256408/79f7b10b-48f4-f178-eef7-f71ef71e6ec4.png)


##その３　usernameの設定
ここでは実際にusernameは設定しません。ランダムな値をコピーするだけです
　
URL欄と、Message Body欄に以下を入力して”POST”

URL欄

```
/api
```

Message Body欄(hogehogehueは適当に入力してね）

```
{"devicetype": "hogehogehue"}
```

すると、errorでブリッジのリンクボタン（真ん中のでかいボタン）を押せ言われる

```
[
	{
		"error": {
			"type": 101,
			"address": "",
			"description": "link button not pressed"
		}
	}
]

```

もう一度リンクボタンを押下した直後にPOSTするとSuccessされます。
username部分をコピーします。（usernameを設定することも出来ますが、ここでは割愛）

```
[
	{
		"success": {
			"username": "VGx8pNJ9IVIWqNAhNHM4xw4CRKLmiiy1r0URwQM8"
		}
	}
]
```

##その４　ライトをOnOffしてみる

URLとMessageを以下の様に入力してPUTします。（POSTではないので注意）
/lihgts/直後の数字がライトのIDです。
URL:

```
/api/さっきのusername/lights/1/state
```

Message Body:

```
{"on":true}
```
Offするときは、{"on":false}です。

成功すると、Successが返ってきます。

```
[
	{
		"success": {
			"/lights/1/state/on": true
		}
	}
]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256408/98d57568-96a4-153f-ecd3-95da6fecbbe6.png)


##その５　その他
基本的には、URLとMessageをゴニョゴニョします。
詳しくはhue apiを見てね
https://developers.meethue.com/develop/get-started-2/
Laravel6 + Tinymce 4.9.1 画像を本文に楽々簡単アップロード

##画像アップロードを実装にトークンを忘れずに##

Tinymceドキュメント通りに実装すると419エラーになります。やっぱり〜。お約束通りそうだよね。
アップロード系でライブラリ探してきて中身理解せずに入れるの怖いし自分で解決したいのが本音の心境。そこで。
images_upload_url: '/upload?_token={{csrf_token()}}',ってする事で、419エラーから免れます。URLに引数付ければOKです。
またエラー500が表示される時は、ポスト先のクラスの中身をLog::debug（)などを使って、エラー内容を調べてバグを潰して下さい。
セレクターは、クラス指定にしておけば、指定のテキストエリアだけTinymceを反映できます。


```
<script type='text/javascript'>
        tinymce.init({
            selector : '.editor',
            height: 500,
            setup: function (editor) {
                editor.on('init change', function () {
                    editor.save();
                });
            },
            plugins  : [
                'advlist anchor autolink autoresize autosave charmap code colorpicker',
                'contextmenu directionality emoticons hr image imagetools importcss insertdatetime image legacyoutput link lists',
                'media nonbreaking noneditable pagebreak paste preview save searchreplace stickytoolbar',
                'tabfocus table textcolor textpattern toc visualblocks visualchars wordcount'
            ],
            toolbar  : 'formatselect bold italic underline forecolor backcolor| alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image | code',
            menubar  : true,
            element_format : 'html',
            relative_urls : false,
            branding: false,
            language : 'ja',
            image_title: true,
            automatic_uploads: true,
            images_upload_url: '/upload?_token={{csrf_token()}}',
            file_picker_types: 'image',
            file_picker_callback: function(cb, value, meta) {
                var input = document.createElement('input');
                input.setAttribute('type', 'file');
                input.setAttribute('accept', 'image/*');
                input.onchange = function() {
                    var file = this.files[0];

                    var reader = new FileReader();
                    reader.readAsDataURL(file);
                    reader.onload = function () {
                        var id = 'blobid' + (new Date()).getTime();
                        var blobCache =  tinymce.activeEditor.editorUpload.blobCache;
                        var base64 = reader.result.split(',')[1];
                        var blobInfo = blobCache.create(id, file, base64);
                        blobCache.add(blobInfo);
                        cb(blobInfo.blobUri(), { title: file.name });
                    };
                };
                input.click();
            }
            });
    </script>
```

##サーバサイド##
キー名が、恐らくfileでポストが入ってきていると思います。configフォルダのfilesystemで設定している名前を使って保存したら、パスをjsonで戻すというシンプルなもの。
ルーティングの設定は忘れないように設定したらよいです。

```
    /**
     *  画像アップロード
     */
    protected function uploadImage(Request $request)
    {
        $imgpath = request()->file('file')->store('パス', 'public');
        return json_encode(['location' => imgpath]);

    }
```

JBImageプラグインもいいですが、JBImageプラグインはCIフレームワークが入っているし、こちらの方が保存先の変更なども分かりやすいし、実装も簡単なのでこれで使っていこうと思います。

参考にしていただいて、サクッと実装してみて下さい。でわでわ。
each の基本３

##環境,前提
Ruby 2.5.1
MacOS Mojave Ver.10.14.6

本記事はRubyがインストールされた前提の記事です。
Rubyをインストールしたあと、とにかくRubyをいろいろ触ってみて慣れていくための記事です。お役に立てば幸いです。


# eachをハッシュで使う

[each文の基本2](https://qiita.com/TOMARU4400/items/ca4fcda76f6097a52152)の続きです。eachをハッシュで使ってみます。ハッシュのキーと値を順番に取り出すときもeachが使えます。
変数（ブロックパラメータ）を２つ用意すればキーと値を順番に取り出せます。

#その前に式展開
**#{}の形は式展開**といい、#{}に中に式や変数を入れるとその式や変数が文字列の中に展開されます。

```sample.rb
name = "Yamada"
puts "私の名前は#{name}です。"

```
実行結果は以下のようになります。

```:Tarminai
私の名前はYamadaです。
```
#ではそれを踏まえて
```sample.rb

vegetables = {"ニンジン": 80, "タマネギ": 60,"ジャガイモ": 50}
vegetables.each do |key, value|
 puts "#{key}は#{value}¥です。"
end

```




出力結果は以下のようになります。

```:Tarminai
ニンジンは80¥です。
タマネギは60¥です。
ジャガイモは50¥です。
```
#解説

今回はkey, value,の２つの変数（ブロックパラメータ）を用意しました。

keyと言う変数には配列vegetablesのキー（ニンジン・タマネギ・ジャガイモ）が順番に代入されます。

valueの変数には配列vegetablesの値(80・60・50)が順番に代入されます。

#ハッシュロケット
ちなみにこう書くこともできますが**=>ハッシュロケット**は古い記法ですので使わないようにしましょう。

```sample.rb
vegetables = {"ニンジン" => 80, "タマネギ" => 60,"ジャガイモ" => 50}
vegetables.each do |key, value|
 puts "#{key}は#{value}¥です。"
end
```
ハッシュから配列、配列からハッシュ

###ハッシュから配列
to_aメソッド

```ruby:ruby
money = { japan: 'yen', us: 'dollar', india: 'rupee' }
money.to_a   #=> [[:japan, "yen"], [:us, "dollar"], [:india, "rupee"]]
```
<br>

###配列からハッシュ
to_hメソッド
なお、key重複の場合は最後の配列要素を採用する

```ruby:ruby
money = [[:japan, "yen"], [:us, "dollar"], [:india, "rupee"]]
money.to_h   #=> { japan: 'yen', us: 'dollar', india: 'rupee' }
```
<br>
Hash[]

```ruby:ruby
money = [[:japan, "yen"], [:us, "dollar"], [:india, "rupee"]]
Hash[money]   #=>  { japan: 'yen', us: 'dollar', india: 'rupee' }

money = [:japan, "yen", :us, "dollar", :india, "rupee"]
Hash[*money]  #=>  { japan: 'yen', us: 'dollar', india: 'rupee' }
```
Redshiftでテーブルごとの容量とカラムごとの容量を出力する

いずれも管理者で実行する

# テーブルごとの容量
```sql
SELECT
    TRIM(du.name) AS table_name,
    COUNT(1) AS mb
FROM
    svv_diskusage du
GROUP BY table_name
ORDER BY mb;
```

# カラムごとの容量

```sql
SELECT
    TRIM(du.name) AS table_name,
    TRIM(atr.attname) AS column_name,
    COUNT(1) AS mb
FROM
    svv_diskusage du, pg_attribute atr
WHERE
        du.col = atr.attnum-1 AND
        du.tbl = atr.attrelid
GROUP BY 1, 2
ORDER BY 1, 3;
```

# 参考
https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_SVV_DISKUSAGE.html
https://qiita.com/nabewata07/items/5c474b62c0c1c24df01a
https://gist.github.com/yujihamaguchi/b817e518117c63c73d8a
C言語　ALDS1_5_A　Exhaustive Search

##問題
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_5_A

総当たり
長さ n の数列 A と整数 m に対して、A の要素の中のいくつかの要素を足しあわせて m が作れるかどうかを判定するプログラムを作成してください。A の各要素は１度だけ使うことができます。

数列 A が与えられたうえで、質問として q 個の mi が与えれるので、それぞれについて "yes" または "no" と出力してください。

入力
１行目に n、２行目に A を表す n 個の整数、３行目に q、４行目に q 個の整数 miが与えられます。

出力
各質問について A の要素を足しあわせて mi を作ることができれば yes と、できなければ no と出力してください。

制約
n≤20
q≤200
1≤Aの要素≤2,000
1≤mi≤2,000


##コード
```c
#include <stdio.h>

static int N, A[50];

static int solve(int i, int m)
{
    if (m == 0)
        return 1;
    if (i >= N)
        return 0;

    /* A[i]を使用するか、しないか */
    int res = (solve(i + 1, m) || solve(i + 1, m - A[i]));
    return res;
}

int main(void)
{
    int q, M, i;

    scanf("%d", &N);
    for (i = 0; i < N; i++)
        scanf("%d", &A[i]);

    scanf("%d", &q);
    for (i = 0; i < q; i++)
    {
        scanf("%d", &M);
        if (solve(0, M))
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}

```
##ポイント
これで、使用するかしないかの分岐を作っている。与えられた数を引いていって、もしくは引かずに進んでいって、最終的にたどり着くのか試している。

```c
    /* A[i]を使用するか、しないか */
    int res = (solve(i + 1, m) || solve(i + 1, m - A[i]));
```

##感想
- 段階を踏むと理解できるが、解説本を読み慣れてない自分には理解に時間がかかった。
- 実際に図を書き写してみると理解できる。
- 読み飛ばすのではなく、ひとつひとつ解説を理解しながら進むのが大切。
JSONとは何者なのか

##はじめに
Everyday RailsでRSpecを学習していた際に、JSONという聞きなれない単語が出てきたので調べました。細かいJSONの書き方などは別の記事を参考にしてください。

※筆者は初学者です。間違いなどありましたら教えてください。
##JSONとは
JavaScript Object Notationの略で、「データを表現するための記法」です。Javascriptから派生してできた記述法で、発見されてからはXML(Extensible Markup Language)に代わるデータ記述言語として使われ続けています。

例えば

```
{
  "first_name": "Taro",
  "last_name": "Tanaka"
}
```
これは、名が「Taro」で姓が「Tanaka」というデータのJSONでの表現です。(実際はもっと複雑なデータを扱うために使われます)

##なぜJSONを使うのか
JSONは他のデータ記述言語に比べてファイルサイズがとても小さい(=軽量)ことで一気に使われるようになりました。

また、記述が簡単で、人間が理解しやすいのも特徴だそうです。

##結局JSONって何者なの？
冒頭でも書きましたが、「データを記述するための言語」というのが個人的に一番しっくりきました。データが複雑になってきた時に真価を発揮するのだと思います。

##終わりに
参考にした先人様のサイトを紹介します。自分にとって一番わかりやすい記事を見つけていただければと思います。

https://qiita.com/dain/items/02441195e889a9c9f140
https://note.com/toyomomo/n/nc4ad516aa32c
https://dev.classmethod.jp/articles/concrete-example-of-json/#toc-

ちょっと分かったかも、ってなったらwikipedia見てみるのもおすすめです。
https://ja.wikipedia.org/wiki/JavaScript_Object_Notation#cite_note-4
each の基本２

##環境,前提
Ruby 2.5.1
MacOS Mojave Ver.10.14.6

本記事はRubyがインストールされた前提の記事です。
Rubyをインストールしたあと、とにかくRubyをいろいろ触ってみて慣れていくための記事です。お役に立てば幸いです。


# 範囲で使うeach

[each文の基本1](https://qiita.com/TOMARU4400/items/6e29ef3c0cc6dfb3e115)の続きです。eachを範囲で使ってみます。**範囲はハッシュなどと同じく集まりを表すオブジェクトですのでeachが使えます。**


範囲は最初の要素と最後の要素を**「..」(ピリオド２個)**で繋げます。

```sample.rb

range = 1..10

```

rangeという変数に1~10までの数字が順番に代入されました。では範囲でeachを使ってみます。



```sample.rb
(1..10).each do |number|
puts number
end
```




出力結果は以下のようになります。

```:Tarminai
1
2
3
4
5
6
7
8
9
10

```
#解説
変数number(ブロックパラメータ)に1〜10までの数字が順番に代入されてputsで出力されていれば成功です。
Goで日本語曜日を含む日付format

Goに限った話じゃないけど、日本語の曜日(月, 火, 水...)を表示したいときは、先に言語公式の機能でformatしてしまい、英語の曜日を文字列置換で置き換えるとコードがきれいになる。(効率的には文字列置換は重いと思うけど、読みやすさはだいぶ上がると思う)

```go
package main

import (
	"fmt"
	"time"
	"strings"
)

func main() {
	t := time.Now()
	weekdayja := strings.NewReplacer(
		"Sun", "日",
		"Mon", "月",
		"Tue", "火",
		"Wed", "水",
		"Thu", "木",
		"Fri", "金",
		"Sat", "土",
	)
	fmt.Println(weekdayja.Replace(t.Format("2006年1月2日(Mon曜日)")))
	// 2009年11月10日(火曜日)
}
```

Goで複数の文字の組を一括置換したいときは、Replacerを使うとよいようだ。
https://golang.org/pkg/strings/#NewReplacer
レンタルサーバ内のDNS

自分が借りているサーバ（VPS）内のDNSサーバを知りたかった。

`$ less /etc/resolv.conf`
nameserver xxx.xxx.xxx.xxx
で複数記載できる。

ちなみにnginxのconf内で
resolver xxx.xxx.xxx.xxx
でDNS参照できる。
今更だけどモンテカルロ法で円周率推定

#はじめに
先日これとほぼ同じ内容の記事を投稿しました。
しかしプログラムが不備だらけだったのでそちらは限定公開にします。
ぱっと思いついたものに書き換えたらうまくいったので投稿します。
もし気になる方がいれば　[問題の記事>>][3]
後で調べてみたのですが、今回のが割と正攻法みたいですね。

モンテカルロ法が分からない方は[この動画][2]で知ってください。

以上を踏まえて、

#実行環境

```
Editor: VSCode
Shell: bash version 4.4.20
Compiler: gcc version 7.4.0
```

#ソースコード
前回からの変更点は、
座標計算の方法と何となく処理時間が見れるようにしたこと。

```c:Monte_Carlo2.c
#define _USE_MATH_DEFINES
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

#define POINT 940000       //１回の描画点数
#define LOOP 100.0         //モンテカルロ法実施回数

int main(){
    int in = 0, out = 0;
    double p = POINT, q = LOOP, ave = 0.0;
    for(int j = 0; j < q; j++) { //LOOP個のモンテカルロの円周率の平均値を求める
        int sum = 0;
        srand(time(NULL));
        for(int i = 0; i < p; i++){
            double x = (double)rand() / RAND_MAX;
            double y = (double)rand() / RAND_MAX;
            if(sqrt(pow(x, 2) + pow(y, 2)) <= 1){
                //printf("内[%1.4f, %1.4f]\n", x, y);
                /*↑コメントアウトを開放すると大量に座標見れる*/
                sum++;
                in++;       //四分円内にあった回数
            }
            else {
                //printf("　[%1.4f, %1.4f]外\n", x, y);
                /*↑コメントアウトを開放すると大量に座標見れる*/
                out++;      //四分円外にあった回数
            }
        }
        ave += sum / p;
    }
    double run = (double)clock() / CLOCKS_PER_SEC;
    double pi = 4 * ave / q;
    printf("処理時間：%f[秒]\n", run);
    printf("１回の描画点数：%d[個]\n", (int)p);
    printf("モンテカルロ法：%d[回]\n", (int)q);
    printf("四分円内の点数：%d[個]\n", in);
    printf("四分円外の点数：%d[個]\n", out);
    printf("円周率：%1.7f\n", pi);
    printf("今回の精度：%2.5f％\n", (M_PI-fabs(M_PI-pi))/M_PI*100);

    return 0;
}
```

#実行方法, 実行結果
`-lm`は忘れずにつけましょう。

```bash:bash
$ gcc -Wall Monte_Carlo2.c -lm
$ ./a.out
処理時間：6.703125[秒]
１回の描画点数：940000[個]
モンテカルロ法：100[回]
四分円内の点数：73826428[個]
四分円外の点数：20173572[個]
円周率：3.1415501
今回の精度：99.99865％
```
#おわりに
描画点数、モンテカルロ法の実施回数色々変えて暇つぶしてください。
よいプログラミングライフを(送りたい)。

#参考

- 一瞬ルートでつまずいた：[ライブラリのリンクを忘れずに][1]
- 作るきっかけになった動画：[【すげえw】モンテカルロ法による中学生も理解できる円周率の求め方が面白い【物理エンジン】][2]
- 不備だらけの前投稿：[今更だけどモンテカルロ法で円周率推定][3]

スペシャルサンクス：@fujitanozomu
[1]:https://qiita.com/percipere/items/678a8ec1299a7564f6a3
[2]:https://youtu.be/dn-RtqY9aCQ
[3]:https://qiita.com/RoaaaA/private/38ef42576985f67be720
Ruby on Railsのチュートリアル ~第1章ゼロからデプロイまで~

# はじめに
webアプリケーションを作るための学習記録
（マッチングアプリを作る予定）

こちらのチュートリアルを片っ端から進めていく
【Ruby on Rails チュートリアル】
https://railstutorial.jp/

# 第1章ゼロからデプロイまで
## まとめ
- Ruby on Railsとは、Web開発のためのフレームワークであり、Rubyプログラミング言語によって記述されている。

- 事前設定済みのクラウド環境を利用することで、Railsのインストール、アプリケーションの生成、生成されたファイルの編集を簡単に行うことができる。

- Railsにはrailsという名前のコマンドラインコマンドがあり、rails newで新しいアプリケーションを生成したり、rails serverでローカルサーバーを実行したりできる。

- コントローラのアクションを追加したり、ルートルーティングを変更したりするだけで「hello, world」アプリケーションを作成できる。

- Gitによるバージョン管理を導入し、Bitbucketの非公開リポジトリにプッシュする理由は、データの喪失を防止し、他の開発者との共同作業を行えるようにするため。

- 作成したアプリケーションをHerokuの本番環境にデプロイした。

## 所感
- AWSのcloud9すごい。面倒な環境構築もしなくていいし、自分のPCにリソースない問題も解消された
- 旧体質なSIer会社で働いでいるので、最新の技術に触れている感が楽しい。herokuとか知らんかった
- 結局何かを身につけるには繰り返しが一番だが、その繰り返しを行えるようなチュートリアルになっていると思う。gitコマンドすぐ覚えそう

## 途中参考にしたページ
- AWSアカウント作成したらまずすべき初期設定
https://qiita.com/tmknom/items/303db2d1d928db720888

- 【初心者向け】bundler、Gemfile、Gemfile.lockの関係性について図でまとめてみた
https://qiita.com/nishina555/items/1b343d368c5ecec6aecf

- Gitサーバー - SSH 公開鍵の作成
https://git-scm.com/book/ja/v2/Gitサーバー-SSH-公開鍵の作成

- fatal: remote origin already exists. と表示された場合の解決法
https://qiita.com/yu-ki0718/items/3c8aae2c81ca3f82f522

- GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~
https://qiita.com/shizuma/items/2b2f873a0034839e47ce

- 何も考えずにGitでaddしてcommitしてpushしてるだけのあなたへ
https://oldbigbuddha.dev/post/for-git-beginners/

- bundle install と bundle updateの違いについて
https://qiita.com/lasershow/items/1a048d03ddaaba98171e
	
- Rubyが参照してるgemのパスやインストール済gemを確認する方法
https://qiita.com/h5y1m141@github/items/74029cab9706971c8dbe

- HerokuにRailsアプリをデプロイする手順
https://qiita.com/NaokiIshimura/items/eee473675d624a17310f

## 使用したコマンド
printf "install: --no-document \nupdate:  --no-document\n" >> ~/.gemrc
gem install rails -v 5.1.6
rails _5.1.6_ new hello_app
bundle update
bundle install
rails server

git config --global user.name "Your Name"
git config --global user.email your.email@example.com
git init
git add -A
git status
git commit -m "Initialize repository"
git log
git checkout -f

ssh-keygen
cat ~/.ssh/id_rsa.pub 
ssh -T git@github.com
git remote rm origin
git remote add origin git@github.com:アカウント名/リポジトリ名.git
git push -u origin --all
git checkout -b modify-README
git branch
git add -A
git commit -a -m "Improve the README file"
git checkout master
git merge modify-README
git branch -d modify-README
git push
bundle install --without production

gem environment
gem list

source <(curl -sL https://cdn.learnenough.com/heroku_install)
heroku --version
heroku login --interactive
heroku keys:add
heroku create
git push heroku master
heroku open
heroku logs
heroku rename 任意の名前