OmniAICreator/Qiita-1.07M huggingface dataset:
AWS EC2 時間同期

#問題
たまに時間がずれてしまう

#対応
## Linux
### Amazon Time Sync Serviceの場合（推薦）
https://aws.amazon.com/jp/blogs/news/keeping-time-with-amazon-time-sync-service/

### インストールの場合

```bash
sudo yum erase ntp*
sudo yum -y install chrony
sudo service chronyd start
```

### 既存のntpの設定の場合
confに下記追加

```bash
server 169.254.169.123 prefer iburst
```

### ntpの設置の場合
#### 1.ntpをインストール
server = ntp.nict.jp
chkconfig ntpd on
service ntpd start
vi /etc/sysctl.conf 末尾に追加。

```bash
xen.independent_wallclock = 1
```
#### 2.sysctl -p で変更した設定ファイルの内容をロードする。

## Windows
```bash
net stop w32time
w32tm /config /syncfromflags:manual /manualpeerlist:"169.254.169.123" 
w32tm /config /reliable:yes
net start w32time
```

#メモ
たまに発生するし、すぐ対応できるのでつど対応にしていると、zabbix信者からアクションで自動化したら？と言われる。
手動対応感覚を維持するため頻繁ではないアラートはわざとアクション化しないことにしている。
手動対応や感覚のことになると、属人化を心配してくるが、属人化は個人の問題ではない。相識の、マネジメントの問題だ。
nodejs selenium でページ全体をスクショする

https://github.com/nishisuke/selenium-chrome-try

```
npm init
npm i -S selenium-webdriver
```


https://github.com/SeleniumHQ/selenium/tree/master/javascript/node/selenium-webdriver#installation
からdriverをインストール

今回はchrome 74

PATHを通す

```
export PATH=${DOWNLOADED_CHROME_DRIVER}:$PATH
```

```index.js
const { Builder } = require('selenium-webdriver');
const fs = require('fs');

(async () => {
  
  const driver = await new Builder()
    .forBrowser('chrome')
    .setChromeOptions([
      '--headless',
      '--disable-gpu',
    ])
    .build();

  try {
    await driver.get('http://www.google.com');
    const base64 = await driver.takeScreenshot();
    const buffer = Buffer.from(base64, 'base64');
    fs.writeFileSync('screenshot.jpg', buffer);
  } catch (e) {
    console.log(e)
  } finally {
    await driver.quit();
  }
})();
```

```
node index.js
```

nodeでdom要素のみのスクショはまだできないっぽいです
XcodeでOpenCV4が使えなくなった解決策(カメラのアクセスを許可する方法)

Xcodeをアップデートしてからか、OpenCV4にしてからか、下記のエラーが出て使えなくなってしまいました。

```plaintext
This app has crashed because it attempted to access privacy-sensitive data without a usage description.
The app's Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.
```

Xcodeにカメラを起動を許可するように設定してあげる必要があるようです。

# 動作環境
macOS Mojave (10.14.4)
Xcode (10.2.1)
OpenCV (4.0.1)

## Xcodeでの設定
一応確認ですが、XcodeでOpenCVを使うために、以下のように設定してあります。

### ライブラリの追加
Build Phases の Link Binary With Libraries に`/usr/local/Cellar/opencv/4.0.1/lib/` (このパスは`brew info opencv`等で確認)にあるdylibファイル44個くらいを全てドラッグ&ドロップする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404817/876cd1ac-d79d-a26c-8900-e1112caa3ea4.png)

### パスの設定
Build Settings の Header Search Paths に `/usr/local/Cellar/opencv/4.0.1/include` (recursive)とする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404817/48a63b38-bbe7-3645-bd41-744a76eb31de.png)


# 解決策
以下を`Info.plist`としてファイルに保存します。

```xml:Info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>$(DEVELOPMENT_LANGUAGE)</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>BNDL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleVersion</key>
	<string>1</string>
	<key>NSCameraUsageDescription</key>
	<string>This requires access to your camera.</string>
	<key>NSAppleEventsUsageDescription</key>
	<string>Test</string>
	<key>NSMicrophoneUsageDescription</key>
	<string>Test</string>
</dict>
</plist>

```


これをProductsフォルダ内に置きます。実行ファイルを右クリックしてShow in Finderとすることで、そのフォルダを開くことができます。

これはプロジェクト内のフォルダではなく、LibraryにあるXcodeのフォルダなので注意！
<img width="340" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404817/6c0579c4-65a6-cc7f-cd84-cd03f7fdc0d1.png">

こんな感じになっていればOK。
<img width="407" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404817/cc4483cf-de86-7f10-036a-570d34d4db70.png">

最初に起動するときは、許可をする必要があります。
<img width="422" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404817/4a318abf-0b15-8de5-f474-63ce1ea8b824.png">


# 参考
https://stackoverflow.com/questions/53190412/accessing-webcam-in-xcode-with-opencv-c
エレメントのスタイルを確認するためにクロームデベロッパーツール内のクリックを無視したい

検索したけど日本語で情報が見つからなかったので。
例えばあるボタンをクリックして表示されるエレメントのスタイルをデベロッパーツールで確認したいが、要素以外をクリックすると要素が非表示になるようなとき。

1. デベロッパーツールのソースタブに移動
2. スタイルを確認したい要素を表示させる
3. `fn + F8`で`js`の実行をストップする

なんかもっといいやり方ありそうだけど。

**参考記事**

- [javascript - Ignore clicks in the Chrome Dev Tools pane - Stack Overflow](https://stackoverflow.com/questions/35300359/ignore-clicks-in-the-chrome-dev-tools-pane)
Web Push Notification  のサンプル

まずは、次のコードを実行します。
[Web Push Notification Sample for both Server and Client](https://github.com/otiai10/web-push-notification-sample)

```bash
git clone https://github.com/otiai10/web-push-notification-sample
cd web-push-notification-sample
npm install
node server.js
```

ブラウザーで　http://localhost'8080 にアクセスし次のボタンをクリックします。

>Register ServiceWorker
>Start Subscribe
>Send Push
![webpush_may3001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/de97c4f5-6549-ebfa-c65a-22d2ab84b14f.png)


次に server.js の　trigger: の部分を次のように改造してみます。

```js:server.js
（省略）
  trigger: (req, res) => {
	message_aa = `皆さん こんにちは。 `
    const icon = `img/${Math.floor(Math.random() * 3)}.png`;
    const params = {
      title: "You've got a push-notification!!",
      msg:   message_aa + `Hi, this is message from server. It"s ${new Date().toLocaleString()} now. You can send any message, e.g. notification icons and so`,
      icon:  icon,
    };
    Promise.all(subscribers.map(subscription => {
      return webpush.sendNotification(subscription, JSON.stringify(params), {});
    })).then(res => console.log(res)).catch(err => console.log('ERROR', err));
  },

};
（省略）
```

再び、サーバーを起動し、ブラウザーでアクセスします。
>server.js  の変更により、表示されるメッセージが変わります。
try cloud run

https://github.com/nishisuke/cloud-run-try

```
git init
npm init
npm i -S express
```

```index.js
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  console.log('Hello world received a request.');

  const target = process.env.TARGET || 'World';
  res.send(`Hello ${target}!`);
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log('Hello world listening on port', port);
});
```

```Dockerfile.
FROM node:10

WORKDIR /usr/src/app

COPY package.json package*.json ./

RUN npm install --only=production

COPY . .

CMD [ "node", "index.js" ]
```

```
gcloud config get-value project

gcloud builds submit --tag gcr.io/[PROJECT-ID]/helloworld
gcloud beta run deploy --image gcr.io/[PROJECT-ID]/helloworld
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51795/9f75ce89-61ff-966a-d290-90ef30b2eeff.png)
【Git】トピックブランチを作成&移動〜トピックブランチの削除まで

# 概要
* 案件で特に使用ツールの指定がなかったので､Gitの勉強も兼ねてGitを使ったソースコード管理を行った｡
* ローカルで作業して､ソースコードをBitbucketの非公開リポジトリで管理 
* その際､トピックブランチを使って作業するときによく使うコマンドのメモ｡
* トピックブランチとは､機能追加やバグ修正といったある課題に関する作業を行うために作成するブランチ｡一時的に作業用ブランチを作れるので､masterブランチに影響せず好きなことやれるのでよく使う｡

# よく使うコマンド
* トピックブランチを作成&移動 → トピックブランチで作業 → トピックブランチでpush → masterブランチに移動 → masterブランチにトピックブランチをマージ → masterブランチでpush → トピックブランチの削除

```
// 今いるブランチの確認(masterブランチにいることを確認)
git branch

// masterブランチから移動とトピックブランチの作成
git checkout -b [トピックブランチ名]

// 今いるブランチの確認(トピックブランチにいることを確認)
git branch

// 作業した内容をワーキングツリーに全て追加
git add -A

// インデックスにコミット
git commit -m "[コミット内容]"

// add・commit状況の確認
git status

// 問題なければ､リモートリポジトリにトピックブランチをpush
git push -u origin [トピックブランチ名]

// masterブランチに移動
git checkout master

// masterブランチにトピックブランチをマージ
git merge [トピックブランチ名]

// masterブランチをリモートリポジトリにpush
git push

// 不要になったトピックブランチを削除
git branch -D [トピックブランチ名]
```

# まとめ
* 他にこんな方法でやってるよとかあれば教えてください:D
* 特に､commit前に差分をgit diffで確認するのですが､差分確認方法がいまいちです・・・慣れてきたら､追記か記事書きます｡
昔、作ったWebサービスをTypeScriptとVue.jsで作り直した話

# はじめに
Vue.jsとTypeScriptでWebサービスを作ってみたいけどアイデア浮かばなかったので昔作ったアプリを作り直しました。

# 作ったもの
[Qnow](https://qnow-85248.web.app/)
Qiitaで新規投稿された記事のみを取得して表示するサービスです。
タグ名でフィルタリングして表示します。
![app.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240403/28dc2d82-934b-4589-2770-48fa36800ca8.gif)
表示した記事のタグ名をクリックすることでクリックしたタグ名で再検索することができます。
ただ、今の仕様だと日付が変わってすぐだと記事が取得できないので後々変更しようと思います。

# 使用した技術
- Vue.js
  - TypeScript
- Github
  - ソースコードの管理
- CircleCi
  - masterにプッシュされたらビルドとデプロイを実行 
- Firebase
  - 静的ファイルの配信

## Vue.js
Vue Cli3を使用しました。
Vue Cli3ではTypeScriptが正式採用されているのでTypeScriptを使用しました。
でも、TypeScriptを全然書いたことなくてany型を使っているところがちょくちょくあるので修正をしたいと考えています。
Vueの単一コンポーネントはスタイルにスコープをあてることができるのでとても便利ですね。
CSSはSASSのSCSS記法で書いています。これも標準でサポートしてあるので楽でした。

## Github
ソースコードを管理するのに使用しました。
英語が全然わからないのでGoogle翻訳で翻訳しながらコミットメッセージを書いたので変なコミットメッセージが多いかもです。

## CircleCi
Githubにpushされたらビルドして自動的にデプロイするようにしました。

```.circleci/config.yml
version: 2
jobs:
  build:
    docker:
      - image: circleci/node:10.15.3
    working_directory: ~/repo
    steps:
      - checkout
      - restore_cache:
        # 復元するキャッシュのkey
          keys:
            - v1-dependencies-{{ checksum "package.json" }}
            - v1-dependencies-
      # 依存関係インストール
      - run:
          name: Install Project
          command: npm install
      
      # ビルド
      - run:
          name: Build
          command: npm run build
        
      # ビルドの確認  
      - run:
          name: Check dist
          command: ls -la dist
      
      # キャッシュの保存
      - save_cache:
          paths:
            - node_modules
          key: v1-dependencies-{{ checksum "package.json" }}
      - run:
          name: Install Firebase-tools
          command: npm install --save-dev firebase-tools
      
      - run:
          name: Deploy to Firebase hosting
          command: ./node_modules/.bin/firebase deploy --project "$FIREBASE_PROJECT_ID" --token "$FIREBASE_DEPLOY_TOKEN"
```
### 設定手順
1. CircleCiにログイン
2. Githubアカウントでログインしていると思うのでプロジェクトは紐付けられる
3. Githubのリポジトリに.circleci/config.ymlを追加する
4. GithubにPushするごとにビルドが実行される
5. firebaseでプロジェクトを作成する
6. firebaseで```firebase-tools```をインストール
7. firebaseにログインする

```
$ firebase login
```
画面にしたがってログインする
8. firebaseをCI上で使用するために以下のコマンドを打つ

```
$ firebase login --reauth
$ firebase login:ci
```
これでtokenを取得できる
9. .circleci/config.ymlにfirebaseでデプロイするコマンドを追加する
10. CircleCi上の設定でfirebaseのtokenとfirebaseのプロジェクトIDを追加する

# おわりに
このサービスを開発するにあたって自分の技術のなさを改めて知ることができました。
これからも日々勉強をしようと思います。
よろしければフィードバック頂けると嬉しいです。
ソースコード: https://github.com/gba-3/qnow
カプセル化について

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257568/f476c9ed-054f-d7ac-bcdb-7d93071961f5.png)

説明する時にいつも読むのでまとめ

## カプセル化とは
**クラスに変数とメソッドを凝集し、隠蔽し、インスタンス化して量産・利用できるようにしたもの**

- まとめて、隠して、たくさん作る仕組み
- クラスとは意訳すると「種類」
- インスタンスとは意訳すると「実体」
- クラスで定義したものはインスタンス化することで利用できる
- なので、クラスとインスタンスはセットで考えると良い
- 独立性の高い部品を作る仕組み
- オブジェクト指向三大要素の1つ
- 種類と実体は集合論でいう集合と要素に相当する

## 特徴
### 概念的側面(現実世界)
**分類ができる**

- 例えば「アメリカンショートヘア」と「日本猫」と「パグ」と「柴犬」
  - 「猫」という種類の「アメリカンショートヘア」と「日本猫」という実体
  - 「犬」という種類の「パグ」と「柴犬」という実体

### 技術的側面(プログラミング)
**インスタンス化する時に実体に必要な情報を渡せる。インスタンス化された対象は状態を管理し続ける。インスタンス化された対象は公開する情報が制限されている**

- インスタンス化をすると、コンストラクタが実行される
- コンストラクタが実行されると、フィールドが設定される
- コンストラクタとは意訳すると「構築するもの」
- フィールドとは意訳すると「属性情報」
- 例えば「Cat」というクラスと「ねこさん」というインスタンス
  - 「Cat」クラスがインスタンス化するのに必要な情報は「名前」(だけ今回は)
  - 「Cat」がインスタンス化するとコンストラクタでインスタンスに必要な情報である「ねこさん」が設定される
  - 「ねこさん」誕生
  - 「ねこさん」であり続けるので「ねこさん」は何回でも鳴ける
  
### プログラミング技術における「クラス」の利用

```java:Cat.java
public class Cat {
    String name;
    
    Cat(String name) {
        this.name = name;
    }

    public void cry() {
        System.out.println("にゃ〜");
    }
}
```

### プログラミング技術における「インスタンス」の利用
```java:Main.java
public class Main {
    public static void main(String[] args) {
        Cat nekosan = new Cat("ねこさん");
        nekosan.cry();
    }
}
```

### ポイント
- 役割を1つにする
- クラスは型として扱うことができる
- 説明で使われる用語が視点や文脈や人によって違ったりする
- 大体同じ
  - インスタンス化
  - インスタンス生成
  - 生成する
  - newする

-> new の部分がコード的には相当する

- 大体同じ
  - 初期化する 
  - コンストラクタする
  - initializeする
  - initする  

->今回(Java)でいうと「Dog{」の部分。PHPとかだと「__constract」。Rubyとかだと「initialize」。Pythonとかだと「\_\_init\_\_」。Swiftとかだと「init」
 
- 大体同じ
  - フィールド
  - メンバー変数
  - インスタンス変数

## 関連記事
[オブジェクト指向でなぜつくるのかまとめ](https://qiita.com/dich1/items/59c4f15c6dfb71e48c5e)

## 書籍情報
平澤 章  (著) オブジェクト指向でなぜつくるのか 第2版
https://amzn.to/2VSrzwe

## 雑感
カプセル化はプログラミング技術的に説明しようとすると複数要素や視点がある
説明する言葉も多いのと、視点によって説明対象が同じでもニュアンスが違ったりするので一番大事で難しい感。
PipingServer.NET 0.1.1.0 リリースしました。

# PipingServer.NET とは
[nwtgck さん](https://qiita.com/nwtgck)とこの [piping-server](https://github.com/nwtgck/piping-server)の .NETFrameworks実装のこと。

今朝ついに [0.1.1.0](https://github.com/juner/PipingServer.NET/releases/tag/0.1.1.0) をリリースしました。(6日前に最初のバージョンである [0.1.0.0](https://github.com/juner/PipingServer.NET/releases/tag/0.1.0.0) をリリースしております。

## 何故作った。
WCFは興味あったけど、全く持って勉強するアイデアが無かったのでいい実装を見て興味本位で移植をしたくなったのです。

## 技術的ポイント
* サービスインターフェス: [`Piping.IService`](https://github.com/juner/PipingServer.NET/blob/dba83439615246623c341acf6e2fddec48e52595/PipingServer.NET/IService.cs)
* サービス実装: [`Piping.Service`](https://github.com/juner/PipingServer.NET/blob/dba83439615246623c341acf6e2fddec48e52595/PipingServer.NET/Service.cs)
* 待ち合わせ: [`Piping.SenderResponseWaiters`](https://github.com/juner/PipingServer.NET/blob/dba83439615246623c341acf6e2fddec48e52595/PipingServer.NET/SenderResponseWaiters.cs)
* 待ち合わせ解除処理用: [`Piping.CloseRegisterStream`](https://github.com/juner/PipingServer.NET/blob/dba83439615246623c341acf6e2fddec48e52595/PipingServer.NET/CloseRegisterStream.cs)
* 1対多ストリーム送信用: [`Piping.PipingStream`](https://github.com/juner/PipingServer.NET/blob/dba83439615246623c341acf6e2fddec48e52595/PipingServer.NET/PipingStream.cs)
* 非同期ストリーム送信用: [`Piping.CompletableQueueStream`](https://github.com/juner/PipingServer.NET/blob/dba83439615246623c341acf6e2fddec48e52595/PipingServer.NET/CompletableQueueStream.cs)

## 他、コーディングポリシー
* Stream の書き込みは非同期API縛り
* C# のバージョンは 現在previewの C#8

## 現在の課題
* [self Host する際に HTTPS にすることができない](https://github.com/juner/PipingServer.NET/issues/3)
* [Content-Length が設定されない。](https://github.com/juner/PipingServer.NET/issues/4)
* [multipart/form-data が解析されずに送られる](https://github.com/juner/PipingServer.NET/issues/5)

# 余談
[0.1.0.0](https://github.com/juner/PipingServer.NET/releases/tag/0.1.0.0) リリースの際………
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">junerさんによるPiping ServerのWCF版の0.1.0.0がリリースされてる<a href="https://t.co/q2Pvq3DMjI">https://t.co/q2Pvq3DMjI</a><br>Piping Serverの別実装、嬉しい。</p>&mdash; @nwtgck (@nwtgck) <a href="https://twitter.com/nwtgck/status/1132032207931895808?ref_src=twsrc%5Etfw">2019年5月24日</a></blockquote>

捕捉されてた！

以上となります。
Jetson Nanoでonnx-chainerを使ってONNX形式で出力

# はじめに

TensorRTを使うためにchainerのモデルをONNX形式で出力することを考えた。どうせVGG16等有名どころのモデルを使うんだから最初からONNX形式のモデルをダウンロードするのが正解と思いつつ。

# 事前準備

TensorRTを使うのは初めてなので、今使っている環境を誤って壊さないよう、新たに`$HOME/Documents/TensorRT`に環境を作ることにした。ここにONNXの環境を構築する。

```bash:ターミナル
yamamo-to@jetson-nano:~$ mkdir ~/Documents/TensorRT
yamamo-to@jetson-nano:~$ cd ~/Documents/TensorRT
yamamo-to@jetson-nano:~/Documents/TensorRT$ pipenv --three
yamamo-to@jetson-nano:~/Documents/TensorRT$ pipenv install cupy
yamamo-to@jetson-nano:~/Documents/TensorRT$ pipenv install chainer
yamamo-to@jetson-nano:~/Documents/TensorRT$ pipenv install matplotlib
yamamo-to@jetson-nano:~/Documents/TensorRT$ pipenv install pillow
```

なお`pipenv install`でパッケージをインストールする際、一行ずつに分けているのは下記のようなエラーが多発するから。

```
pipenv.patched.notpip._vendor.urllib3.exceptions.ProtocolError: ("Connection broken: ConnectionResetError(104, 'Connection reset by peer')", ConnectionResetError(104, 'Connection reset by peer'))
```
これが発生したら同じコマンドを何回か粘るとうまく行く。うまく行くまで繰り返すのがコツ。

# ONNX関連パッケージのインストール

何度やっても`pipenv install onnx`が失敗するのでソースコードを持ってきてインストールをしようとしたらパッケージがいくつか足りないことが分かった。

```bash:ターミナル
sudo apt install libprotobuf-dev protobuf-compiler pybind11-dev
```

```bash:ターミナル
yamamo-to@jetson-nano:~/Documents/TensorRT$ pipenv install pybind11
yamamo-to@jetson-nano:~/Documents/TensorRT$ pipenv install onnx
yamamo-to@jetson-nano:~/Documents/TensorRT$ pipenv install onnx-chainer
yamamo-to@jetson-nano:~/Documents/TensorRT$ pipenv install chainercv
```

現時点でのPipfileは下記の通り。

```
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
cupy = "*"
chainer = "*"
matplotlib = "*"
pillow = "*"
pybind11 = "*"
onnx = "*"
onnx-chainer = "*"
chainercv = "*"

[requires]
python_version = "3.6"
```

# 実行

onnx-chainerのgithub[^1]のソースコードを流用した。ソースコードを見て、caffemodel形式から長い長い変換が始まるのではと思ったが、本ソースはnpzを直接ダウンロードしたので安心した。よくよく考えるとモデルの変換だけならJetson Nanoでやる必要もないような・・・。

```python:chainer2onnx.py
import numpy as np

import chainer
import chainercv.links as C
import onnx_chainer

model = C.VGG16(pretrained_model='imagenet')

# Pseudo input
x = np.zeros((1, 3, 224, 224), dtype=np.float32)

onnx_chainer.export(model, x, filename='vgg16.onnx')
```

とりあえず実行。

```bash:ターミナル
yamamo-to@jetson-nano:~/Documents/TensorRT$ pipenv run python3 chainer2onnx.py
```

おぉ、動いた！インストールに手間取ったのとハングアップを繰り返した[^2]ので、正直動くとは思っていなかった。実行時間もダウンロードを除けばJetson Nano上で5分程度。十分使える速度である。

![chainer2onnx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252224/c9c5ecf0-56bc-7482-7d9f-4f585520d871.png)

`vgg16.onnx`は作成された模様。しかし謎のメッセージが・・・。これ、本当に使えるんだろうか。

```bash:ターミナル
[libprotobuf WARNING google/protobuf/io/coded_stream.cc:604] Reading dangerously large protocol message.  If the message turns out to be larger than 2147483647 bytes, parsing will be halted for security reasons.  To increase the limit (or to disable these warnings), see CodedInputStream::SetTotalBytesLimit() in google/protobuf/io/coded_stream.h.
[libprotobuf WARNING google/protobuf/io/coded_stream.cc:81] The total number of bytes read was 553437453
```

[^1]: https://github.com/chainer/onnx-chainer
[^2]: 変換中に突然通信が停止しJetson Nanoごと落ちた
supervisorで相対パスの下でアプリを起動する


supervisorの ``` *.conf```配置ファイルのdirectoryを編集する
↓このように

```
[program:HelloWorld]
directory=/home/ec2-user/GoCode/hello/ 
command=go run /home/ec2-user/GoCode/hello/HelloWorld.go
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/var/log/HelloWorld.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/var/log/HelloWorld.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
```
GOの環境変数について


```go env```で環境変数を確認

vim ~/.bashrcでPATHを変更

重要なPATH：

```
GOROOT＝$HOME/local/go   //goの位置
PATH=$PATH:$GOROOT/bin
export GOPATH=projectDir
export GOBIN=projectDir/din


```
プロジェクト中にには{pkg,src,bin}のような三つのフォルダーがあります。
*.go-------src
buided file--------bin
HTTPを理解する⑥  クッキーとセッション

HTTPはステートレスなのが特徴です。これはリクエストがありレスポンスが返ってくる、という一連の動作で発生した情報を次のリクエストが発生したときにはその時の情報を保持していないということです。ステートレスによって起きる問題を具体例でみていきましょう。

あるログイン制のwebサービスがあります。利用するためにメアドやパスワードを記入してログインします。ログイン後何かしらサービスを利用しようとボタンをクリックします。するとサーバー側はあなたがログインしたという情報をすでに忘れており、再びログイン画面に戻ってしまいました。サービスを利用するには再びログインし直さないといけません。

これではページが遷移するたびにいちいちログインの作業をしないといけなく面倒です。そこで状態を維持し続けるための仕組みが存在します。

## cookie
cookieとは複数のリクエスト間で共有しておきたい状態(データ)をブラウザ側に保存しておく仕組みです。cookieではwebサーバーがブラウザへレスポンスを返すとき、キーと値がペアのcookie情報をブラウザへ返します。ブラウザ側はこのcookieをサーバーのドメイン名と紐付けして保存します。こうすることで同じドメイン名のサーバーにリクエストを送るとき、このcookieをセットで送ります。サーバーは受け取ったcookieから照らし合わせて、以前どんなリクエストが送られてきたかを確認することができます。

## セッション
webサーバーとブラウザのやりとりで関連性がある処理の流れをセッションをいいます。セッション管理においてブラウザを識別するためのものをセッションIDといいます。webサーバーで生成されたセッションIDはcookieに含まれてブラウザに送信されます。このセッションIDを含めた処理を送ることでwebサーバーとのセッションを維持できます。この時セッションはwebサーバーに保存されています。
どうしてもゲームプログラマになりたい人へ基礎知識編＃B03_Englishその２

##記述する動機
私、とある専門学校でPGを教えています。はや10年。
いまだにSEもやってます。
学生さんたち向けですが、息子さん、娘さんがゲームプログラマになるなんぞと言い出したらご一読ください。学校名は秘密！！

##基礎知識編（2019）
この記事を読んで「心折れる」という人はさっさと折って差し上げます。
サクサク行きます。いいですか？
今回も引き続きEnglishの勉強

##Englishの勉強
学ぶ必要性は省略。
勉強しなかった過去のこともどうでもいいです。

##日本語化しない。カタカナも使わない。
エディタ、IDE、その他。とにかく日本語を排除します。
いつまでもカタカナ見てるからいけないのです。
頭がローマ字になっちゃいます。いつまでたっても頭がローマ字。
やめましょう。英語環境に統一！！

##とにかく使う
理屈でなく使いましょう。
例：man cpの一部をグーグル翻訳してもらいます。
<img width="568" alt="スクリーンショット 2019-05-30 1.04.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33317/95d140d6-860f-995b-7a74-789800c88582.png">

かなり正しいです。
<img width="1149" alt="スクリーンショット 2019-05-30 1.06.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33317/60d5c0ca-acc9-c028-3f12-1fc244536c30.png">

例：c++vector
[例：c++vector](http://www.cplusplus.com/reference/vector/vector/)
先生に翻訳してもらいます。
<img width="1146" alt="スクリーンショット 2019-05-30 1.09.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33317/18d434d8-cb1d-6eea-228e-3b1fc5bc7da1.png">
繰り返していくうちに必ずEnglishの方が読みやすくなっていることでしょう。
個人差はありますが、**概ね3ヶ月ほど毎日やってみましょう。**
**かなり読めるようになります。**

##使えれば良い
Englishぐらいで死にそうなこと言わないように。今の所大丈夫？
大丈夫じゃない人は他のこと...To Be Continued
MacOSのR/RStudioでplot関数で作図する際に、日本語の文字化けを治す方法

# はじめに

Mac上のRについて、**plot関数で日本語を表示させようとすると**、**□□と表示される問題があります**。調べると、少し前の記事でかつ古い環境ではありますが、全く同様の問題がWeb検索でヒットし、私の環境で試したところ同じように解決できたため、この記事はそこまで意味のあるものではありません。
意味があるとすれば、2019/05/30現在でも同様の対応で解決できたことを示すこと、および、自分の備忘録、という点の2点のみです。

# 環境について（R, RStudio, MacOSのバージョン）
次で日本語が文字化けする問題が発生しました。2019/05/30現在では最新の環境と思います。

- R version 3.6.0 (2019-04-26)"Planting of a Tree"
- RStudio 1.2.1335
- MacOS Mojave 10.14.5

# 一時的に問題を回避する方法
[Rとウェブ解析:MACでグラフの日本語文字化けを防ぐ簡単な方法](https://www.karada-good.net/analyticsr/r-58)に記載の通りなのですが、実行するRスクリプトの先頭に、使用フォントを指定する関数を記載するだけです。

```R:(上記のリンク先より引用しています)
par(family= "HiraKakuProN-W3")
```

フォントは別のものを指定しても構いません。FontBook.appにてインストールされており、かつ、好きなものを記載すればいいと思います。
しかし、毎回このように書くのは少し面倒に感じたので、設定ファイルなどの記載で解決する方法を探したところ、次がありました。

# .Rprofileにて解決する方法
[RStudio for Mac OS X で日本語のプロットが上手くいかない場合の対処法](http://blog.0093.tv/2011/05/rstudio-for-mac-os-x.html)に記載の通りなのですが、次のように~/.Rprofileを作成すれば解決できました。quartzFontの設定の箇所は、先と同じようにインストール済みの好きなフォントを指定して良いと思います。

```R:.Rprofile(上記のリンク先より引用しています)
setHook(packageEvent("grDevices", "onLoad"),
    function(...){
        if(.Platform$OS.type == "windows")
            grDevices::windowsFonts(sans ="MS Gothic",
                                    serif="MS Mincho",
                                    mono ="FixedFont")
        if(capabilities("aqua"))
            grDevices::quartzFonts(
              sans =grDevices::quartzFont(
                c("Hiragino Kaku Gothic Pro W3",
                  "Hiragino Kaku Gothic Pro W6",
                  "Hiragino Kaku Gothic Pro W3",
                  "Hiragino Kaku Gothic Pro W6")),
              serif=grDevices::quartzFont(
                c("Hiragino Mincho Pro W3",
                  "Hiragino Mincho Pro W6",
                  "Hiragino Mincho Pro W3",
                  "Hiragino Mincho Pro W6")))
        if(capabilities("X11"))
            grDevices::X11.options(
                fonts=c("-kochi-gothic-%s-%s-*-*-%d-*-*-*-*-*-*-*",
                        "-adobe-symbol-medium-r-*-*-%d-*-*-*-*-*-*-*"))
        grDevices::pdf.options(family="Japan1GothicBBB")
        grDevices::ps.options(family="Japan1GothicBBB")
        }
)
attach(NULL, name = "JapanEnv")
assign("familyset_hook",
       function() {
            winfontdevs=c("windows","win.metafile",
                          "png","bmp","jpeg","tiff","RStudioGD")
            macfontdevs=c("quartz","quartz_off_screen","RStudioGD")
            devname=strsplit(names(dev.cur()),":")[[1L]][1]
            if ((.Platform$OS.type == "windows") &&
                (devname %in% winfontdevs))
                    par(family="sans")
            if (capabilities("aqua") &&
                devname %in% macfontdevs)
                    par(family="sans")
       },
       pos="JapanEnv")
setHook("plot.new", get("familyset_hook", pos="JapanEnv"))
setHook("persp", get("familyset_hook", pos="JapanEnv"))
```

# 最後に
リンクを貼らせて頂いたページの作成者の方々のおかげで、問題が解決できました。感謝致します。また、.Rprofileでの解決方法については、@Mysk35S様の[MacでRの日本語処理関係](https://qiita.com/Mysk35S/items/c179becbe0bf973f861e)の記事のおかげで該当ページにたどることができました。併せて感謝致します。
Reindex APIを使用した、インデックス名をLogstash形式での変換方法

# はじめに
Reindex APIによってLogstash形式での出力が必要になりました
その時考えたリクエストを記述します

# リクエスト
参考リクエストを記述します

```
POST _reindex
{
  "source": {
    "index": "aaaaaa"
  },
  "dest": {
    "index": "meaningless"
  },
  "script": {
    "source":"""
      def dt = new Date();
      def sdf = new SimpleDateFormat("yyyy'.'MM'.'dd");
      ctx._index = "aaaaaa-" + sdf.format(dt);
    """
  }
}
```

#結果
<img width="1075" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159184/70c3f844-8fc1-ebba-87e8-3c95c543fe6b.png">



#参考資料
- [Data型データに対して、特定時間帯を検索する方法について](https://discuss.elastic.co/t/data/81792)
- [Reindex API](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html)
【JQuery】構文一覧

# 呼び出し

## JQueryのAPIを参照する。
 - `<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>`


#### 初期表示時
```javascript
  $(document).ready(function(){
          // 処理
  });
```
#### ボタン押下時

```javascript
$(function ($) {
    $('.conditionButton').on('click',function(){
          // 処理
    });
});
```

# 要素指定
#### クラスセレクタ
```javascript
    $('.className')
```


#### 親要素
```javascript
    $(セレクタ).parent()
```

#### 孫要素
```javascript
    $(セレクタ).find(セレクタ)
```

# 属性変更

```javascript
    $(セレクタ).prop("要素名", 値)
```


# ラジオボタンによってテキストの活性／非活性を切り替える。
- 3番目のラジオボタンをクリックした場合, 1-1, 1-2, 2-1, 2-2のテキストボックスが非活性になる。
  
```javascript:JQuery
$(function ($) {
    // 指定したクラスを持つ要素のonclick属性に下記を設定する。
    $('.conditionButton').on('click',function(){
        // 選択されている場合、その親の要素(parent)から見た子(find)のうちtext属性をすべて活性化させる。
        $("input[class='conditionButton']:checked").parent().find(":text").prop("disabled", false);
        // それ以外をすべて非活性にする。
        $("input[class='conditionButton']:not(:checked)").parent().find(":text").prop("disabled", true);
    });
});
```
```html:HTML
<div>
  <input type="radio" class="conditionButton" name="test1" checked>
  <input type="text" value="テキスト１-１" />
  <input type="text" value="テキスト１-２" />
  <label>ラベル1</label>
</div>
<div>
  <input type="radio" class="conditionButton" name="test1">
  <input type="text" value="テキスト２-１" />
  <input type="text" value="テキスト２-２" />
  <label>ラベル2</label>
  </div>
<div>
  <input type="radio" class="conditionButton" name="test1">
  <input type="text" value="テキスト３-１" />
  <input type="text" value="テキスト３-２" />
  <label>ラベル3</label>
</div>
```




# 参考サイト
公式 : http://semooh.jp/jquery/
SSL証明書の設定

# 今回起きた事 
事象：あるwebページがssh接続できなくなった。
原因：Apacheの設定に抜けがあり、自動更新がうまくいかず、SSL証明書の期限が切れた。
目標：SSL証明書を再発行する。
 
例えば、YahooのURLの🔒マークをクリックすると、SSL証明書を実際に見ることができる。
<img width="446" alt="スクリーンショット 2019-05-29 20.57.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332147/3c80ccfa-0857-c175-0c43-3aaa0026c491.png">

注) SSLとSSHの違い
・SSL（Secure Socket Layer） : ブラウザとwebサーバ間の暗号化
・SSH（Secure Shell） : ホスト間の暗号化
・SSHでは、通信する全ての相手の公開鍵を事前に渡す必要があるので、通信相手が100人なら100人分の公開鍵が必要。一方で、SSLは、認証局が発行した１つ証明書(これが１つの公開鍵に対応)が公開鍵の正当性を立証する。

# 環境 
認証局 : Let's encrypt (証明書の有効期限は90日（約3カ月）で切れる。 変更不可。）
webサーバー : Apache/2.4.6(CentOS)
　
# 対応
まず、自動更新がうまくいっているか確認する。

約3ヶ月ごとにSSL証明書の有効期限が切れるため、3ヶ月に1回証明書を発行しないといけない。手動では大変なので、1ヶ月に1回cronを使って自動更新できるように設定している。（cronは、定期的なlogの取得などに使われる）

```terminal
$ crontab -l # 設定されているcronを表示
5 0 * * * /bin/php -f /var/www/upload/cron.php RemoveController removeExpireFiles
0 2 * * * cd /var/www/test; /bin/php -f zoho.php Zoho searchProductsRecords
0 2 * * * cd /var/www/html; /bin/php -f zoho.php Zoho searchProductsRecords 
| | | | | 
分時日月年に対応。アスタリスクは、任意の整数。

# 毎月24日の朝4時に一括更新 
00 04 24 * * /home/xxxx/letsencrypt/letsencrypt-auto renew --force-renew && sudo systemctl reload httpd


# 実際に更新してみる
$ /home/xxxx/letsencrypt/letsencrypt-auto renew --force-renew
うる覚えだが以下のような感じで返ってきた。
→ 成功したファイル → xxx, yyy
→ 失敗したファイル → wp-stg.zzz (動作テスト用のWordPress)
→ IMPORTANT NOTE(注意)
→ 失敗したファイルについてAレコード(後で説明する)を確認せよ


# いわれた通りAレコードを確認
$nslookup 失敗したドメイン #(name serverの略)
→ IPアドレスが表示されたのでドメインと紐づけされていることを確認
```


他の原因としてアパッチの設定ファイル[httpd.cof](https://r7kamura.hatenablog.com/entry/20110222/1298371277 "httpd.cof")の記述もれが考えられる。
OS毎に設定ファイルの場所は決まってるらしい。centOSなら/etc/httpd/conf/の下。

/etc/httpd
     　├ conf/
　     │    ├ httpd.conf
　     │    └ magic
　     │
　     ├ conf.d
　     │    ├ xxx.conf
　     │    ├ yyy.conf
　     │    ├ wp.conf
　     │    ├ ‥
　     │　 
    
ややこしいのが、
/etc/httpd/conf.d ディレクトリは、Apacheを利用する他のアプリケーションたちを設定するディレクトリ。

そして、読み込まれる順番がポイントになる
http://www.go-next.co.jp/blog/server_network/4084/
![apache-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332147/11345f75-5a70-75ed-3928-ad45d93ae236.png)
以上を踏まえ…

```terminal
# ⓶に当たる部分を設定。今回はWordPressの設定ファイルを見に行った。
$ less /etc/httpd/conf.d/wp.conf 

# ⓶の各ファイルの設定を⓷（VirtualHosts）の部分に記述していく。
$ less /etc/httpd/conf/httpd.conf # less後、sfift + g で一番下の行に行ける。 ⓷に行ける。
```

最後に、

```terminal
# 設定ファイルを書き換えたら、Apacheに反映させる前にファイルの文法間違い等がないか、確認。
$ httpd -t
Syntax OK

# 設定ファイルに問題がないことが確認できたら、Apacheのサービスを再起動させて、設定を反映させる。
$ sudo systemctl reload httpd #systemctl [命令] [対象] #reloadとrestartは失敗したときの挙動が異なる。

設定ができたら、ブラウザからhttpsでアクセス。アクセス後、ブラウザから証明書が有効であるか確認。
```
参考 
https://dev.classmethod.jp/cloud/aws/amazonlinux-apache24-ssl/
https://qiita.com/rimoenic/items/81385e08cf772ae5cfe4

# 勉強したLinuxコマンド
```terminal
$su #ユーザを指定しないとrootユーザへ切り替わる
$sudo su  #rootユーザのパスワードが分からない場合は、sudoコマンドでrootユーザとしてsuコマンドを実行することができる。
$sudo su - #ハイフンでrootのカレントディレクトリに移動。

$history grep|ひっかけるワード

$ps #プロセス情報の表示。
$ps -ef|grep httpd #(e 全て, f 詳細)
$ps -ef|more 
```

# その他
rootユーザー(神)の時、プロンプトは、#。⇔ exitで一般ユーザーへ
Swift - init(repeating:count:)で配列を生成するときの注意点

##基本的な使い方
```swift
// 4人で点数を競うときの初期値を0でいれておく

var playerScores = Array(repeating: 0, count: 4)
print(playerScores) // [0, 0, 0, 0]

// 書くプレイヤーがスコアを獲得
playerScores[0] += 5
playerScores[1] += 10
playerScores[2] += 15
playerScores[3] += 20
print(playerScores) // [5, 10, 15, 20]
```

##クラスのインスタンスを格納する配列を生成する
```swift
class Player {
  var name = ""
  var score = 0
}

var players = Array(repeating: Player(), count: 4)

// 書くプレイヤーに名前を代入
players[0].name = "John"
players[1].name = "Paul"
players[2].name = "George"
players[3].name = "Ringo"

players.forEach { player in
  print(player.name)
}

/*
Ringo
Ringo
Ringo
Ringo
みんなRingoになってしまった
*/
```

クラスのような参照型の場合、同じ参照を持つインスタンスがrepeatingにより複数生成されてしまいます。例えば、上記のようにクラスのインスタンスを配列で格納し、セルに表示する情報を管理する場合などは、1つの要素の情報を変えると他の要素にまで影響があるので注意が必要です。

##解決策

structなら値型なので上記のように1つの要素の値を変更すると、他の要素まで影響があるということはありません。

```swift
struct Player {
  var name = ""
  var score = 0
}

var players = Array(repeating: Player(), count: 4)

// 書くプレイヤーに名前を代入
players[0].name = "John"
players[1].name = "Paul"
players[2].name = "George"
players[3].name = "Ringo"

players.forEach { player in
  print(player.name)
}

/*
John
Paul
George
Ringo
*/
```
slackにtwitterDMが来たことを知らせるツールを無料で作った

# どういったものを作成したか
<img width="363" alt="Screen Shot 2019-05-30 at 0.19.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316468/7a89f01a-759c-80b5-e23b-cff1a2b74645.png">

slackの指定したチャンネルにDMが来た場合にお知らせをするslackアプリを作成しました。

# 作成した経緯
- グループ間で共有しているtwitterアカウントがあったが、DMの対応などが遅れがちだった
- slackをチャットツールとして主に使っており、そこで通知できればいいという話に
- [公式で提供されているもの](https://slack.com/apps/A0F7XDW93-twitter)だと、タイムラインやツイートはできるみたいだが、DMの操作まではできなかった
- 転送メールだと特定のチャンネルに送信することができなかった
- メール転送だとタッチして開く必要があった
- [特定のチャンネルにメールを通知できるアプリ](https://slack.com/apps/A0F81496D-email)は、有料のワークスペースのみ使用可能だったため


# 作成する上で使ったもの
- twitterメール設定
    - DMの通知を受け取るに設定
- gmailのフィルターの作成
    - DMの通知メールにlabelをつけるため
    - 参考：[gmail-フィルタの作成](https://allabout.co.jp/gm/gc/426566/)
- GAS
    - labelがついてかつ☆をつけていない場合、slackに通知し、☆をつけるプログラムの作成
    -  twitterのDM通知メールがhtml形式できていたので、正規表現を用いて欲しい情報を抽出
    -  参考：[GAS-Class GmailMessage](https://developers.google.com/apps-script/reference/gmail/gmail-message)
-  slackのincoming webhooks
    -  これを用いて特定のチャンネルに通知を行う
    -  参考：[SlackのIncoming Webhooksを使い倒す](https://qiita.com/ik-fib/items/b4a502d173a22b3947a0)

# ソースコード
```javascript:main.gs
function fetchContactMail() {

  /* Gmailから特定条件のスレッドを検索しメールを取り出す */
  var strTerms = 'label:twitterdm';
  var myThreads = GmailApp.search(strTerms, 0, 10); //条件にマッチしたスレッドを取得
  var myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する　→二次元配列で格納  var valMsgs = [];

  var br = /[\r\n]+/g; //改行
  var rep = ""; //置換文字列
  /* 各メールから日時、送信元、件名、内容を取り出す*/
  for(var j =0;j<myMsgs.length;j++){
  for(var i =0;i<myMsgs[j].length;i++){
    if(!myMsgs[j][i].isStarred()){
      valMsgs[i] = myMsgs[j][i].getBody().replace(br,""); //html形式の取得と空白削除
      var myRegexp = /<td class=\"preheader\" style=\"padding:0;margin:0;line-height:1px;font-size:1px;font-size:1px;color:#ffffff;\">([\s\S]*?)<d><\/d><\/td>/;
      //↑tdタグで囲われた場所を抽出するための正規表現。gmailだとstyleで書かれるため大変汚い。
      var text = valMsgs[i].match(myRegexp);// matchを用いると0に素のテキスト1に抽出したテキストが入る 
      var date = myMsgs[j][i].getDate();
      var formatD = Utilities.formatDate(date, "Asia/Tokyo", "yyyy-MM-dd HH:mm"); //見やすいようにフォーマットをかける
      myMsgs[j][i].star();// starをつけることで次回以降引っかからないように
      notice_slack(text[1],formatD);
      }
    }
  }
}

// slackへの通知
var postUrl = 'web hook URL';
var username = 'twitterDM';  // 通知時に表示されるユーザー名
var icon = ':bird:';  // 通知時に表示されるアイコン
var message = 'test';  // 投稿メッセージ

function notice_slack(text,date) {
  var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "attachments":[
      {
         "fallback":"fallback Test",
         "pretext":"DMが届きました\n"+date,
         "color":"#4169e1",
         "fields":[
            {
               "value":text
            }
         ]
      }
   ]
  };
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(postUrl, options);
}
```

# 結論
無料で同等のものを作れた。GASはやはり強い。
テキスト形式でもちゃんと見れるようなメール内容だと更にありがたかった。
BigQueryで日付別テーブルかつパーティションテーブルの時のスキャン範囲の確認メモ

# 公式ドキュメント
日付別テーブルやパーティションテーブルについては[こちら](https://cloud.google.com/bigquery/docs/partitioned-tables?hl=ja)

# 疑問
日付別テーブルかつパーティションテーブルの時、FROMでテーブル名に*を使いつつ、特定のパーティション内のみをWHEREで指定してクエリすると、どの範囲をスキャンされるのか。
何となく想定どおりと思っていたけど再確認。

# 期待結果
日付別テーブルのうち対象となるパーティションがあるテーブルで、対象となるパーティションの範囲のみがスキャンされる

# 結果
期待どおりの結果となった

# メモ
適当に日付範囲違いでテーブルを3つ用意する

- `github_repos_sample_commits_20160210`
- `github_repos_sample_commits_20160213`
- `github_repos_sample_commits_20160215`

![スクリーンショット 2019-05-30 0.10.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/a3ac7b13-2ccd-0147-f8f3-792ff9bea9ef.png)

`github_repos_sample_commits_20160210`
![スクリーンショット 2019-05-30 0.15.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/427a904a-8c6c-2ef6-426a-6e5c6d2c9f11.png)

`github_repos_sample_commits_20160213`
![スクリーンショット 2019-05-30 0.15.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/ec8f4b5e-2467-3991-b744-4a84895e63ab.png)

`github_repos_sample_commits_20160215`
![スクリーンショット 2019-05-30 0.16.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/87cf5d72-a5f4-1a4c-e374-dfb87caaf940.png)

3つのテーブルを`github_repos_sample_commits*`で検索すると456.4KB
![スクリーンショット 2019-05-30 0.17.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/0c4d1dc5-62c6-284c-2381-fe925174e331.png)

`github_repos_sample_commits*`かつ`github_repos_sample_commits_20160210`にしか存在しない日付で絞って検索すると30.9KBなので、テーブル名に*を使っても対象を絞れる。
![スクリーンショット 2019-05-30 0.18.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/f0135577-f95a-e361-a393-e39ac768ff41.png)

`github_repos_sample_commits*`ではなく`github_repos_sample_commits_20160210`としても30.9KBなので、*でも0210のテーブルのみスキャン対象になっている。
![スクリーンショット 2019-05-30 0.18.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/cde516d7-eef3-7e1b-a9a0-1923b7afe867.png)

全テーブルにある日付の範囲にすると386.6KB
![スクリーンショット 2019-05-30 0.19.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/88c51c59-10b8-d71f-cfc7-927723720641.png)

0210のみだと151.6KB
![スクリーンショット 2019-05-30 0.19.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/17d7ada8-d8ca-7add-57cb-b1686474d4f6.png)

0213のみだと141.4KB
![スクリーンショット 2019-05-30 0.20.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/87b58a0b-5224-411c-d0e7-1f7d85a6ead7.png)

0215のみだと93.7KB
![スクリーンショット 2019-05-30 0.20.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/51b93a9e-b10f-1f46-f09a-ca2ee9216778.png)

151.6+141.4+93.7=386.7≒386.6KBなので、テーブル名を*で検索しても期待結果どおりになった。
360度動画から3DF Zephyrで風景を立体化する

# 概要
フォトグラメトリ用に風景を撮影するに当たり，1方向ずつ撮影すると時間がかかります．
そこで360度カメラを用いて全方向同時に撮影し，切り出して利用します．

# 使用機材・ソフトウェア
- 360度カメラ
- AviUtl
 - 連番BMP出力Plugin
- 3DF Zephyr

#手順

## 動画の用意
360度カメラで動画を撮影します．頭の少し上の位置で撮ると自身の映り込みが少なくて良いです．
360度ビデオとして出力します．後程フレーム単位で出力するため再生速度を上げて短めの動画にします．

## 連番出力
出力した動画をAviUtlに読み込みます.
再生速度を変更しフレーム数を調整します．
4方向に切り出す場合は4倍の枚数になるため，Free版では12フレーム，Lite版では125フレーム以下にします．
![aviutl1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426108/f23e207a-fd1d-42a9-9fb4-ab79519703b1.png)
連番BPM出力を利用し，全フレームを画像として保存します．
![aviutl2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426108/e8f8f1b5-0c1f-1acf-f0ed-cca708f05532.png)
![aviutl3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426108/2084d4ec-422b-ebe6-102c-11e64b45b6fa.png)

## パノラマ写真を分解
3DF Zephyrを立ち上げ ユーティリティ＞画像＞パノラマ写真を分解 を選びます.
![3df1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426108/0edebaad-0b2e-4523-5722-432d3b164103.png)
連番出力した360度画像を分解します．デフォルトでは左・正面・右・後の4方向ですが，必要に応じて上下も出力します．
![3df2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426108/d00eca2f-247b-06d8-a38a-ddc3d446dad9.png)
![3df3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426108/e13c59af-acb8-1932-ed0e-1955b4723895.png)

## 3Dモデルの作成
分解出力した画像を3DF Zephyrに読み込みます．
パノラマ画像をリンクするか聞かれるため はい を押し，低密度点群作成・高密度点群作成・メッシュ抽出・テクスチャ付メッシュ作成を行えば完成です．
![3df4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426108/a1b93be2-be37-b3ce-20a0-ec4b9a5a41bc.png)

#おわりに
本記事では360度動画からの連番出力にAviUtlを利用しましたが，3DF Zephyrにもフレーム出力機能はあります．
しかしFPSを指定することによって出力枚数を決めるため，読み込める最大枚数に合わせるのが面倒であるため今回の手法を取りました．

#謝辞
本記事の作成に当たり[VoxelKei](https://twitter.com/VoxelKei)様の配信を参考にしました．
[360カメラ映像からフォトグラメトリで3Dモデルを生成してVRChatまで持っていく配信](https://www.youtube.com/watch?v=rSWll-2nUo8)
振り出しに戻ろう

# 一度立ち戻ったほうがいい気がしてきた
- API`を実行するファイルを編集しテストするも当たり前だけどダメ
- ただ闇雲にやっても意味がないような気がしてきた。ここ最近全然前に進んでいないような気がするし
- 明日からのタスクを整理

　1.改めて買ったGOの本を読み、基本を勉強する
　2.修正、変更を機会に覚えさせ管理したいので、ローカルリポジトリの内容をリモートリポジトリへプッシュさせ、統合管理させる

# 今日の気持ち
- タイトル付けが段々と面倒になってきた。単純に日付でもいいが内容が分からなくなってくるし、かと言って無記名は仕様上出来ないし。参った、そしてメンドくさい
- duet display接続のiPadとはいえ、デュアルディスプレイは上下配置のスタイルがいいらしい
- 明日もまた挑戦だ！
CookieのSameSite属性 NoneとLaxの違い

## 概要

CookieのSameSite属性について、 `None(=属性なし)`と`Lax`ではサーバで受け取るときにどう違うのか、実際に動かしてみます。

## 背景

Chromeに関する[この発表](https://blog.chromium.org/2019/05/improving-privacy-and-security-on-web.html)を受けて、CookieのSameSite属性を調べ始めたのですが、以下がわかりませんでした。

- `Lax`と`Strict`ではなく、`None`との違いは？
- 付与の方法はわかったけど、受け取るときはどう違うの？

## 結論

先に結論だけ書くと、サーバでCookieを受け取る際、以下のように挙動が異なります。

- `SameSite=Lax` のCookieは、サーバとCookieのドメインが一致していても受け取れない場合がある(POSTメソッドや画像、iframeなど)
- `SameSite=None`のCookieは、サーバとCookieのドメインが一致していれば受け取れる(受け取れない場合がない)

## 検証

以下のCookieを持った状態で検証します。

| Name   | Value | Domain | SameSite |
|--------|-------|--------|----------|
| a-lax  | 1     | a.com  |          |
| a-none | 2     | a.com  | Lax      |
| b-lax  | 3     | b.com  |          |
| b-none | 4     | b.com  | Lax      |

### SameSite=Laxを受け取れる場合

a.comの **GET** メソッドのフォームからb.comに遷移した場合、b.comのサーバで受け取れたのは以下のCookieです。

| Name   | Value | Domain | SameSite |
|--------|-------|--------|----------|
| b-lax  | 3     | b.com  |          |
| b-none | 4     | b.com  | Lax      |

ドメインがa.comのCookieは受け取れませんが、b.comのものは2つとも受け取れました。
b.comからb.comに遷移した場合も同様です。(GETでもPOSTでも)

### SameSite=Laxを受け取れない場合

一方、a.comの **POST** メソッドのフォームからb.comに遷移した場合、b.comのサーバで受け取れたのは以下のCookieだけです。

| Name   | Value | Domain | SameSite |
|--------|-------|--------|----------|
| b-lax  | 3     | b.com  |          |

Cookieのドメインがサーバと同じb.comであっても、`SameSite=Lax`のものは受け取れませんでした。
`None`のものは受け取れました。

このように、`SameSite=None(属性なし)`のCookieは受け取れるが、`Lax`のCookieは受け取れない場合がありました。
他にも以下のようなドメインをまたいだサブリクエストでは、`SameSite=Lax`のCookieは受け取れませんでした。

- a.comにb.comの画像を埋め込む
- a.comにb.comのiframeを埋め込む
ベンチャーを成功させるための組織力

組織の運営のしかたにおいて中国企業に負けていることを自覚すべきだ。

中国のベンチャー企業の開発速度がすごい。
単にソフトウェアに限らず、ハードウェアにおいてもだ。
（もちろん、すごい企業は、やまほどある企業のごく一部であるにはちがいないが。）

まねではなく、第一線での勝負に出ていくためには、何をして何をしないのかを自分達で考えて速く行動する必要がある。
（まあ、まねでも意味のあるまねをするには、それなりの力が必要なことはあるが。）


数年後はこうなるという見本が外国にあって、それを国内で実行すればよいのとはわけが違う。
技術をあとは収穫すればいいほど開発してあって、最後の詰めの部分をどうすればよいのかを知っている人がいて、
その人を最大限活用して先に進むのともわけが違う。

間違いなく第一線の開発を成し遂げるのは、それを支える意思決定、組織力を持っている証拠だ。
開発を成し遂げるのが、１人から数人での人数で済むものと、それ以上の規模のものとでは、開発の進め方・組織の運営のしかたが違ってくる。

国内市場が大きいからだって？
でも、いいものを作ってなければ、外国企業に負けてしまうでしょう。

国による支援があったりするからだって、
それだけで世界の技術開発の競争に勝てるわけではない。
（現に、産業革新投資機構という国策のファンドが支援した企業が必ずしもうまくいっていない。）

経済成長をしているから、伸びられるのだって。
きちんとした判断力と行動力がなければ、間違った選択肢を選んで自滅するでしょう。

私がここで言いたいのは、
きちんとした結果が出せている企業は、ちゃんとした組織力をもっているということだ。

きちんとした組織力を持っているとは、次のようなことだろう。

- 何をなすべきかを提案できる人がいる。
- それを聞いて事業として判断できる人がいる。
- 事業として成立するように、詳細を作れる人がいる。
- 事業を成立させるために必要な人員を確保できる人がいる。
- 事業を新規に始めようとするならば、資金を調達しなければならないし、それを誰かしらを説得して、その期待に対して応えていく。
- それらを実現するために、必要になること、生じてくるさまざまな問題に対して取り組める。


そういったことができているからこそ、大学の教授が中心になって発足した会社が５年で、世界で最大規模の企業の一つになったりする力がある。






----
laravelでURLを作成する便利な関数(route()・action())を使うときに、パラメータをエンコードする

route()・action()はどちらもURLを作成するときにすごく便利です。

```
route('sample.index');　　//こちらは、routes/web.phpでnameを指定する必要があります。
action('SampleController@index');
```

どちらも同様のURLを作成してくれます。第二引数で、パラメータを渡すことができます。
Bladeのほうで、利用するときは、旧型の書き方と比べると可読性が全然違います。

###旧型

```
{{Form::open(['url' => 'http://sample/index?id='. $data['id']. '&name='. $data['name'])}}
```

###route()・action()利用時

<b>url属性</b>を使用した場合

```
{{Form::open(['url' => route('sample.index', [$data])])}}
{{Form::open(['url' => action('SampleController@index', [$data])])}}
```

LaravelのBladeには、routeとactionの属性が用意されています(パラメータがない場合は利用する)
(こちらの形でも、input hiddenを使えば、パラメータを渡すことは可能ですが、個人的には、すべてurl属性を使って統一するほうが見やすい気がします。)

```
{{Form::open(['route' => 'sample.index'])}}
{{Form::open(['action' => 'SampleController@index])}}
```

##Formにroute関数を使用して、特定の場合、思った挙動をしなくなる話

<b>当然と言われれば、それまでの話なのですが、URLにidを埋め込んで、そのidに、/を入れたときに、思った通りの挙動をしません。</b>例をあげてみます。

```routes/web.php
Route::get('/test/{id}/index', 'TestController@index')->name('test.index');
```

idごとのデータのindexメソッドの処理がはしる想定のルートです。

```:TestController.php
public function index(Request $request, $id)
    {
        dd($id);
    }
```

引数で、idを受け取ります。それでは、bladeを編集します。

```:test.blade.php
{{Form::open(['url' => route('test.index', ['id' => '1']), 'method' => 'get'])}}
{{Form::submit('送信')}}
{{Form::close()}}
```

まずは、idに1をいれて、ボタンを押下してみます。

<img width="368" alt="Screenshot_8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325600/42d9af4f-f0f4-a2e9-c4f0-7e5aeb241ee8.png">

想定通り、1が表示されました。それでは、/をいれてみます。

```:test.blade.php
{{Form::open(['url' => route('test.index', ['id' => '/']), 'method' => 'get'])}}
{{Form::submit('送信')}}
{{Form::close()}}
```


/を入れて試してみます。404エラーがでました。URLをみると、///となっており、URLがおかしくなっています。

<img width="700" alt="Screenshot_10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325600/b0da7f1e-814a-19ff-5a9a-33ca7003868a.png">

###対処法
本来、/はURLの区切り、?はパラメータを渡すときにURLの大切な役を担っています。それを、URLのパラメータとして使用するためには、エンコードする必要があります。

```:routes/web.php
Route::get('/test/{id}/index', 'TestController@index')->name('test.index')->where('id', '(.*)');
```

<img width="350" alt="Screenshot_11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325600/794ccf34-1edb-6887-877b-b7a3f157faaa.png">

できました。?をパラメータに使いたい場合は、エンコードされていたらそのまま使えますが、されていなかったら、urlencode('?')などでエンコードしてから、パラメータとして使用しましょう。

##まとめ
パラメータに/や?を使わないようするのが一番いいと思います

[参考にさせていただいた記事-スラッシュのエンコード](https://readouble.com/laravel/5.8/ja/routing.html)
[PHP]セッションの有効期限が切れてもセッションが消えるわけじゃない。

# session.gc_maxlifetimeの設定だけでは不十分

よくありがちな30分間操作がなければセッションを無効にする、といった処理。
セッションの有効期限(session.gc_maxlifetime)を30分に設定するだけでいいんじゃない？と思っていました。

```php
ini_set('session.gc_maxlifetime', 1800);
```
https://php.net/manual/ja/session.configuration.php#ini.session.gc-maxlifetime
> session.gc_maxlifetime は、データが 'ごみ' とみなされ、消去されるまでの秒数を指定します。 ガベージコレクション (ごみの収集) は、 セッションの開始時に行われます (session.gc_probability と session.gc_divisor に依存します)。

https://www.php.net/manual/ja/session.configuration.php#ini.session.gc-divisor
> session.gc_divisorと session.gc_probabilityの組み合わせで すべてのセッションの初期化過程でgc（ガーベッジコネクション）プロセス も始動する確率を制御します。確率は gc_probability/gc_divisor で計算されます。例えば、1/100は各リクエスト毎に1%の確率でGCプロセスが 始動します。 session.gc_divisorのデフォルトは100です。

つまり、実際に削除（ガベージコレクション）が行われるのは次回のsession_start()時。かつ、デフォルトであれば1/100の確立。

また、この方法では有効時間が伸びない場合もあるようです。理由は後述。

# 毎回破棄したい場合

```php
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
```
https://www.php.net/manual/ja/function.session-gc.php
> PHPは、デフォルトで確率ベースのセッション GC を行います。
確率ベースの GC は多少は機能しますが、いくつかの問題があります。 1) トラフィックが少ないサイトのセッションデータは、優先期間内に削除されないことがあります。 2) トラフィックの多いサイトでは、GC が頻繁になる可能性があります。 3) ユーザーの要求の際に GC が実行され、ユーザーは GC 遅延を感じます。

ただこの方法だと上記の3)のように処理が重たくなることもあるようです。
自分でスクリプトを書いた方がいいかも。

# 有効時間が伸びない場合
https://www.php.net/manual/ja/session.configuration.php#ini.session.gc-maxlifetime
> 注意: 異なる値を session.gc_maxlifetime に指定している 別々のスクリプトがセッションデータの保存場所を共有している場合、 一番小さい設定値に達した時点でデータが消去されます。このような場合には、 お互いに session.save_path を使用します。

複数のアプリケーションなどでセッションファイルの保存場所が同じ場合には、一番小さい設定値になってしまうようです。
この場合はsession.save_pathでセッションファイルの保存場所を変更する必要があります。

# 参考
[セッションの有効期間とか設定とか挙動とかを調べました](https://pentan.info/php/session_gc.html)
[[php]ログインセッションの維持・有効期間について (session,cookie)](http://www.fwoabw.info/entry/2017/05/26/post-8282)
[PHP のセッションに関する覚え書き](https://thk.kanzae.net/net/itc/t4082/)
Visual Studio Code 痛ターミナル化 

## VScodeのターミナルの背景画像を設定する。
バージョンによってDOM構造が変わるようで、これまでいくつか紹介されていた方法ではうまくいかなかったので修正したものを共有します。(version 1.34で確認)

`/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/out/vs/workbench/workbench.main.css`
に以下を追加 

```workbench.main.css
.monaco-workbench .part.panel:after {
    content: '';
    background: url("/path/to/hoge.png") no-repeat;
    background-size: contain;
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0px;
    right: 0px;
    background-position: right;
    opacity: 0.2;
    pointer-events: none;
}
```

ファイル変更後、VSCodeをリロードすることで適応される。

参考:
https://qiita.com/chado/items/3dafb263e912bf78f4bf


### [おまけ] サイドパネルのディレクトリツリー背景も設定

```workbench.main.css
.explorer-folders-view:after{
    content: '';
    background: url("/path/to/bar.png") no-repeat;
    background-size: contain;
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0px;
    right: 0px;
    background-position: bottom;
    opacity: 0.12;
    pointer-events: none;
}

```
ステレオ画像における深層学習超解像：Enhancing the Spatial Resolution of Stereo Images using a Parallax Prior(再現実装)

# 論文
【タイトル】 Enhancing the Spatial Resolution of Stereo Images using a Parallax Prior (CVPR2018)
【概要】

 - Stereo Imageを用いた超解像手法の提案
 - 白黒画像の生成→カラー画像の生成のtwo stage学習
 - 視差を表現したシフト画像の利用

# 開発環境

- Windows10  
- Pytorch


# データセット
Flickr1024: A Dataset for Stereo Image Super-resolution (https://yingqianwang.github.io/Flickr1024/)

# ソースコード
https://github.com/kyoukuntaro/StereoSR_Jeon_CVPR2018
flaskでSQLite3を使っている時データベースが作成されない時

環境はwin10です

```
sqlite3.OperationalError: unable to open database file
```

みたいな時に原因がわからなかったのですが。

```
>python ./src/main.py
```

ではなく直接main.pyのある所に行って

```
>python main.py
```

とすればいけました。だれか理由を教えてくれ～
C#のリストで、条件に一致するインデックスを取得する方法

## C#のリストで、条件に一致するインデックスを取得する方法
この目的には`FindIndex`が使えます。

### 例
`sampleList`から、idが3の要素のインデックスを取得するには次のようにします。

```c#
var index = sampleList.FindIndex(sample => sample.id == 3);
```

その他の方法についてコメントもお待ちしております。
この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)