OmniAICreator/Qiita-1.07M huggingface dataset:
3人子育て中の助産師がPHPを学んで2日で作ったもの

phpを学んで2日で作った課題がこちらです。
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533569/59c52ad1-0e53-7f0b-074b-98b951122904.gif)

#これを作った理由
これを作ろうと思ったかの詳細な事例は[ブログ](https://www.55mfmfmf55.com/riskscore/)に記載しました。

とりあえずphpの基本機能を実装するために、先生からはいわゆる「お問い合わせフォーム」的なので良い的なお話だったのですが、どうせだったら自分が作りたいのを作ろうと思いこちらにしました。

個人的にはこのリスクスコアに限らず、ありとあらゆる問診がわざわざ病院内で記載する必要はないと思っています（救急は除く）。
 事前予約している場合はこういうので事前に入力して病院に送るで良いと思います。
（課題がたくさんあるのは承知しています笑）

また看護研究でのアンケート調査もこういうもので良いと思っています。
現状ほぼ全部紙です。印刷→回収(返信用封筒用意したり回収BOX作ったり）→データ入力。全然エコではないし、何よりもこの時間と労力が無駄です。（関連[ここ](https://www.55mfmfmf55.com/study-with-it/)）
研究者も大変で忙しいので、こういう無駄は無くしてその分早く家に帰って休憩したり、分析や考察に時間をかけたりした方が良いと思っています。
将来的にはアカデミックな分野でもお手伝い出来れば良いと思っているので、その練習にもなるかなと思い今回これを作成しました。
（これにも課題がたくさんありますが笑）

#機能とこだわった点
機能としては至ってシンプルで、dataをpost→表示だけです。

こだわった点というか意識したのは、毎度の事なるべく手間を取らせない。
そのために回答の選択肢が2個のものはラジオボタン、それ以上あるのはセレクター、複数選択可能な回答はチェックボックスにしました。

今までの経験上、患者目線で質問自体の意味がよくわからない質問紙も何回か見たことがありました。
その多くは外国語を訳したものでした。
今回はそういう質問紙ではありませんが、今後そのような質問紙にも対応できるよう、JSのクリックイベントで回答内容を表示させるようにしました。
こうする事で、選択や回答ミスを減らせると思います。

また今回は回答を表示させる事で、回答者自身にも回答結果を見れるようにしました。
（看護研究などで必要がない場合もありますが）

#実装したかったこと
36時間という限られた時間しかなかったので、CSSはほぼいじっていません。
残念・・・
また印刷ボタンを作って、紙で印刷できて（送信出来れば紙で印刷する必要はないのですが、こういうシステムに対応しきれない病院や、印刷して持っておきたいという人のために）、その際記入日や時間も自動出力出来たりしたかったです。

#感想
サーバーサイドを学び、データを扱えるようになり相当やれる事の幅が広がったなという印象があり、今後がますます楽しみになりました！！
gulpでdjangoのrunserverとsassのコンパイルを同時にしたい

## 概要
- html変更したら、その都度、djangoのrunserverしたい
- sassもコンパイルしたい
- sass変更したら、その都度、djangoのrunserverしたい

gulpでsassのコンパイル自動化、browser-syncとかの記事は、よく見かけたのですが、djangoでサービス作っているときに、gulpでrunserverとsassの自動化を同時にやろうとしたときに、つまづいたので記事化しました。

もっと他にいいやり方があるかもしれませんので、ご参考程度に。

## gulpfile.jsの中身

### gulpfile.js

```gulpfile.js
const gulp = require('gulp');
const plumber = require('gulp-plumber');
const sass = require('gulp-sass');
const notify  = require('gulp-notify');
const child = require('child_process');

const paths = {
  'src': {
    'scss': './static/scss/*.scss',
    'html': './app/templates/**/*.html',
  },
  'dist': {
    'css': './static/css/',
  }
};
var server = null;

gulp.task('sass', function() {
  console.log('sass start!!');
	var stream = gulp.src(paths.src.scss)
    .pipe(plumber({
        errorHandler: notify.onError('Error: <%= error.message %>')
    }))
    .pipe(sass({
        outputStyle: 'compact'
    }))
    .pipe(gulp.dest(paths.dist.css))
    .pipe(notify({
        title: 'Sass file is compiled',
        message: new Date(),
        sound: 'Tink'
    }));

    return stream;

});

gulp.task('server:spawn', function(cb) {
  if (server) {
    server.kill();
    console.log("kill task done!");
  }

  server = child.spawn('python', ['manage.py', 'runserver'], { 
    stdio: 'inherit'
  });

  server.on('close', (code) => {
    if (code !== 0) {
      cb(code);
      console.error('Django runserver exited with error code: ' + code);
    } else {
      cb();
      console.log('Django runserver exited normally.');
    }
  });
});

/// 監視フォルダ ////////////////////////////////////////////
gulp.task('watch', function(){
  gulp.watch(paths.src.scss, gulp.series('sass'));
  gulp.watch(paths.src.scss, gulp.series('server:spawn'));
  gulp.watch(paths.src.html, gulp.series('server:spawn'));
  console.log('gulp watch started');
});

gulp.task('default', gulp.series('watch'), function(){
  console.log('Default all task done!');
});
```

### 詳細の覚書
ずっと、server:spawnだけが毎度呼び出されて、sassが動かなくて躓いていました。これは、非同期処理の返り値に問題がありました。
今回のコードでは `gulp.task('server:spawn', function(cb) {` としていて、タスク完了を伝えるcallback関数をつかっています。
このタスク完了がないがために、他のタスクが動かないだとか、「このポートは使われている」といったエラーがでてしまいました。

この記事が、とても参考になりました。
http://js.studio-kingdom.com/gulp/gulp_task/
https://qiita.com/morou/items/d54000396a2a7d0714de

```.js
gulp.task('server:spawn', function(cb) {
  if (server) {
    server.kill();
    console.log("kill task done!");
  }

  server = child.spawn('python', ['manage.py', 'runserver'], { 
    stdio: 'inherit'
  });

  server.on('close', (code) => {
    if (code !== 0) {
      cb(code);
      console.error('Django runserver exited with error code: ' + code);
    } else {
      cb();
      console.log('Django runserver exited normally.');
    }
  });
});
```

ちなみに、sassのタスクでは、streamを返すようにしています。
sassのコンパイルのような、pipeでつなぐようなものは、stream
runserverのような、エラー時のハンドリングもしたい場合は、callback用の関数なんですかね。


### 参考サイト
https://qiita.com/morou/items/d54000396a2a7d0714de
http://js.studio-kingdom.com/gulp/gulp_task/
https://stackoverflow.com/questions/35531334/how-to-use-gulp-browsersync-with-django
初投稿（ガチの）

ProgateでHTML&CSS学習コース　初級編を修了。

目標はサッカーのサポーター同士のマッチングサービスの制作（一緒に試合に行く友達を見つける）。

Qiitaは勉強記録、備忘録として使っていこうと思います。

※20/1/21追記
「JavaScriptの関数のかきかた！」で運営に非公開にされたとかいた伝説の初投稿記事。初投稿タグをつけていなかったのが原因かなと思ったのでつけてもう一回公開しておきます。
UbuntuでMySQLをインストールした後、rootユーザでログインしようとすると【Access denied for user 'root'@'localhost'】と出て弾かれる

# インストール
mysql 5.7.28

# 事象
```
$ sudo apt update
$ sudo apt install mysql-server
```

上記コマンドで、UbuntuでMySQLインストール後に `mysql -u root -p` でログインしようとすると `Access denied for user 'root'@'localhost'` と出て弾かれる。

# 解決
MySQLインストール後、セキュリティ設定をしなきゃいけないみたいですね^^;

[Ubuntu18.04にMySQLをインストールする手順](https://www.virment.com/how-to-install-mysql-ubuntu/)

上記のページを参考にさせていただきました。

上記ページを読んでいて分かったのですが、前提として
>MySQL 5.7以降では、MySQLのrootユーザはデフォルトではそもそもパスワードによるログインができないようになっています。パスワードの代わりに、システムのrootユーザ（ここではOSがUbuntuなのでUbuntuのrootユーザ）情報でログインする必要があります。すなわち、以下のようにsudoでMySQLのrootユーザとしてもMySQLにログインできます。

と記載してあるので、 `sudo mysql` でログイン

```
$ sudo mysql
[sudo] password for XXXXXXXX:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.7.28-0ubuntu0.18.04.4 (Ubuntu)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```
入れました！
OAuthを理解しよう

こちらのページは[Tokyo City University Advent Calendar 2019](https://adventar.org/calendars/4282)17日目の記事です。
昨日の記事は杉田玄白さんの「[TCUバードって知ってる？](https://note.com/tcubird_fan_club/n/nb53305806132)」でした。

今回node.jsのコラム的なものを書きたいと予定していたのですが時間が足りずコミケで使用した記事をQiitaに転載する形で参加させていただきます。

## OAuthに対する正しい認識と用法を知ろう
最近流行りのOAuthなのですが、この仕組みについて間違えた理解をしている人が多いかと思います。例えばOAuth認証というワード、こちらは誤解の元凶ですね。使い方的には間違えてないんですがこれだけだとOAuthはTwitterなどの他サービスを用いたログインのための認証システムと勘違いされてもおかしくない気もします。（Twitter等のSNSを用いたログインでは基本的なユーザ情報にアクセスすることをOAuthで許可することによって許可され取得したデータをログインのために使うのであってログイン処理はOAuthではありません。）
OAuthとは、リソースオーナー（利用者）が同意することによってクライアント（アプリなど）が限定的な権限でリソースサーバーにあるリソースオーナーのデータを使用できるようにするための仕組みのことです。クライアントは自分の権限を代理で使用するいわゆる弁護人というようなイメージです。

## 各種用語の解説
OAuthの具体的な流れを説明する前に前準備として理解しておくべき用語がありますのでここで紹介させていただきます。

### トークンの種類
- アクセストークン
クライアントがデータを利用する権限を持っていることを証明するもの。認可サーバーから要求されたスコープに応じたものが発行されます。
アクセストークンは流出を防ぐために後述するリフレッシュトークンより有効期限が短くなっています。

- リフレッシュトークン
アクセストークンの有効期限が切れた際、リフレッシュトークンを用いると再びアクセストークンを発行することができます。

- エンドポイント
各要素から発行されるURIのことです。以下の種類があります。
- 認可エンドポイント
認可サーバーが与えるURIです。クライアントからの要求に対してリソースオーナーの同意が行われたことを示します。

- トークンエンドポイント
認可サーバーが与えるURIです。このURIにアクセスすることによりクライアントはアクセストークンを取得することができます。

## 色んなタイプありますけど割愛させていただきます
OAuthと言っても一口縄ではいきません。グラントタイプよってさまざまな種類に分かれています。
グラントとは付与タイプのこと、要するにグラントタイプによって権限を付与する流れが変わってきます。
全部理解しようとすると骨が折れますので今回は主要なグラントタイプだけ理解しちゃいましょう。（実際のところそれぞれのタイプ間では細かな差があるくらいで大まかな流れは同じです。）
### 認証コードグラント
このタイプでは、リソースオーナー、クライアント（いわゆるアプリやwebサイト）、認証サーバー、リソースサーバーの4つの要素が出てきます。 
このグラントタイプはクライアントと認可サーバーの間で認証が行われるのでセキュアであるところがメリットとして挙げられます。
セキュアであるためアクセストークンとリフレッシュトークンの両者を発行することができます。
図で見た方が早いので図にしてみました。全体図は次の図のようになっています。 （突貫だったので手書きです、申し訳ありません）

![OAuth.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367788/8ce017b4-2259-ae12-3545-9f4cb6c2d45e.jpeg)


## 流れをかみ砕く
まず最初にリソースオーナーがクライアント、要するにアプリにアクセスします。この時、リソースオーナーはそのクライアントのサービスにパスワードなど機密情報を預けるのが不安、もしくは新しくアカウントを作るのが面倒と思うかもしれません。クライアント側もリソースにはアクセスしたいがパスワードなど漏れるとマズイ情報を預かりたくないと思うこともあるかもしれません。そういう場合にOAuthを使うと、機密情報をリソースオーナーとクライアント間で直接受け渡しする必要なく、クライアントしか扱えないリソースをリソースオーナーの代わり、いわゆる代理で扱うことができるようになります。
代理でリソースを扱うために、クライアントはリソースオーナーからの要求に対して認可サーバーにアクセスするためのリダイレクトURIを発行します。このURIがいわゆる認可エンドポイントです。 これは今からあなたのリソースを代理で使いますよ？という事前確認を行うためのものです。
リソースオーナーは認可サーバーにアクセスし、クライアントが使用したい権限の利用に対して認証情報を送る等の過程を経て同意を行います。
認可サーバーは認証を経たリソースオーナーからアクセスを受けるとトークンエンドポイントを発行し、クライアントに返します。このURIにクライアントがアクセスするとようやくアクセストークンとリフレッシュトークンが発行されます。
クライアントはこのアクセストークンを利用し許可されたリソースにアクセスしていくことになります。
簡単な例を挙げるとすればTwitterの診断メーカーがあります。これは必要な権限としてユーザの基本的な情報とツイートを代理で行う権限を要求します。この要求する権限はクライアント側で自由に設定できるため、どのような権限を要求しているのか同意を行う際しっかりと確認しなければいけません。さもなければ意図してない情報の流出を許してしまうことになります。実際に必要以上の権限を要求してくるクライアントは多数存在してますので日頃から注意しましょう。

### その他のグラントタイプ
- インプリシットグラント
現在非推奨となっているグラントタイプです。
非推奨な理由としては認証の段階でクライアントに直接アクセストークンが渡されるため流出リスクが高いためとなっています。

- クライアントクレデンシャルグラント
クライアントとリソースオーナーは通常分かれていますが、このグラントタイプではクライアントがリソースオーナーも兼ねることになっています。

- リソースオーナーパスワードクレデンシャルグラント 
ユーザーがIDとパスワードをクライアントへ送信するとそれ以降の処理はクライアントと認証サーバーで完結するタイプです。

## おわりに
以上になります。実践的な内容ではないのですが仕組みの理解はできましたか？実践経験を積みたい方はQiita等で調べてみると無限に記事がでてくるのでそちらを参考にしてみてはいかがでしょうか。 
拙い文章で分かりにくかったかと思いますが、最後まで読んでくださった方ありがとうございました。もし間違い等あればコメント欄にてコメントお願いします。

次の記事はナカX卜さんです。よろしくお願いします。
Cocos2d-xとElectronでエディターっぽいものを作ろう

この記事は [Akatsuki Advent Calendar](https://adventar.org/calendars/3952) の17日目の記事です。

## 背景
Cocos2d-xだけでエディターを作成するのは難儀だとおもいます。
CococsCreatorを使ってない場合はさらに困難だと思います。
UIの作成・調整の実装などで相当なコストがかかります。
そこでCocos2d-xをViewer、ElectronをEditorにするという手法を紹介します。
UIの部分をElectronに任せることで、比較的簡単にUIの作成・調整を行えるようにするというのが狙いです。

## 実装
### 動作確認環境

- Mac OS Mojave
- Xcode 11.3
- Cocos2d-x 3.17.1
- Electron 5.0.7

### 概要図
PC上で動くことを想定しています。
Cocos2d-xをViewer、ElectronをEditorにするということで、重要になってくるのはプロセス間通信になります。
今回は名前付きパイプを使用することで実現する方法を紹介します。

![AdventCalender01.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55107/9782bca6-b8b8-bce2-189d-5d6461791161.jpeg)


### 実装
コアとなる部分のコードのみを紹介します。
また、以下の例では通信はjsonを使用することを想定しています。

Electron側のコーディングイメージとしては以下の通りです。

```js:ElectronSample.js
const exec = require('child_process')

...

/**
 * 引数に指定したJsonをビュワーに送信します
 * @param json ビュワーに送信するJson
 */
function sendJsonToViewer(json)
{
    var jsonString = JSON.stringify(json)
    var command = 'echo \'' +  jsonString + '\' > /tmp/pipename'
    exec.exec(command)
}
```

Cocos2d-x側のコーディングイメージとしては以下の通りです。

```cpp:CocosSample.cpp
// callback: Editor側からデータを受け取った際に呼ばれる関数。
void SomeClass::listenMessageFromEditor(const std::function<void(json型)> callback)
{
    mkfifo("/tmp/pipename", 0700);
    _thread = std::thread([this, callback]() {
        while (1) {
            std::string message = 名前付きパイプの中身を読み取ってstd::string型に変換する関数("/tmp/pipename");
            auto json = 文字列をJsonに変換する関数(message);

            auto scheduler = Director::getInstance()->getScheduler();
            scheduler->performFunctionInCocosThread([callback] { callback(json); });
        }
    });
}
```

使い方次第では以下のようなものが出来上がります。
Cocos2d-xをViewer、ElectronをEditorにして出来上がったマテリアルエディターもどきです。

![AdventCalender2019_02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55107/b55cf82f-186e-b8dd-d51f-48453146cc23.gif)


## 考察
### メリット
- Cocos2d-xを使ってるプロダクトにはおすすめです。
    - 既存の資産を利用してViewerを作成することができます。

### デメリット
- Cocos2d-xを使っておらず、UnityやUnreal Engineを使用しているプロダクトであればエディタ拡張が充実しているので、今回の手法はほぼ役に立たないでしょう・・・。
- ElectronはHTMLやJavaScriptなどWeb系の技術を使用するため、それらについてあまり詳しくない人であれば導入コストは高いです。
- 名前付きパイプをしようしている都合上、セキュリティ上パブリックな環境に置くのは避けた方が良いでしょう。ローカル環境・社内ツール向けです。

以上です。
それでは良い開発ライフを！
EtherCAT 動画集（説明編）




この記事は [EtherCATについて語る Advent Calendar 2019](https://adventar.org/calendars/4097) の17日目です。
昨日は@lipoyangさんの [GR-SAKURAでEtherCAT](https://lipoyang.hatenablog.com/entry/2019/12/16/120206) でした。

#今日のネタ

そろそろネタが切れつつあり、また年末年始の忙しさが重なってきたので〜

パっと仕上がる動画紹介〜

EtherCATを知る上で動画を見るのはとても勉強に成るので、紹介していきます。

# EtherCATGroup

- EtherCAT Functional Principle (2D)
[![画像がここに入る](http://img.youtube.com/vi/z2OagcHG-UU/0.jpg)](http://www.youtube.com/watch?v=z2OagcHG-UU)


EtherCATのパケットの流れを判りやすくまとめた動画。
最初この動画見て「ホントかよ、ウソじゃね？」と思っていましたが、色々実験して「ホントでした。凄いね！」と思ったので、皆さん安心してご覧ください。

- EtherCAT Functional Principle (3D)
[![画像がここに入る](http://img.youtube.com/vi/N2HJq62qP9M/0.jpg)](http://www.youtube.com/watch?v=N2HJq62qP9M)


何故か3D版もあるので見てあげましょう。


- EtherCAT in 20 minutes

[![画像がここに入る](http://img.youtube.com/vi/k4KufZR6XYs/0.jpg)](http://www.youtube.com/watch?v=k4KufZR6XYs)

EtherCATについて20分語った動画。
途中出てくるハンバーガーが気になって仕方がないですが、ビックなハンバーガー（データー量大きいよ）がとても似合う。

#各社説明動画
What is EtherCAT?
[![スクリーンショット_2019-12-16_23-38-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/a1fc0844-b232-ad36-54fc-9d2bc14a2c2d.png)](https://www.youtube.com/watch?v=tYAl2jkaB8Q)
https://www.youtube.com/watch?v=tYAl2jkaB8Q

ネコが一瞬出てくるので期待高まる。

[![画像がここに入る](http://img.youtube.com/vi/vOxKnxIHzxc/0.jpg)](http://www.youtube.com/watch?v=vOxKnxIHzxc)
ASIX EtherCAT Slave Controller Solution Introduction
台湾メーカーASIXの紹介動画


#今日はここまで
まぁ見ての通り、日本語による解説動画は無いですね。
みんな資料は同じETGから公開されているプレゼン資料
https://www.ethercat.org/download/documents/EtherCAT_Introduction_JP.pdf
そのうち自分もコレを題材に動画を撮ってみようかなぁと思ったり思わなかったり。

早々ですが、コレにて！

北神(@nonNoise)
中断時系列分析での多重共線性問題

この記事は[Open and Reproducible Science Advent Calendar 2019](https://adventar.org/calendars/4523)の17日目の記事です。

これまでの記事では主に再現性の問題が取り扱われています。
本稿では臨床疫学領域で近年注目されている中断時系列分析 (interrupted time series analysis: ITSA) の方法論的な問題点と、それによって生じる解釈可能性への影響について述べます。アドカレの趣旨からは若干ずれるかもしれませんが、お付き合い頂けますと幸いです。

中断時系列分析はある介入またはイベントが時系列で測定されるアウトカムへおよぼす影響を評価する統計学的な手法のひとつです。介入前のトレンドが介入によって中断されているかを、反事実と比較することで評価します。RCTが適用できない状況での因果推論の手法として有効であり、制度や政策の影響の評価にも使用しやすい、とても便利な手法です。詳しくは中断時系列分析については[宜保さんのスライド](https://www.slideshare.net/koichirogibo/its-81063341)がわかりやすいのでご覧下さい。

中断時系列デザインは、より厳密には中断時系列デザインに回帰分断デザイン (regression discontinuity design) を適応したものといえます。回帰分断デザインの他にも、ARIMAXモデル () や外生変数を持つ状態空間モデル (state-space model) などを中断時系列デザインに用いることができます。

Y = β0 + β1X + β2t + β3Xt     …… (1)

線型モデルを用いた中断時系列分析は (1) 式のように立式されます。第1項のβ0は介入開始前の水準を表します。第2項Xは介入の有無で、通常はダミー化され、介入前を0、介入後を1とコードします。その係数β1は介入に伴う水準の変化を意味します。第3項のtは時系列で、通常は観察開始点を1とし、1観察につき1ずつ増加します。第4項のXtは時系列と水準の交互作用項で、その係数β3は介入に伴う傾きの変化を意味します。第4項の後に周期性等を補正するための項を置くこともありますが、本稿では省いています。換言すると、中断時系列デザインは、時系列データへの介入の影響を、水準の変化と傾きの変化に分けて同時に評価しています。水準の変化と傾きの変化を同時に評価できることは、ARIMAXモデルや状態空間モデルにはない中断時系列分析の特徴です (ARIMAXや状態空間モデルで水準と傾きの変化を同時に扱う方法があれば教えてください)。

ところで、線型モデルを用いる際に注意すべき点として多重共線性の問題があります。多重共線性とは、複数の独立変数間に強い相関がみられる場合に、それらの独立変数の効果推定値の分散が過大に推定され、結果として効果推定値が過小評価されることです。多重共線性が発生しているかどうかはvariance inflation factor (VIF) を用いて評価します。慣習的にはVIFが5または10を超えている場合に多重共線性の発生を疑い、相関の高い独立変数のうち一方を解析から除外するのなどの措置を行います。多重共線性を発生させうる代表的な統計学的な操作のひとつが交互作用項の投入です。

中断時系列デザインや回帰分断デザインは、傾きの変化の評価のために交互作用項を投入することから、多重共線性が生じるリスクの高い手法です。下図はダミーデータをもとにしたもので、某市でのとある疾患Yの人口10万人あたりの発生率を施策Xの実施前後で中断時系列分析を用いて比較したものです。疾患Yの発生率は増加傾向にありましたが、施策Xの実施後に減少傾向へと転じていることが読み取れます。しかし、施策Xの水準への影響 (β = 54.2, 95%CI = [-39.55, 147.90])、傾きへの影響 (β = -0.9, 95%CI = [-2.14, 0.36]) は共に有意ではなく、とくに水準への影響の推定値が異常です。VIFはそれぞれ197.88, 209.49と10を大きく超えています。この結果をどのように解釈すれば良いでしょうか。多重共線性が生じていることから統計解析の結果をそのまま採用することは慎むべきです。その一方で、特に傾き変化が有意でないのは直観に反するように感じます。多重共線性への対処として交互作用項を除去することも考慮しますが、傾きの変化を評価しないものどうかと思い……正直、解釈にも手続き的にも困ります。

![JCROS-advent2019_sample01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227476/5860b27c-1a25-a097-6f28-bda7e07b6129.jpeg)

ここまで、中断時系列デザインが解析の構造的に多重共線性が生じやすいことを述べてきました。しかしながら、中断時系列デザインの多重共線性問題について、医療や公衆衛生の領域ではどうも認識されていないようです。回帰分断デザインの多重共線性リスクは[10年以上前に指摘されています](http://www.glmj.org/archives/MLRV_2008_34_1.pdf#page=15)が、中断時系列デザインでの多重共線性のリスクは筆者の調べた限りこれまでに指摘されていません。2015年には[薬剤利用研究での報告の特徴と推奨事項](https://doi.org/10.1016/j.jclinepi.2014.12.018) が、2019年7月には[医療領域での報告の特徴](https://doi.org/10.1186/s12874-019-0777-x) が、それぞれ報告されました。しかし、いずれの論文でも多重共線性の評価は項目として含まれていません。筆者はこれまでに数十の中断時系列分析を用いた研究に目を通してきましたが、その多く変数選択の後に交互作用項を含まないモデルが選択されおり、VIFを報告している研究に出会ったことがありません。今後しばらくはこのような研究が増え続けると予想しています。

それでは、中断時系列分析の多重共線性リスクにどう対処すれば良いのでしょうか。
研究者として中断時系列分析を行う際は、棄却されたモデルに対しても多重共線性のチェックを行い、その全てを論文内で報告するべきだと筆者は考えます。傾きの変化と水準の変化を同時に評価する必要がないのであれば、状態空間モデルやARIMAXを用いることを考慮すると良いでしょう。中断時系列分析を用いた研究を読む際は、採用しなかったモデルも含めて交互作用項を投入しているか、VIF等を用いて多重共線性を評価しているかの2点を評価すると良いと思います。

なお本稿は筆者の私見を含むこと、現時点で統計学/生物統計学領域でのコンセンサスでないことはご承知おき下さい。誤り等があればご指摘頂けますと幸いです。
Laravelについてのノート

PHPを触り始めて一年程経過し、「そろそろフレームワークを使ってみたいな！」と思い、PHPのフレームワークの中でも特に人気の高い**Laravel**を使ってみることにしました。
インストールする前に事前に調べ、まとめたものをノートとしてQiitaに残すことにしました。

#フレームワークとは
多くの場合は「Webアプリケーションフレームワーク」のことを指す。
Webアプリ開発を効率よく且つ迅速に進められるように、必要なモジュールやツールをひとまとめにしたもの。
LaravelはPHPにおけるフレームワークの一種である。

#Laravelにある主な機能
##テンプレートエンジン
「テンプレート」と呼ばれるHTMLのひな形を元にプログラムで加工し、画面に出力するためのライブラリのこと。
 これにより、PHPでの開発とHTMLでの開発を分けることができる。
 Laravelには「BLADE」というテンプレートエンジンが備わっている。

##データベース
主に以下二つの機能が備わっている。
###O/Rマッピング
オブジェクト指向で作られたプログラムと関連性データベースを繋げる（マッピング）こと。
これにより実装時のDB操作に関わる煩雑な作業が減らせる為、修正漏れやミスを防ぐことが出来る。

###Eloquent
Laravelに搭載されているO/Rマッパー。
DBのレコードをオブジェクトで処理を出来るようにするクラスを提供する。
テーブル名に命名規則が無かったり、DATETIMEやint型のカラムに対してinsert時update時に自動的にtimestampの更新をしてくれる等の特徴を持つ。

##コマンドラインインターフェース（CLI）
artisan（アーティサン）と呼ばれるもので構成されている。
これに登録されているコマンドを使って必要なファイルを作ったりDBのマイグレーション（データの抽出・変換して新しい所に移転すること）を行う。

#主要な構成
Laravelは以下のシステムで動いている。
特に以下の3つは「**MVC**」と総称されている。
###モデル
データベースと連携を主に行う。（データ処理を担う部分）。
上記のEloquentの機能とビジネスロジックを持ったクラス。
artisanコマンドで作成し、.envファイルで設定を行う。
言わば、バックグラウンド側のシステム

###ビュー
画面処理を行うシステム。
送られたリクエストを元にHTMLで画面を表示する。
言わば、フロントエンド側。

###コントローラ
モデルとビューの仲介する役割を持つクラス。
モデルからDBにアクセスし、取得したリクエストデータを画面に表れる様加工してビューに流したり、ビューから入ったデータをモデルに渡し、DBに保存するといった処理を行う。

##ルーティング
特定のアドレスにアクセスした時、どの機能を呼び出すか設定すること。
Webブラウザから送信されたリクエストデータをコントローラに振り分ける。

##マイグレーション
DBの操作を一括で実行・取消できる機能。
DBのテーブル定義やカラムの変更等の一括変更や、設定の取り消し等がコマンドで行うことが出来る。


#参考文献
・[paizaラーニング Laravel入門編]
(https://paiza.jp/works/laravel/primer)

・[marronブログ テンプレートエンジンとは？/テンプレートエンジン一覧まとめ]
(http://lovee7.blog.fc2.com/blog-entry-95.html)

・[Think IT O/Rマッピングとは？]
(https://thinkit.co.jp/free/article/0606/13/1)

・[株式会社インターエデュ・ドットコム PHPのORM比較: LaravelのORマッパー(Eloquent)の特徴]
(https://corporate.inter-edu.com/developper/1458)

・[KATUBLO 《laravel》php artisan とは何か？簡単に解説]
(https://katuo-ai.com/2019/03/25/laravel-artisan/)
CorDappを自作してみる。(States作成まで)

# 記事の概要
Cordaの公式ドキュメントに沿って、CorDappを自作してみた。
この記事では、statesを作成する所までを記載する。

# 公式ドキュメント
https://docs.corda.net/_static/corda-developer-site.pdf
(主に第5章 「Getting started developing CorDapps」と第6章「KEY CONCEPTS」に沿って実施。)

# statesの概要
1.「states」とは？
statesとは、「元帳上の事実」が記録されているオブジェクト。
statesは状態が変わる(金額が移動する、所有権が変わる等)ことで、更新されていく。
また、Cordaプラットフォームに参加している各ノードはそれぞれstatesを保有し、
保管するためのvault(金庫室)を保有している。

2.「states」の更新のシーケンス
「states」事態は、イミュータブル(作成後にその状態を変えることのできないオブジェクト)のため、
直接更新することはできない。その代わり、新しいstatesを表す新しいバージョンのstatesを作成し、
既存のstatesを履歴としてマークする。statesの履歴は各ノードのvaultに蓄積されていく。

# statesの実装
CorDappを公式ドキュメントの「5.2.2 Step Two: Creating states」に倣ってコーディングしてみる。
ちなみに、プログラミング言語はKotlin。

```Kotlin:CarState.kt
package com.template.states
import com.template.contracts.CarContract
import com.template.contracts.TemplateContract
import net.corda.core.contracts.BelongsToContract
import net.corda.core.contracts.ContractState
import net.corda.core.contracts.UniqueIdentifier
import net.corda.core.identity.AbstractParty
import net.corda.core.identity.Party
// *********
// * State *
// *********
@BelongsToContract(CarContract::class)
data class CarState(　※１
val owningBank: Party, ※２
val holdingDealer: Party,
val manufacturer: Party,
val vin: String,
val licensePlateNumber: String,
val make: String,
val model: String,
val dealershipLocation: String,
val linearId: UniqueIdentifier　※３
) : ContractState { ※１
override val participants: List<AbstractParty> = listOf(owningBank, holdingDealer, manufacturer) ※４
}
```

以下、ソース中の「※」の注釈。
※１：class「CarState」は、用意されているクラス「ContractState」を継承して作成。
※２：class「CarState」にある変数「owningBank」や「holdingDealer」に使われている型「Party」は、
Cordaにて用意されているオブジェクト。ちなみに「party」は法律用語で「当事者」という意味。
ネットワーク上で一意に識別できる名前と公開鍵を保有している。
※３：UniqueIdentifierもCordaにて用意されている型。class(上記の場合だとCarState)が実体化したタイミングで、
linearIdに一意の識別子が付与される。
※４：「ContractState 」のプロパティ「participants」をオーバーライドする。ここでは、「owningBank」、
「holdingDealer」、「manufacturer」のリストを設定している。

# 終わりに
次回はcontractsの作成から再開する予定。
Kubernetes the hard way with vagrant の k8s を v1.15 にアップデートしてみた

# 概要

Kubernetes the hard way with vagrant (kenfdev版)の Kubernetes が v1.10 と古かったので、v1.15 にアップデートしてみました。

# リポジトリ

Kubernetes v1.15.3 に対応したリポジトリを以下においてあります。

https://github.com/tmurakam/kubernetes-the-hard-way-vagrant

# 参考リポジトリ

* オリジナル Kelsey Hightower 版
    * https://github.com/kelseyhightower/kubernetes-the-hard-way
    * 最新版は Kubernetes v1.15.3 に対応している
* kenfdev 版
    * https://github.com/kenfdev/kubernetes-the-hard-way-vagrant
    * Vagrant で実行するための Vagrantfile やスクリプト類が入っている版
    * Kubernetes v1.10.2 とちょっと古い

# 使い方

使用方法はオリジナルとほぼ同じです。[Kubernetes the hard way をvagrantでやってみる](https://qiita.com/str416yb/items/01bb1ba2a1b3fd75506f) などを参考にしてください。
Go言語でFizzBuzzを書いてみた

# はじめに

正月休み時間があったので Go 言語を勉強しました。
基本文法の確認のため FizzBuzz を書いてみたら Go 言語ならではの面白い書き方ができるなー、と思ったので投稿することにしました。


## FizzBuzz のルール

* `1` から `100` まで数字を出力する
* その数字が `3` で割り切れるなら `Fizz` と出力する
* その数字が `5` で割り切れるなら `Buzz` と出力する
* その数字が `3` でも `5` でも割り切れるなら `FizzBuzz` と出力する

# コード

https://play.golang.org/p/CcpxL6bDT2c

```golang

type FizzBuzzInt int

func (i FizzBuzzInt) String() string {
	switch {
	case i%15 == 0:
		return "FizzBuzz"
	case i%3 == 0:
		return "Fizz"
	case i%5 == 0:
		return "Buzz"
	default:
		return strconv.Itoa(int(i))
	}
}

func main() {
	i := FizzBuzzInt(1)
	for i <= 100 {
		fmt.Printf("%3d => %v\n", i, i)
		i++
	}
}
```

## 実行結果

```
  1 => 1
  2 => 2
  3 => Fizz
  4 => 4
  5 => Buzz
  6 => Fizz
  7 => 7
  8 => 8
  9 => Fizz
 10 => Buzz
 11 => 11
 12 => Fizz
 13 => 13
 14 => 14
 15 => FizzBuzz
 16 => 16
 17 => 17
 18 => Fizz
 19 => 19
 20 => Buzz
（以下略）
```

<br>

# 解説

## 型定義

```golang
type FizzBuzzInt int
```

上記のようにして `int` 型を元に新たな型を定義できる。
このように定義した型は基本的には `int` と同じように扱うことができる。

```golang
var i FizzBuzzInt = 10

// 算術演算子や比較演算子はそのまま使用可能
i++
fmt.Println(i) // => 11
fmt.Println(i % 2) // => 1
fmt.Println(i <= 10) // => false
```

ただし型チェックは `FizzBuzzInt` 型として行われるので、
引数が `int` 型の関数に渡すとコンパイルエラーになる。

```golang:int型の関数に渡した場合
func printInt(i int) {
	fmt.Println(i)
}

var i FizzBuzzInt = 10

// 引数の型が一致しないのでコンパイルエラーになる
printInt(i)

// FizzBuzzInt と int は相互変換可能なので、キャストしてやれば問題ない
printInt(int(i))
```

## メソッド

Go言語では *型* にメソッドを紐付ける。
例えば以下のように、整数型（を元に定義した型）に奇数判定用のメソッドを付けることができる。

```golang:整数型にメソッドを追加する
type MyInt int

// MyInt 型に IsOdd メソッドを紐付ける
func (mi MyInt) IsOdd() bool {
  return mi%2 != 0
}

i := MyInt(1)
i.IsOdd() // => true
i++
i.IsOdd() // => false
```

### Stringer インターフェース

https://golang.org/pkg/fmt/#Stringer

Java でいう `Object#toString()` みたいなもの。
`string` 型を返す `String()` というメソッドを定義しておくと、
`Println` に渡したときなどにそのメソッドが呼ばれる。

文字列関係の書式指定子 (`%v` `%s` `%q` `%x` `%X`）でのみ `String()` メソッドが呼ばれる仕様なので、書式指定子で出力内容を切り替えることが可能です。

```golang:Stringerインターフェースの例

type MyInt int

func (mi MyInt) String() string {
  return "hoge"
}

i := MyInt(3)
fmt.Printf("%d\n", i) // => 3
fmt.Printf("%v\n", i) // => hoge
```

参考: https://golang.org/pkg/fmt/#pkg-overview

## コード

以上を踏まえてコメントを追記しました。

```golang

// FizzBuzzInt は int を元にした型
type FizzBuzzInt int

// FizzBuzzInt 型に Stringer インターフェースを実装。
// 出力するときにこのメソッドが呼ばれ、FizzBuzz のロジックで出力内容を切り替える
func (i FizzBuzzInt) String() string {
	switch {
	case i%15 == 0:
		return "FizzBuzz"
	case i%3 == 0:
		return "Fizz"
	case i%5 == 0:
		return "Buzz"
	default:
		return strconv.Itoa(int(i)) // Itoaの引数は int 型なのでキャストして渡す
	}
}

func main() {
	i := FizzBuzzInt(1) // i は FizzBuzzInt 型で初期化

	// 比較演算は int と同様に使える
	for i <= 100 {
		// %d は int として表示、%v は String() メソッドの結果を表示
		fmt.Printf("%3d => %v\n", i, i)

		// インクリメントも int と同様に使える
		i++
	}
}
```
ESP32のADコンバータとWiFiを使用する際の注意点

## きっかけ

　WiFiのサンプルとADのサンプルを組み合わせてプログラムをつくってみたところ、指定したピンの値が常に最大値を示していて<strong>？？？</strong>となったことから。

## 公式データシートを読む
[公式データシート](https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf)

　データシートを見てみるとWiFiを使用するときに、EMAC_～という機能をいくつか使用していてそれぞれがADC2とピンを共用しているらしい。
　ということはWiFiを使う場合はADC1を使用しなければならないということ。このADC1はGPIOでいうところの<strong>32～39</strong>になります。

　初歩的なことかもしれませんが、同じことでつまづいた人のために短いですが記事にしてみました。
Microsoftの「UI test with Selenium」にあるサンプルが動かない

# 0.はじめに
タイトルの通り、以下の記事(Azure DevOpsのドキュメント)にあるサンプルが動かなかったので、ちょっとだけ頑張ったお話｡｡｡
[UI test with Selenium](https://docs.microsoft.com/en-us/azure/devops/pipelines/test/continuous-test-selenium?view=azure-devops)

頑張ったといっても、自分はSeleniumを今まで一切やってなかったので、経験値のある人からすればすぐに解決する話なのかもしれないけど･･･

# 1.やったこと
記事に従ってプロジェクトを作って、ソースをコピーして、テストを実行しただけ。
環境は、以下の通り。
OS: windows 10 x64
IDE: Visual Studio Community 2019

# 2.サンプルのテスト内容
そもそもサンプルがどういうテストなのか。
サンプルがやっていることは、以下。(もしかしたら微妙に違うかもしれないけど、外部の動作を見たらこんな感じだと思う･･･)
(1) Bingのページ(http://www.bing.com/)を開く
(2) 検索ボックスに「Azure Pipelines」と入力する。
(3) 検索ボタンがクリックされない。
(4) 検索結果のうち、タイトルに「Microsoft Azure」が含まれている最初のリンクをクリック。
(5) 表示したページのタイトルに「Azure Pipelines」が含まれていたらテスト成功。

# 3.サンプルが動かなかったところ
2つあった。

(1) 検索ボタンがクリックされない。
`driver.FindElement(By.Id("sb_form_go")).Click();`
のところ。
エラー内容は「OpenQA.Selenium.ElementNotInteractableException: 'element not interactable」。

(2) 検索結果のリンクがクリックされない。
`driver.FindElement(By.XPath("//ol[@id='b_results']/li/h2/a/strong[3]")).Click();`
のところ。
エラー内容は「OpenQA.Selenium.NoSuchElementException: 'no such element: Unable to locate element: {"method":"xpath","selector":"//ol[@id='b_results']/li/h2/a/strong[3]"}」。

まあ、サンプルが動かない、まあ、ね････稀によくありますよね。
環境とか、いろいろありますから････ねぇぇぇええ････

# 4.直してみた
Seleniumの勉強をするためにサンプルから学ぼうとしたのに、まさかサンプルの修正から始めることになるとは････
それぞれの問題について、以下のように修正した。結果、**デバッガで動かしたときには**無事動作した。

(1) 検索ボタンがクリックされない問題
問題の一行を、以下のように修正したら動いた。

```C#
//driver.FindElement(By.Id("sb_form_go")).Click();
IWebElement element = driver.FindElement(By.Id("sb_form_go"));
IJavaScriptExecutor executor = (IJavaScriptExecutor)driver;
executor.ExecuteScript("arguments[0].click();", element);
```
JavaScriptで要素をクリックさせる、という処理らしい。色々調べてたら出てきた。
ちなみに、「element not interactable」で調べてみたけど、ちょっと今回のケースには当てはまらない記事が多くて、探すのに時間がかかった････
なんでここでこんなに苦労しなきゃいけないんだ････サンプルのくせに････
もしかして、スパルタで鍛え上げる方針なのか････？
これくらい自分で解決できない奴は、この世界に足を踏み入れるんじゃない、と････？
もっと優しくしてよ･･･

(2) 検索結果のリンクがクリックされない問題
以下のように修正したら動いた。

```C#
//driver.FindElement(By.XPath("//ol[@id='b_results']/li/h2/a/strong[3]")).Click();
driver.FindElement(By.XPath("//ol[@id='b_results']/li/h2/a[contains(text(), 'Microsoft Azure')]")).Click();
```
これは、検索結果のHTMLの構造が変わったのかな？あまり苦労しなかったですね。
エラーメッセージ見るに、「要素みつけられませんでした！！！」って感じだったし。
検索結果のソースを表示して、HTMLの構造見て、「こうやればいけんじゃね？」でなんとか。
自分、XPathもここではじめて知ったので、ちょっと修正に小一時間かかりましたけども。
今まで、JavaScriptとかHTMLとか全然やってなかったから･･･許して･･･

# 5.まだ解決してないこと
2つある。

(1) コピってきたコードがよくわからない

```C#
executor.ExecuteScript("arguments[0].click();", element);
```
これの、arguments[0]ってのがイマイチよくわからない。
elementはFindElementで取得したIWebDriverのインスタンス？で、インスタンスがリストに入ってるってことなのかな？
それで、0番目の要素をクリックするJavaScriptを実行する、的な･･･？
今度調べてみよう･･･

(2) デバッグじゃないと成功しない
さっき太字で強調した通り、このコード、デバッグじゃないと動かない。
普通に実行すると失敗する。
こういうときは、処理が速すぎて要素の特定とかが追い付いていない印象。
sikulixやってたときも直面した。
適当にwaitとかやれば解決しそうだけど、ちょっと場当たり的な修正って感じがあるような･･･
これも、それっぽいメソッドとかないか調べてみよう････

今日はこんなところ。
はぁ････疲れるなぁ、サンプルなのに････
Apache Aliasのパスの設定で「¥」を使っててリライト機能が動いていなかった件(404エラー解決)

## はじめに
レンタルサーバ環境とmacのxampp環境で動作していたApacheのリライト機能が、windowsのxampp環境でのみ動作しなかった。具体的には404エラーバンバン出てくる。これを抜け出すのに二日もかかってしまったので備忘録として残しておく。

## 環境
win10 64bit
xampp v3.2.4
Apache 2.4.41

## やったこと備忘録
結果はタイトルの通りなんですが。。。原因の詳細のみ知りたい方は飛ばしてください。

最近windowsを使う機会が増えてきたので、xamppで環境構築したのですが、リライト機能だけがどうしても動かなかった。まじでいみわからん。本当にこれ苦しみました。

phpinfoにもちゃんとmod_rewrite読まれてるし、めちゃくちゃ記事サーチしたけど

`「AllowOverride None」になってるからでしょ？
httpd.confちゃんとみなおせよ！
rewriteログだして確認しなさいよ。。。
.htaccess書き方あってる？
`

てきな感じで書かれているものが多かった。

なので、まずはセキュリティ気にせず、xampp内のファイル`AllowOverride None`で全検索かけて`AllowOverride All`に全て変えたけどだめ。

次にApacheでrewriteログ出力させたけど何もrewrite関連のログ出ないし不明。
そもそもログだすのにApache2.2と2.4だとrewriteログの出し方違うってこと知らなくて、2.2のやりかたでログ出力させててApacheが立ち上がらなくなったりして、それを解決するのにも時間かかる始末。

で次に.htaccessの書き方を確認する。でもそもそもcakephpのコピペなんで問題ないはずだったけどこれもいろいろ調べつつ時間かかる始末。

macとwindowsで違うところって何だろって考えたところ、
Aliasのところの設定じゃね?ってことで。
原因はこれだった。

## 原因
httpd.confのAliasとDirectoryに指定するパスに¥を使っていたため。

```httpd.conf
Alias /dev "C:¥Users¥sakamotoyuya¥Documents¥develop"  ←ここと
<Directory "C:¥Users¥sakamotoyuya¥Documents¥develop"> ←ここ
  Options FollowSymLinks
  AllowOverride All
</Directory>
```

一見問題ないように見えるけど、¥使うとリライト機能がうまく動作しなくって404エラーバンバン出てくる。

## 対策
¥じゃなくて/に変えたら治った。

```httpd.conf
Alias /dev "C:/Users/sakamotoyuya/Documents/develop"  ←ここと
<Directory "C:/Users/sakamotoyuya/Documents/develop"> ←ここ
  Options FollowSymLinks
  AllowOverride All
</Directory>
```

Alias使った後のDirectoryのパス指定は設定したAlias名を設定できるようで、
以下のようにしても大丈夫だった。

```httpd.conf
Alias /dev "C:/Users/sakamotoyuya/Documents/develop"
<Directory "/dev"> ←ここ
  Options FollowSymLinks
  AllowOverride All
</Directory>
```
こっちの方がスマートだね。

## なんでこうなったか?
ドキュメントちゃんと読めば書いてあるのかもだけど、
Aliasのパスの指定するときに、macでもwindowsでもパスをコピぺ
して貼り付けしてるからこうなってた。
¥だとリライト機能なぜか動作しない。。。
なんでだろ？？？
【Python】Pythonでcsvファイルに書き込み

#はじめに
csvファイルを書き込むためのPythonコードです。
ディレクトリの指定とファイル名を日付と時間にするなど
ファイル名に日時時間情報を付けることで実行された際に一意の名前のファイルができるため、ログの保存に便利です。

#環境
- Windows 10
- Python3.7
- csv(もとからはいってるので特にインストールは不要)
- datetime(もとからはいってるので特にインストールは不要)

# コード
csv_log.pyと同じディレクトリの`output`ディレクトリにcsv出力します。

```python:csv_log.py
import datetime
import csv

# 日時の取得
now = datetime.datetime.now()
# ディレクトリの指定はここ
filename = './output/log_' + now.strftime('%Y%m%d_%H%M%S') + '.csv'

# ファイル，1行目(カラム)の作成
with open(filename, 'w') as f:
    writer = csv.writer(f)
    writer.writerow(['time','x','y','z'])

x,y,z = 0,0,0
while(1):
    # なんらかの処理を書く
    x += 1
    y += 2
    z += 3
    now_str = datetime.datetime.now().strftime('%H:%M:%S.%f')

    # filenameを作成したファイル名に合わせる
    # writer.writerowでlistをcsvに書き込む
    with open(filename, 'a', newline="") as f:
        writer = csv.writer(f)
        writer.writerow([now_str, x, y, z])

    # 処理が終わったらbreak
    break
```

こんな感じのcsvができると思います

|time|x|y|z|
|:--:|:--:|:--|:--:|
|2021/1/1 12:00:00.000...|1|2|3|
|2021/1/1 12:00:01.000...|4|5|6|
|:|:|:|:|

# おわりに
今回は以上ですが、pandasを使ってデータ分析などを行うことが多く、
pandasでも簡単にcsv出力できるのでまた更新しようと思います。
ありがとうございました！
基本情報技術者試験

年も開けたので、資格取得などに本腰を入れようと思い
基本情報に手を出してみようと思います。

格リンク先に専用ページを用意しましたので、詳細をみたい方はクリックをお願いします。

しかし基本教本の内容をさっくりまとめただけなので
ツッコミがあれば遠慮なくどうぞ

# 基本情報技術者試験とは

経済産業大臣が行う国家試験の一種です。
IT業界に関わるなら取得をおすすめする資格です。


# 午前の部

## テクノロジ系

### 第1章 [コンピュータ化学基礎理論](https://qiita.com/savaniased/items/2f2225488b5ffcc79028)
### 第2章[コンピュータ構成要素とハードウェア](https://qiita.com/savaniased/items/9865780d18c4adb2b4de#raid)
### 第3章 [ソフトウェア](https://qiita.com/savaniased/items/e727f291979f12dc4120)
### 第4章 [コンピュータシステムの構成](https://qiita.com/savaniased/items/809033349e9fe8ba7682#rasis)
### 第5章 [データベース(SQLについては別途記載予定)](https://qiita.com/savaniased/items/5d09777a13a3a1c4898c)
### 第6章 [ネットワーク](https://qiita.com/savaniased/items/ee3c0497250939fb3e39)
### 第7章 [セキュリティ](https://qiita.com/savaniased/items/0a7d8c5cc72eb5606375)
### 第8章 [システム開発技術](https://qiita.com/savaniased/items/9c86c3d20ca424345f56)
### 第9章 [データ構造、アルゴリズム、プログラミング](https://qiita.com/savaniased/items/dc1494e5f0427e44468e)

## マネジメント系

### 第1章 [プロジェクトマネジメント](https://qiita.com/savaniased/items/54c5255948faa690514d)
### 第2章 [ITサービスマネジメント](https://qiita.com/savaniased/items/53c9ba6157eb04f1d3ce)
### 第3章 [システム監査](https://qiita.com/savaniased/items/cc96767beefcb73bbb41)

## ストラテジ系

### 第1章 [システム戦略](https://qiita.com/savaniased/items/6e4e466a33f53bf1dbc1)
### 第2章 [経営戦略](https://qiita.com/savaniased/items/218a47796719a156cc09)


# 午後の部

## テクノロジ系

### 第1章 [浮動小数点表現、論理演算と論理回路](https://qiita.com/savaniased/items/70da791dc821ad90fd8d)
### 第2章 [機械語命令の読解](https://qiita.com/savaniased/items/09adfddeada22a4a6b0e)
### 第3章 [コンパイラの原理](https://qiita.com/savaniased/items/de8f4716933755846284)
### 第5章 [正規化とSELECT文の記述](https://qiita.com/savaniased/items/3770d2a46812f81075ed)
### 第6章 [IPアドレスの設定とサーバの設置](https://qiita.com/savaniased/items/cb737bef723a89df9364)
### 第7章 [VPN](https://qiita.com/savaniased/items/f74e84cdcf615678be5c)
### 第8章 [プロセスフロー図](https://qiita.com/savaniased/items/c8badcce0034184bb859)
### 第9章 [擬似言語プログラム、基本的な処理、二次元配列を利用した処理](https://qiita.com/savaniased/items/38fd20d6ae64ae60c54b)
### 第10章 [表計算の基礎、複雑な関数、マクロ](https://qiita.com/savaniased/items/e215b8e89bbfa838736d)

## マネジメント系

### 第1章 [アンドバリュー分析、ファンクションポイント法](https://qiita.com/savaniased/items/3531a5225f67f86f5986)
### 第2章 [サービスデスク](https://qiita.com/savaniased/items/94525c0ce52b179e173f)

## ストラテジ系

### 第2章 [市場分析](https://qiita.com/savaniased/items/2865e0eeabd830ffece2)
AWS 認定ソリューションアーキテクト – アソシエイト試験の攻略メモ

#概要
AWS 認定ソリューションアーキテクト – アソシエイト試験に合格するために行ったことを記載します。
そして、これから受験を目指す方のお役に立てるように攻略メモという形で残しておきます。
ちなみに、私が受験したのは、2018年2月版です。次の改定は2020年3月となります。

#AWS 認定ソリューションアーキテクト – アソシエイト試験とは

> AWS 認定ソリューションアーキテクト – アソシエイト試験は、AWS における分散システムの可用性、コスト効率、高耐障害性およびスケーラビリティの設計に関する 1 年以上の実務経験を持つソリューションアーキテクト担当者を対象としています。

https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/

- 現在(2019年1月5日時点)の試験は、2018年2月版です。
- 合格ラインは720です。
- 2020年3月にSAA-C01からSAA-C02へと版が更新されるようです。
- 詳細は後述しますが、2020年3月版(SAA-C02)からは、試験分野からDomain5がなくなり、Domain1～Domain4までとなります。
- 試験比率も変わりますので、2020年3月以降に受験を目指す方はそれに合わせた対応が必要となります。

##2018年2月版(SAA-C01)の試験分野
[試験ガイド](https://d1.awsstatic.com/training-and-certification/docs-sa-assoc/AWS_Certified_Solutions_Architect_Associate-Exam_Guide_EN_1.8.pdf)より抜粋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/e2f0ebb5-8401-cb9a-211e-3068d326c4b8.png)

##2020年3月版(SAA-C02)の試験分野
[試験ガイド](https://d1.awsstatic.com/training-and-certification/docs-sa-assoc/AWS%20Certified%20Solutions%20Architect%20-%20Associate%20Exam%20Guide_v1.1_2019_08_27_FINAL.pdf)より抜粋
上述の通り、Domain5が試験分野から外れています。試験比率も変更となっているのが見て取れると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/a9269924-d847-de07-8172-b640037a4edc.png)

##2020年3月版(SAA-C02)の公開時期
- 以下の様に、ベータ期間が設定されており、2020年3月以前に2020年3月版(SAA-C02)を受験できます。
- 受験者のメリットとしては、50%の受験料割引が有るとのことです。AWS側としては、新試験の統計データを取得することが目的と思われます。試験問題の点数配分の微調整を行う為の情報収集かと推測します。
- 受験者のデメリットは、新版ですと、対策の情報が少なくなりがちということでしょう。
- しかしながら、版が公開される毎に問題文（日本語）が洗練され分かりやすくなっていると聞いています。

~~また、大幅な改変とも思えないので、15,000円(税抜)の受験料が、7,500円(税抜)になるのであれば個人的にはベータ版で受けるのも手かと思います。~~

ベータ期間は、2019/11/29までの予定の模様。ベータ版での受験は終了の様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235774/4fd9d936-7062-6169-3ac6-6af20a0a74dc.png)

#試験結果
- 788点で合格でした。
- 受験者に知らされるのは、点数のみです。分野毎の点数の明細は知らされません。
- また、試験問題を口外することも許されません。

#勉強期間
- 勉強期間は、約70日間でした。
- しかしながら、今回本格的に勉強する以前から、1年間ほどEC2、ECS、EKS、Fargate等は触っていました。

#合格するために行ったこと
1. AWS案件にてサービスを実際に構築する
1. AWS パートナー向けのセミナーに参加する
1. [AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)の有料会員登録して問題をひたすら解いた
1. [Udemyの試験問題](https://www.udemy.com/course/aws-31955/)を解いた
1. [Udemyの試験講座](https://www.udemy.com/course/aws-associate/) を受講
1. AWSのBlack Beltによる理解度アップ

- この中で役に立った順番は以下です。

　　1 > 3 > 2 > 6 > 4 > 5

- まず、AWSのサービスを実際に構築することで、問題文に出てくるサービス、用語の理解度が高まりました。
- そして、勉強期間の早い段階から、問題を解き始めていたので、理解できずにつまづく用語が出てきました。
- 理解できない用語は、AWSのコンソール画面で実際に確認したり、ネットやセミナーで理解を深めていきました。
- 受験の1週間くらい前から、ちょっと不安になったので、上記の4と5を行いました。Udemyはご存じの方が多いと思いますが、セール期間で受講料が安くなっているときが有りますので、大人買いして、試験問題と試験講座を購入してチャレンジしました。
- が、Udemyの試験講座は行わなくても良かったかなと思っています。

#最後にアドバイス
- AWSコンソール画面を開いて、試験問題に出てくるサービスは一通り触りましょう。
- 問題を勉強期間の早いうちから、ひたすら解いていきましょう。分からない用語が出て来たら、控えておいて、ひたすら解き続けて、分からない用語を洗い出しておきましょう。
- 試験範囲を包括するようなセミナーに参加したり、Udemyの試験講座を受講して、試験範囲を一通り抑えておきましょう。
- 一通り、試験範囲を押さえたら、Udemyの試験問題を解き始めて、試験問題慣れしておきましょう。
- Black Beltの資料で、自分が弱いと思われる分野のサービスについて目を通しておきましょう。
- 受験会場、必要な書類（運転免許証、クレジットカードなど）について内容を押さえておきましょう。受験日ぎりぎりになって準備することがないようにお気を付けてください。

上記、アドバイスについて異論も有るかと思います。「自分はこうして良かった。」という私見です。受験を目指す方の参考になれば幸いです。
MP3のタグ情報をJSON形式で一括出力する

# はじめに

個人開発のネタとして所有しているMP3ファイルのタグ情報を抽出したくなったので調べてみました🪕

# 方法

`ffmpeg`にくっついてくる`ffprobe`というコマンドを使うため、[Homebrew](https://brew.sh/index_ja)を使って入れます

```terminal
$ brew install ffmpeg
```

以下ようなシェルスクリプトを任意のディレクトリに作成して...

```tag2json.bash
#!/bin/bash -eu

input_dir="$(cd "$1"; pwd)"
output_dir="$(cd "$2"; pwd)"

(
  cd "$input_dir"
  find . -name "*.mp3" |
  sort |
  while read target_path; do
    echo "exporing: $target_path"
    output_path="$(dirname "$output_dir/$target_path")/$(basename "$target_path" .mp3).json"

    mkdir -p "$(dirname "$output_path")"
    ffprobe -v error -show_entries format -of json "$target_path" > "$output_path"
  done
)
```

実行します

```console:ターミナル
# mp3がこんな感じであったとして
$ ll ~/data/music/japanese/さよならポニーテール/ROM/ | head -5
total 545624
-rw-r--r--@ 1 tkhs  staff   6.8M 11 14 23:34 1-01 新世界交響楽.mp3
-rw-r--r--@ 1 tkhs  staff   6.9M 11 14 23:34 1-02 ナタリー.mp3
-rw-r--r--@ 1 tkhs  staff   7.1M 11 14 23:34 1-03 光る街へ.mp3
-rw-r--r--@ 1 tkhs  staff   7.2M 11 14 23:34 1-04 遠い日の花火.mp3

$ mkdir out
$ ./tag2json.bash ~/data/music/japanese/さよならポニーテール/ROM/ out/
exporing: ./1-01 新世界交響楽.mp3
exporing: ./1-02 ナタリー.mp3
exporing: ./1-03 光る街へ.mp3
exporing: ./1-04 遠い日の花火.mp3
（略）

# こんな感じでできあがる
$ ll out/ | head -5
total 288
-rw-r--r--  1 tkhs  staff   1.3K  1  5 22:59 1-01 新世界交響楽.json
-rw-r--r--  1 tkhs  staff   1.3K  1  5 22:59 1-02 ナタリー.json
-rw-r--r--  1 tkhs  staff   1.3K  1  5 22:59 1-03 光る街へ.json
-rw-r--r--  1 tkhs  staff   1.3K  1  5 22:59 1-04 遠い日の花火.json
```

MP3タグだけでなく、ファイルサイズや曲の長さなども取得できます🤗

```json:出力サンプル
{
  "format": {
    "filename": "./1-01 新世界交響楽.mp3",
    "nb_streams": 2,
    "nb_programs": 0,
    "format_name": "mp3",
    "format_long_name": "MP2/3 (MPEG audio layer 2/3)",
    "start_time": "0.000000",
    "duration": "282.775544",
    "size": "7086331",
    "bit_rate": "200479",
    "probe_score": 51,
    "tags": {
      "title": "新世界交響楽",
      "artist": "さよならポニーテール",
      "TCM": "ふっくん",
      "album": "ROM",
      "track": "1/12",
      "TPA": "1/3",
      "TS2": "サヨナラポニーテール",
      "genre": "Pop",
      "iTunPGAP": "0",
      "encoded_by": "ミュージック 12.10.1.37",
      "iTunNORM": " 000023F4 ...",
      "iTunSMPB": " 00000000 00000210 ...",
      "iTunes_CDDB_1": "AE0DCD0C+265143+12...",
      "iTunes_CDDB_TrackNumber": "1",
      "album_artist": "さよならポニーテール",
      "TSP": "サヨナラポニーテール",
      "date": "2019"
    }
  }
}
```

# 参考

https://qiita.com/PianoScoreJP/items/dcb875757a703c8f3322
https://nico-lab.net/how_to_use_ffprobe/
Visual Studio CodeでSalesforceの開発環境を構築する（xysfdx）


xysfdx を使ってVSCodeでSalesforceの開発してみよう。。。

xysfdxとは？salesforce sfdx開発用のVSCode拡張機能です。

# xysfdx

[xysfdx](https://github.com/exiahuang/xysfdx) is a Rapid development tool for Salesforce SFDX Development. Metadata diff with server, retrieve standard sobject.



## Features

-   サイズは100k以下（現時点0.0.2バージョン）.
-   oauth2認証.　
-   各メタデータ選択可能.
-   認証済みの組織とメタデータ比較可能.
-   標準オブジェクトのリトリーブ.
-   `.apex`ファイルを自動実行（ファイル保存したタイミング）.
-   Salesforceにログイン.
-   余計な設定不要

# Install

VSCodeで`xysfdx`を検索してみってください。

![image-20200105225026551](https://raw.githubusercontent.com/exiahuang/mystatic/master/images/image-20200105225026551.png)

## Shortkey

shortkey: `ctrl+shift+j`

## Requirements

[Salesforce Cli](https://developer.salesforce.com/ja/tools/sfdxcli)

## Usage

## Create a project

プロジェクトを作成

`force:project:create`

![xycode-sfdx-init-project](https://raw.githubusercontent.com/exiahuang/xycode-doc/gh-pages/images/xycode-sfdx-init-project.gif)

## Diff metadata

メタデータの比較

`force:source:diff:metadata`

You can diff with any sfdc organization.

### diff source

ソースの比較

![xycode-sfdx-diff-meta](https://raw.githubusercontent.com/exiahuang/xycode-doc/gh-pages/images/xycode-sfdx-diff-meta.gif)


### diff profile

プロファイルの比較

![xycode-sfdx-diff-profile-meta](https://raw.githubusercontent.com/exiahuang/xycode-doc/gh-pages/images/xycode-sfdx-diff-profile-meta.gif)


### auto run apex anonymous code

`.apex`ファイルを自動実行（ファイル保存したタイミング）.

![xycode-sfdx-run-apex-anonymous](https://raw.githubusercontent.com/exiahuang/xycode-doc/gh-pages/images/xycode-sfdx-run-apex-anonymous.gif)


**Enjoy it!**



# 号外

もっと自由に開発したいなら、

- コマンドをカスタマイズ
- apex codeを自動的にフォマード
- ログをgrepしたい
- ソースをいろいろな組織にdeployしたい

VSCodeで`xycode`を検索してみってください。

xycode document：　https://exiahuang.github.io/xycode-doc/

![xycode-install](https://raw.githubusercontent.com/exiahuang/mystatic/master/images/xycode-install.png)
EC2インスタンスを作成時にうまくいかなかったまとめ

```python:local
$sudo brew install python
```
管理者権限がないと怒られた

```python:local
$sudo easy_install pip

```
一つ目で管理者権限がないと怒られたのでrootを外したら
管理者権限で実行してくださいと怒られた

```python:local
$sudo pip install awscli
```
以下で解決

```python:local
$ sudo pip install awscli --upgrade --ignore-installed six
```
Associate Cloud Engineerの試験に合格したので勉強時間とか勉強方法とかの共有です

## はじめに
自分が勤めてる会社で書いてる人がいないっぽい？のでいろいろ書くことにしました。（資格用のSlackチャンネルはあるが、難しかったー・落ちたー・受かったー、レベルの事しか書いていない。試験の詳しい内容とかは口外してはいけないので仕方ないんですけども）

合格自体は2019年7月にしています。

Organizationに入ってないですが分かる人には分かるので問題ないです。

## 自己紹介
どれぐらい資格試験慣れしているか、どのぐらいの経歴の人が受験したのか分かるように簡単に経歴・持っているIT系以外も含む資格を書いておきます。（資格は簡単な部類だと思います。自分の周りで落ちてる人見たことない）

- 資格
 - ITパスポート（10年以上前に取得したのでほとんど覚えていない）
 - 乙種第４類危険物取扱者（10年以上前に取得したのでほとんど覚えていない）
 - 第四級アマチュア無線技士（10年以上前に取得したのでほとんど覚えていない）
 - 第二級陸上特殊無線技士（10年以上前に取得したのでほとんど覚えていない）
 - LPIC-1
- 経歴
 - 高校生の頃に趣味でPICのプログラムをアセンブラで記述していた
 - 高校生の頃にC言語をちょこっと触る
 - 高校卒業後は数年間フリーター
 - フリーター時代にUbuntuマシンを使い始める
 - いつの間にかIT業界に入っていた
 - 資格取得時点では業界3年目
 - クラウド系のサービスは触ったことがなかった

## 勉強期間・勉強方法
アサイン先のプロジェクトが決まるまで結構時間があったのでその間に取得しました。（2019年7月入社で23日に受験しました。）土日にも勉強をしたのですが、土日は資格の勉強と言うよりほとんどMacについて勉強していた感じです。（初Macだったのでショートカットを指に慣らしたりしてた。）また、椅子が合わなかったのか腰を痛めた為、どこかのタイミングで4日間ぐらい横になったまま脳内で復習していました。

勉強方法は下の本２冊を読んだ後、気になったサービスのチュートリアルを実施、Courseraの１週間の無料期間を堪能、試験ガイドを確認、模擬試験を受けてから本番に挑みました。

【本】

- [プログラマのためのGoogle Cloud Platform入門](https://www.amazon.co.jp/dp/4798137146)
- [Google Cloud Platform エンタープライズ設計ガイド](https://www.amazon.co.jp/dp/4822257908)

【チュートリアル】
[App Engine](https://cloud.google.com/appengine/docs/standard/go/quickstart)

【Coursera】
[Preparing for the Google Cloud Associate Cloud Engineer Exam](https://ja.coursera.org/learn/preparing-cloud-associate-cloud-engineer-exam)

【試験ガイド】
[認定試験ガイド](https://cloud.google.com/certification/guides/cloud-engineer)

【模擬試験】
[Cloud Engineer 模擬試験](https://cloud.google.com/certification/practice-exam/cloud-engineer)

## おわりに
ほぼ一月を勉強時間に費やせたのはとてもデカかったです。また、試験ガイドを読んでわからないところをSlackで質問したところ、速攻で回答が来たのもとてもモチベの維持に役立ちました。（ありがとうございます！）

当たり前なのですが、**試験ガイド**に記載してある全てが実際にできるようになってから受験しましょうね。

「Linuxの基礎知識ぐらい知ってるよね？」「ネットワークの基礎知識ぐらい知ってるよね？」「サーバの基礎知識ぐらい知ってるよね？」「K8sの基礎知識ぐらい知ってるよね？」という前提でお話は進んでいくので、これらが全くわからない人はちょっとお勉強大変かも？
source コマンドでシェルの設定を反映する

`source`コマンドはシェルの設定を、現在のシェルに反映する。
例えば、`.bashrc`や`.zshrc`編集して、すぐにその変更内容を反映させたい時などに`source`コマンドを実行する。

## 例


```sh
# .bashrc の内容を反映する
source ~/.bashrc
```


```sh
# .zshrc の内容を反映する
source ~/.zshrc
```
データベース考え方（初心者）

rake db:create  ：データベースの作成　Excelで言うと新規ファイル作成
rails gerate model "モデル名"　：モデルの作成　Excelで言うと新規sheet作成
rails db:migrate :migrationファイル内の情報を基にテーブルを作成　Excelで表にまとめる事（例）複数参加のリーグ戦



MySQL用のデータベース設定ファイル(database.yml)
https://www.javadrive.jp/rails/model/index2.html
Ruby on RailsでMySQLを使用する際に必要な作業手順
https://www.virment.com/rails-setup-mysql/
git-secretsで定義した検出パターンを取り除く

# git-secretsとは

[git-secrets](https://github.com/awslabs/git-secrets)はGitリポジトリにコミットするときに、秘密情報を公開しないようにするOSSです。git-secretsは事前に公開しない秘密情報のパターンを定義し、その情報をgitのpre-commitの機能を用いてコミットしないようにしています。

インストールや使い方は以下の記事が詳しいのでそちらをどうぞ
[クラウド破産しないように git-secrets を使う](https://qiita.com/pottava/items/4c602c97aacf10c058f1)

検出パターンの定義は正規表現を用いて行いますが、設定をミスした場合どのように削除するのか公式に書いてなかったので備忘録として残します。(コミットミスのエラーメッセージにはある)

# 検出パターンの削除方法

git-secretsで定義した検出パターンは`.git/config`もしくは`~/.gitconfig`に書き込まれます。
そのためその行を削除すれば消えます。

```sh:
$ git secrets --add 'passwd\s*=\s*".+"'
$ git secrets --add --global 'passwd\s*=\s*".+"'
$ cat .git/config 
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[secrets]
        patterns = passwd\\s*=\\s*\".+\"
root@kali:~/Documents/git-secrets-test# 
$ cat ~/.gitconfig 
[user]
        email = ********
        name = ******
[secrets]
        patterns = passwd\\s*=\\s*\".+\"
```


## configから削除したらコミットできるかの確認

passwd.txtファイルを作成し、コミットして失敗するのを確認

```sh:
$ echo 'passwd="P@ssw0rd"' > passwd.txt
$ git add passwd.txt
$ git commit -m "test commit"
passwd.txt:1:passwd="P@ssw0rd"

[ERROR] Matched one or more prohibited patterns

Possible mitigations:
- Mark false positives as allowed using: git config --add secrets.allowed ...
- Mark false positives as allowed by adding regular expressions to .gitallowed at repository's root directory
- List your configured patterns: git config --get-all secrets.patterns
- List your configured allowed patterns: git config --get-all secrets.allowed
- List your configured allowed patterns in .gitallowed at repository's root directory
- Use --no-verify if this is a one-time false positive
```

.git/configや~/.gitconfigから削除して消えるのを確認
以下はすでにファイル編集済み

```sh
$ cat .git/config 
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[secrets]
        
$ cat ~/.gitconfig 
[user]
        email = *****
        name = *****
[secrets]

$ git commit -m "test commit" # git addはすでにしているのでコミットだけ
[master 16e54f1] test commit
 1 file changed, 1 insertion(+), 1 deletion(-)
```

configからパターンを消したらコミットできることを確認

無心でawsの設定を使うだけであれば問題ないと思うが、自分で設定したパターンを使う人の参考になれば
CloudFormation 基本　リソースのみ指定の場合


https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html

Resources（リソース）
　論理ID（なんて名前にする？）
　　リソースタイプ（何を作る？）
　　プロパティ（設定リスト）
　　　プロパティ（設定①）: xxxxxx
　　　　-埋め込みプロパティ（設定）
　　　プロパティ（設定②）: xxxxxx
　　　　-埋め込みプロパティ（設定）
　　　プロパティ（設定③）: xxxxxx
　　　　-埋め込みプロパティ（設定）
　　　　　　　

```
AWSTemplateFormatVersion: '2010-09-09' #CloudFormationテンプレートの指定（１つしかない）
Resources:　#リソース指定
  FirstVPC:　#名前を指定する（任意）あとで参照する機会あり
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16　
      tags:
        Key: Name
        Value: 任意で名前を指定
```


※インデントを気をつけないとエラーをはく
AndroidアプリでsqliteデータをFirebaseのstorageに保存する方法

#はじめに
データテニスというテニスのスコアを記録するAndroidアプリを公開しています。
![app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45007/b9d6dfd6-0503-1d74-1a2c-4944df5f39fb.png)
利用者から下記のような要望をいただいており、対応方法を検討していました。
「機種変更しても記録したデータを引き継げるようにしてほしい」
「スマホで記録したデータをタブレットでも確認できるようにしたい」

FirebaseのCloud Storageはアプリのデータをクラウドに保存することができる、というのを知り、本アプリに実装してみました。

FirebaseのStorageは5GBまで無料で利用することができます。
https://firebase.google.com/pricing?hl=ja

#sqliteデータをjsonオブジェクトに変換
Androidアプリのデータは通常、sqliteデータベースとして保存します。
そして、Firebase Storageの保存形式はjsonファイルとなっています。

なので、sqliteデータをjsonファイルに変換しFirebaseのstorageに保存するようにします。

まずはsqliteデータのjsonファイルへの変換について。

"TEST_TABLE"という名前のテーブルで格納されたsqlデータベース逐次jsonオブジェクトに格納していきます。下記コード例ですと、Key1のキーの下にkey1-1、key1-2という名前のキーでデータを格納しています。

```.java
db = mDataBaseHelper.getReadableDatabase();
Cursor cursor = null;
try {
    cursor = db.query("TEST_TABLE", null, null, null, null, null, null);
    JSONObject jsonObject = new JSONObject();
    JSONArray jsonArray = new JSONArray();
    if (cursor.getCount() > 0) {
    boolean isEof = cursor.moveToFirst();
    while (isEof) {
        jsonOneData = new JSONObject();
        jsonOneData.put("KEY1-1", cursor.getInt(0));
        jsonOneData.put("KEY1-2", cursor.getString(1));
        jsonArray.put(jsonOneData);
        isEof = cursor.moveToNext();
    }
    jsonObject.put("Key1", jsonArray);
    省略

```

#jsonファイルをFirebase Storageに保存
jsonオブジェクトをjsonファイルとしてFirebase Storageに保存します。
上のコードで省略したtry文の中に下記コードを追記します。
ファイル名や、Firebaseのurlの箇所を書き換えてください。

```.java
File file = File.createTempFile("buckup", "json");//保存するjsonファイルの名前
FileWriter filewriter;
filewriter = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(filewriter);
PrintWriter pw = new PrintWriter(bw);
pw.write(jsonObject.toString());
pw.close();

storage = FirebaseStorage.getInstance();
StorageReference storageRef = storage.getReferenceFromUrl("firebaseのurl");
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if(user!=null) {
    String uid = user.getUid();
    storageRef.child("users").child(uid).child(fileName).putFile(Uri.fromFile(file));
```

これで、sqliteデータをjsonファイルとして保存できます。

#最後に
データテニスアプリはこちらで公開してるので、興味ある方はぜひぜひダウンロードしてご利用ください。
<a href="https://play.google.com/store/apps/details?id=com.datatennisnet.datatennis&amp;hl=ja&amp;utm_source=global_co&amp;utm_medium=prtnr&amp;utm_content=Mar2515&amp;utm_campaign=PartBadge&amp;pcampaignid=MKT-AC-global-none-all-co-pr-py-PartBadges-Oct1515-1"><img src="https://play.google.com/intl/en_us/badges/images/apps/ja-play-badge-border.png" alt="Get it on Google Play" width="185" height="60" /></a>
Texのコンパイル自動化ついでにページ数を記録して論文を書くモチベーションをあげる

# はじめに
MacBookでLaTeXを使って修論を書いてます．
参考文献管理にbibtexを使っているのですが，3回コンパイルが必要で，地味に面倒です．
shellでまとめて一発で実行できるようにしました．

せっかくなんで，ついでに進捗具合も記録できるようにしました．
Pdfファイルのページ数のカウントに[PDFtk](https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)を使いました．

以下よりインストールできます．
https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/

# まとめてやりたいこと
>
1. $\TeX$ファイルを1回コンパイルします。
2. 以下のコマンドを実行し、データベース中の参考文献を反映させます。
  * 欧文の場合  
`bibtex {TeXファイル名}`
  * 和文の場合  
`pbibtex {TeXファイル名}`
3. $\TeX$ファイルを3回コンパイルします。

[[BiBTeXとは](https://qiita.com/SUZUKI_Masaya/items/14f9727845e020f8e7e9)より引用]

さらに，

-  *Pdfを生成し，プレビューを使って表示*
-  *日時と，ページ数をテキストファイルとして記録*


# コード 
```shell
#!/bin/bash
platex thesis.tex 

pbibtex thesis

for i in {1..3}
do
	platex thesis.tex 
done

dvipdfmx thesis

open -a Preview.app thesis.pdf

pages=$(pdftk thesis.pdf dump_data|grep NumberOfPages| awk '{print $2}')
today=$(date)

echo $today $pages>> record.txt
```

# 最後に
論文で大事なのはページ数だけではないと思いますが，
進捗が視覚化され，モチベーションアップにつながれば幸いです．

# 参考
[BiBTeXとは](https://qiita.com/SUZUKI_Masaya/items/14f9727845e020f8e7e9)
[PDF Labs](https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)