OmniAICreator/Qiita-1.07M huggingface dataset:
【Kotlin】リフレクションでコンストラクタの引数名を取得する

# TL;DR
- `Kotlin`のリフレクションで取れる`KClass`からは、コンストラクタの引数名が元の名前で取れる
- `Java`のリフレクションで取れる`Class`からは、コンストラクタの引数名が「`arg0`, `arg1`, `arg2`...」としか取れない
- 元が`Java`のコードから`KClass`を取得しても、コンストラクタの引数名は「`arg0`, `arg1`, `arg2`...」となり、元の引数名は取れない

# やること
以下のクラスから、コンストラクタの引数名を取り出します。

```kotlin
data class Data(val sampleInt: Int, val sampleString: String)
```

# やり方
以下2行でできます。

```kotlin
val clazz: KClass<Data> = Data::class
val parameterNames: List<String> = clazz.constructors.first().parameters.map { it.name }

println(parameterNames) // -> [sampleInt, sampleString]
```

# 補足
`Java`のリフレクションを絡めて補足します（`Java8`でやってます、これ以降のバージョンだとリフレクション周りに変更が入ってるっぽいんですが自分は追えてません）。

## Javaのリフレクションでやるとどうなるか
以下のようになります。

```kotlin
val clazz: Class<Data> = Data::class.java
val parameterNames: List<String> = clazz.constructors.first().parameters.map { it.name }

println(parameterNames) // -> [arg0, arg1]
```

## Javaのクラスに対してやるとどうなるか
以下のような`Java`製クラスに対してやります。

```java
@Getter // lombokで生成する想定
public class JavaData {
    private final Integer sampleInt;
    private final String sampleStr;

    public JavaData(Integer sampleInt, String sampleStr) {
        this.sampleInt = sampleInt;
        this.sampleStr = sampleStr;
    }
}
```

以下の通り、引数名は取れません。

```kotlin
val clazz: KClass<JavaData> = JavaData::class
val parameterNames: List<String> = clazz.constructors.first().parameters.map { it.name }

println(parameterNames) // -> [arg0, arg1]
```
Arduinoで得たセンサの出力をCSVに吐き出す

#はじめに
備忘録．Arduino IDEでセンサの出力を ツール/シリアルモニタorシリアルプロッタから見ることはできるが，データとして取得したい場合のメモ．

#環境
OS Windows 10
Aruduino MEGA 2560
Arduino IDE (ver.1.8.9)
visual studio 2019

#やり方（備忘録）
あらかじめブレッドボード等でArduinoボードに回路を作成しておく．
Arduino IDEにて以下のソースコードを実行．

```ruby:Arduino_IDE

int Signal1;            
unsigned long t;                 

// The SetUp Function:
void setup() {
   Serial.begin(250000);         // Set's up Serial Communication at certain speed.

}
// The Main Loop Function
void loop() {

  Signal1 = analogRead(0); 

   t = millis();
//  Serial.print(t);
//  Serial.print(", ");
   Serial.println(Signal1); 

}
```

この際，Arduinoボードに刺したセンサのANALOG IN ピン番号と対応する数字を``analogRead()``の関数内に入力．
また，サンプリング周波数は``Serial.begin``で調整．
他にここでIDE上部``ツール/シリアルポート``から通信しているポート番号を確認しておく．

次に，VSで新規プロジェクト(C# コンソールアプリ.NET Framework)を作成．

以下のソースコードを実行．

```ruby:Program.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            SerialPort mySP = new SerialPort("COM*");
            var sw = new System.IO.StreamWriter("***.csv", false, System.Text.Encoding.GetEncoding("shift_jis"));
            mySP.BaudRate = 250000;
            mySP.Open();
            while (true)
            {
                string myData = mySP.ReadLine();
                sw.WriteLine(myData); 
                Console.WriteLine(myData);

            }
        }
    }
}

```

注意すべきは，先ほど確認してシリアルポート番号を``new SerialPort("COM*")``の*に代入することと，``BaudRate``にArduino IDEで設定したサンプリング周波数と同じ値を入力すること．
時間も同様に出力したい場合はArduino IDE上で設定が可能．今回のソースコードではコメントアウトを外すことでミリ秒の出力ができる．
仮想環境を構築できるvagrantの概要ついて軽く調べてみた

#まず、仮想環境とは
- 本番と全く同じ環境で開発できる
- 最初の開発環境でつまづかずに済む
- 自分のPC上に仮想的に作り上げた本番・テスト環境

###仮想環境のメリット
- プロのエンジニアが使っている
- 本番環境を意識しながら開発できる
- 完成して公開する時に「あれ、なんで動かないの？」ってならない
- 複数人で開発する時に環境の違いを気にしなくていい
- 教科書や参考書に沿って開発を進めることができる

#vagrantとは

- 仮想環境の設定や仮想マシンの作成方法などを助けてくれる
- 仮想環境を簡単に構築・管理し、配布することができる
- vagrant自体には仮想化に関する機能は搭載されていないため、別途VirtualBoxのような仮想化ソフトも必要になる
- VirtualBoxがあれなどこでも仮想環境は作れるけど、vagrantがあれば、チームのコンディションを管理・把握した上で、同じ環境で開発できる

###vagrantのメリット
- プロのエンジニアが使っている
- 数行のコマンドで仮想環境の管理・配布・調整ができる
- チームで同一の環境を簡単に構築できる

#Virtual Box
- 使用しているPCに仮想環境を構築して、他のOSをインストールすることができる仮想化ソフト
- 仮想環境の状態を丸ごと保存できる（スナップショット）
- ホストOSとゲストOSで同じファイルを共有することができる（共有フォルダ）
- ゲストOSでコピーした内容をホストOSでペーストもできる　逆も然り（クリップボードの共有）
質問です/LambdaとTwitterApiを使ってBotを作ったのものの、30分毎のイベント発火がうまく作動しない

初心者です。

LambdaとTwitterApiを使って、Twitterにステイーブジョブスの名言を、３０分毎にツイートする自動BOTと作成しました。
![001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29856/5de884a5-e6ff-648b-fcf3-3c15dfe830e6.jpeg)

動作して、ちゃんとツイートもしたのですが、時間の間隔が常に３０分毎ではなく、１時間間隔の時や、時には２時間おきの場合もあります。
![002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29856/bacff4d1-6dcd-d27b-f44f-cc0544141102.jpeg)

Lamda側では、３０分毎にイベントが発火しているようなのですが、何が原因かご教示いただきたいです。
![003.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29856/06f18678-3e76-2f47-c6c4-fb26ec1b18cd.jpeg)
Craft CMS の入力タイプのタブでわけたフィールドを縦並びにするプラグイン

<img width="985" alt="Screen Shot 2019-11-04 at 12.18.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8890/beac5a78-949d-2f7c-71b0-4688b35436a4.png">


入力タイプのタブで分けたフィールドごとのを縦に並べてくれるプラグイン。

> Vertical Tabs
> https://plugins.craftcms.com/vertical-tabs

使ってみようかと思ったけれどもあまりタブで分けて使っているところがなかった。

縦が良いのか横が良いのか、1カラムがよいのか2カラムが良いのか、結構好みが別れるような気がするけどどうなんだろうな。
デプロイしたRailsにアクセスできない This site can’t be reached

## 概要
突貫でRailsアプリを作らないといけない状況で、
自身が開発した既存のRailsアプリを丸コピしてからそれをベースにアプリを構築。

そしてAWSのOpsWorksでいつもどおりデプロイ。
正常にデプロイできいざ確認と思ったらアクセスできない。

数十秒後に「This site can’t be reached」(Chromeのメッセージ)が表示される。

原因がわからず無駄に時間を浪費したので、備忘録として解決策を記載する。


## 原因
原因は `config.force_ssl = true` にしていたことでした。
確認段階だったので、ドメインやSSL証明書の設定などはなく、
起動したインスタンスのIPに直接アクセスする形をとっていた。

なので、RailsがSSL強制しようにもできず、
リダイレクトを繰り返していたという状況でした。

## 解決策
`config.force_ssl = false` にすることで解決できました。
TypeScript: コンストラクタを受け取り、コンストラクタを返す関数

TypeScriptでコンストラクタを受け取り、コンストラクタを返すジェネリックな関数を紹介する。


```typescript
const constructorOf = <T extends new (...args: any[]) => U, U>(constructor: T): T => {
  return constructor
}
```

## 使用例

```typescript
class Point {
    constructor(x: number, y: number) {}
}

const Point2 = constructorOf(Point) // ここ

const point = new Point2(1, 2)
```


## 動作確認



```typescript
class Nullary {
  constructor() {
  }
}

class Unary {
  constructor(public p1: 1) {
  }
}

class Binary {
  constructor(public p1: 1, public p2: 2) {
  }
}

class Ternary {
  constructor(public p1: 1, public p2: 2, public p3: 3) {
  }
}

const nullary = new (constructorOf(Nullary))
const unary = new (constructorOf(Unary))(1)
const binary = new (constructorOf(Binary))(1, 2)
const ternary = new (constructorOf(Ternary))(1, 2, 3)

const assert = (predicate: boolean): void => {
  if (!predicate) throw new Error()
}

const assertPropSize = (size: number, obj: any): void => assert(Object.keys(obj).length === size)

assertPropSize(0, nullary)
assertPropSize(1, unary)
assertPropSize(2, binary)
assertPropSize(3, ternary)
assert(unary.p1 === 1)
assert(binary.p1 === 1 && binary.p2 === 2)
assert(ternary.p1 === 1 && ternary.p2 === 2 && ternary.p3 === 3)
```
C# 自分用メモ：アクセス修飾子

注意：自分用の勉強メモです。分かりやすさを追求しておりません。

#C# アクセス修飾子について
前回解読したC#テンプレートについて

```
public class FirstScript : MonoBehaviour
```

に出てくるpublicはアクセス修飾子と呼ばれるようで、様々な種類があるとのこと。
今回はこの”アクセス修飾子”についてまとめてみました。

##アクセス修飾子まとめ
###アクセス修飾子をざっくり
コードが200、300から1000行以上の長いプログラムになると、別のプログラムを呼び出すことが多くなります。実際に何かつくろうとしたら、一つのプログラムだけで完結することは滅多にありません。

そのため、他のプログラムにアクセスする必要がありますが、このアクセスに制限などをコントロールするのが『アクセス修飾子』になります。

###C#における4つのアクセス修飾子
代表的な4つのアクセス修飾子についてまとめました。
* public
* protected
* internal
* private
これら4つのアクセス修飾子に加えて、さらに2つの組み合わせで、計6パターンのアクセシビリティを設定できるようです。

####6パターンのアクセシビリティ
|アクセシビリティ|説明|
|:---:|:---|
|public|どこからでもアクセス可能|
|protected|クラスの内部と、派生クラスの内部からのみアクセス可能|
|internal|同一プロジェクト内のクラス内からのみアクセス可能|
|protected internal|同一プロジェクト内のクラス内部、または、派生クラスの内部からのみアクセス可能|
|private protected|同一プロジェクト内のクラス内部、かつ、派生クラスの内部からのみアクセス可能|
|private|クラス内部からのみアクセス可能|

![実装の隠蔽 - C# によるプログラミング入門 _ ++C++; __ 未確認飛行 C - Google Chrome 2019-11-04 11.13.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507634/fe92be7f-b4fe-04d5-ed9d-27790ca22671.png)

引用URL:[https://ufcpp.net/study/csharp/oo_conceal.html]

以上、アクセス修飾子についてまとめてみましたが…

##より理解するために
正直、「こんな種類があるんだなー」ていう理解しかできませんでした…。
恐らく『プログラミングの依存関係』について分かれば、スッと頭に入るのでしょうが、このあたりは今後勉強していこうと思います。
flutterでボタンやラジオボタンが有効にならない

#flutterでボタンやチェックボックスが有効にならない

以下のようにカラーを青に指定していても灰色になり無効、非活性になることがある
ラジオボタンの場合、押しても反応がない

<img width="297" alt="スクリーンショット 2019-11-04 11.31.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107187/d9492d0c-94e3-596d-1472-3fb4824dde86.png">

```dart
        RaisedButton(
          onPressed: null, // 押した時の処理
          color: Colors.blue,
          child: const Text(
            '更新',
            style: TextStyle(
                color:Colors.white,
                fontSize: 20.0
            ),),
        )
```

##解決方法
ボタンなら onPressed
ラジオボタンやドロップダウンなら onChangedを実装する 

この値がnullになっていたり、存在しないとこの状態になる
M5CameraでLチカする

※下記の内容は、MacOS Catalina で確認しています。

- Arduino IDEを起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/23b2b166-b5d6-e09e-1978-6e376dccf026.png)

- GPIOの14番にLEDがつながっているのでピンの初期設定をsetup()内に記述します。

```
void setup() {
  pinMode(GPIO_NUM_14, OUTPUT); //GPIO14番を出力モードに設定
}
```

- 500ミリ秒ごとに点滅するするようloop()内に記述します。

```
void loop() {
  digitalWrite(GPIO_NUM_14, LOW); //LED消灯
  delay(500); //500ミリ秒待つ
  digitalWrite(GPIO_NUM_14, HIGH); //LED点灯
  delay(500); //500ミリ秒待つ
}
```

- メニュー／ツールのボード：〜シリアルポート：までの部分を下記のように設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/78ddaa3c-30a0-e85b-92e0-797b7f52ae0f.png)

- 書き込みボタン（左から２つ目の矢印ボタン）で書き込み

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/2089223e-4e38-bbf1-4d21-a9665c690971.png)

成功すれば点滅が開始します。

![led.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/639134ad-8a80-70d2-78ef-240e6ca1ad0e.gif)
S3バケットの分け方の7つの指針


AWS Summit 2019のセッション「データレイク構築における成功の秘訣 ～マインドと進め方、設計ベストプラクティス～」において、データレイクを設計する際の指針の１つとして「S3バケットの分け方」が紹介されていて、データレイク構築に限らず汎用的な指針としてわかりやすかったので抜粋して一部を編集・補足してみました。
[セッション動画](https://youtu.be/YWsfSkCekSE?t=1506)では25:06から

資料や動画は[セッション資料・動画一覧 - AWS Summit 2019 | AWS](https://aws.amazon.com/jp/summits/tokyo-osaka-2019-report/)にあります。

![](https://i.gyazo.com/ee8c3d9a9004a640cd7d75957fd40ef2.png)

まず真っ先に考えるべきこととして「人が見て直感的にわかりやすい」ことがあげられています。これは当たり前ですね。

次に考えることはS3バケット（とアカウント）の機能仕様・制約の考慮です。具体的には以下の７つが挙げられていました。

これらの機能仕様や制約は、バケット単位（もしくはアカウント単位）での制御となる（表現を変えると下位のディレクトクトリレベルでは制御不可）ので、扱いが異なる場合（もしくは上限制約に達しそうな場合）は必然的に「わける」必要があります。

| # | 考慮事項 | 説明 | 設定の粒度 |
|:-:|:--|:--|:-:|
| 1 | バージョニング | オブジェクトを上書き、削除しても過去バージョンを保持する機能 | バケット |
| 2 | ライフサイクルポリシー | 指定した期間を過ぎるとオブジェクトをアーカイブしたり削除する機能 | バケット |
| 3 | オブジェクトロック | 指定した期間、バージョニングされたオブジェクトの削除を禁止する機能 | バケット |
| 4 | 1アカウント当たりのバケット数 |  デフォルト100 、ハードリミットは 1000  | アカウント |
| 5 | バケットポリシーサイズ | バケットポリシーサイズの上限は20KB  | バケット |
| 6 | コスト管理 | コスト配分タグはバケット単位で設定可能。コスト配分を区別したい単位でバケットを分ける。 | バケット |
| 7 | 監査証跡 | S3アクセスログはバケット単位で出力される。 | バケット |

# 補足説明

なお、「5.バケットポリシーサイズ」はこれはデータレイク特有といって良い考慮事項で、上記の記載だけだとちょっとわかりづらいと思うので補足します。

AWSでは、プロジェクトやシステムごとにアカウントを分離（さらに本番・開発・サンドボックス）することを推奨しています。それら各アカウントのS3バケット上にあるデータがデータレイクに蓄積するデータソースとなります。これらのデータソースをデータレイク用アカウントのS3バケットに集約する方法として「S3間で転送」することを推奨しています。（理由は１．性能 ２．コスト（同じリージョンならデータ転送料金かからない）３．便利（VPC間の通信設定不要））

この時に「（異なるアカウントの）データをS3間転送する」には、明示的に許可するポリシーを記載する必要があり、これがバケットポリシーとなります。
このバケットポリシーにアカウントIDを書き連ねると、以下のように記述が肥大化して、上限の20KBを越えてしまうので、これを避けるために「aws:PrincipalOrgID」で書きましょう。というプラクティスです。

**アカウントIDを書き連ねた例（資料の53ページ）**
![](https://i.gyazo.com/ee677a28d18720ce5cee029a52367262.png)

**PrincipalOrgIDで記載した例（資料の54ページ）**
![](https://i.gyazo.com/b136927e905202d25d3177e795fec2dd.png)
Homebrewでgitのバージョンを管理する(Mac)

# 概要
gitをインストールしようと思ったら、すでにX-codeをインストールした時に一緒に入っていたみたい。Homebrewでgitをインストールして、すでに入っていたgitを上書きする。

# 現在の状況
- gitのバージョン

```bash:terminal
$ git version
git version 2.20.1 (Apple Git-117)
```
`Apple Git-117`と書いてあるのが、どうやら勝手にインストールされたということらしい。

# Homebrewでgitをインストール

以下のコマンドを入力してgitをインストールする。

```bash:terminal
$ brew update
$ brew install git
```

gitのバージョンを確認してみる。

```bash:terminal
$ git version
git version 2.20.1 (Apple Git-117)
```

変わってない。どうもパスが通っていないようなのでパスを通してあげる。

# パスを通す
`~/.bash_profile`に今回インストールしたgitのパスを優先的に見に行くように設定を書き込む。

```bash:terminal
$ echo 'export PATH=/user/local/git/bin:$PATH' >> ~/.bash_profile
```

更新した`~/.bash_profile`を実行して、バージョンを確認する。

```bash:terminal
$ source ~/.bash_profile
$ git version
git version 2.23.0
```

ちゃんとパスが通っていることを確認して、終わり。
pythonのレスポンス指標ー時間操作編

# この記事では.
ひよっこは、データを加工するときにどれが一番早く処理できるかが想像できない。。:frowning2:
初心者プログラマあるあるのとりあえず動くコード書いて終わるのと違い、レスポンスだけを指標にすれば（コードの可読性は無視、コメントで回避する）正解を探れるだけ良いので今回は時系列の操作を簡単にまとめます。

# 検証方法
1年分の時系列データを準備して、datetimeをdateに変換する。（型は一時無視）
方法は以下の5通り（並びは私が早いと思う順）

1. pandasの標準dtオブジェクト経由
2. pandasのapply経由
3. 文字列にして固定長で取り出す方法
4. loop処理経由

pythonはインタプリタ言語でコンパイル言語より遅いからライブラリを経由しているのに、
わざわざloop処理を使うのは論外に遅いはず。
ライブラリを使っても型があるのを無視して固定長で取り出す方法も遅い、少なくとも型を守るものよりも遅いはず。
applyは汎用関数なので、元のdtオブジェクトを経由できる方法よりは遅い。という感じに考えています。:scales:

# 検証
詳細とまとめに分けます。
詳細には、コードなども記載します。

## 詳細

事前にデータを準備する。
以下で作成したデータフレームを測定前にコピーして処理時間を測る。

```python:１分感覚で１年分のデータを準備
import pandas as pd
ds = pd.date_range("2001-01-01 00:00:00","2001-12-31 23:59:59", freq="min")
df = pd.DataFrame({"datetime": ds})
# 525600件のデータフレーム作成
```

1.pandasの標準dtオブジェクト経由

```python
%%timeit
df_test["date_dt"] = df_test.datetime.dt.strftime("%Y-%m-%d")
# 2.18 s ± 55.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
```

2.pandasのapply経由

```python
%%timeit
df_test["date_apply"] = df_test.datetime.apply(lambda x: x.strftime("%Y-%m-%d"))
# 2.03 s ± 34.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
```

3.文字列にして固定長で取り出す方法(先頭１0文字を取得、YYYY-mm-dd)

```python
%%timeit
df_test["date_strcut"] = df_test.datetime.apply(lambda x: str(x)[:10])
# 1.28 s ± 50.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
```

4.loop処理経由(ループだけの時間を計測)

```python
%%time
for index,item in df_test.iterrows():
    pass
# CPU times: user 10.8 s, sys: 46.6 ms, total: 10.9 s
```

## まとめ

1. pandasの標準dtオブジェクト経由
2. pandasのapply経由
3. 文字列にして固定長で取り出す方法
4. loop処理経由

| 項目 | 実測値 | 予測順位 | 実測順位 |
|:---:|:---:|:---:|:---:|
| pandasの標準dtオブジェクト経由 | 2.18 s ± 55.4 ms | 1 | 3 |
| pandasのapply経由 | 2.03 s ± 34.7 ms | 2 | 2 |
| 文字列にして固定長で取り出す方法 | 1.28 s ± 50.2 ms | 3 | 1 |
| loop処理経由 | 10.9s(ここはループだけの時間) | 4 | 4 |

ループ処理はループするだけの時間なのに圧倒的に遅い。
意外なのが、正攻法な方法を利用する方が遅かったことです。
文字列操作で別けてしまったほうが早いという結論になりました。:confused:

#　注意
マシンスペックに依存する可能性はあります。１マシンでの計測しかしていません。:thinking:
Vagrant＋Rails6＋MySQL 開発環境構築

# はじめに
- なんか網羅したような題名にしましたが、以前書いた「Vagrant＋Rails6＋PostgreSQL12 開発環境構築 まとめ」のMySQL版です。
    - [「Vagrant＋Rails6＋PostgreSQL12 開発環境構築 まとめ」**2.9 PostgreSQLインストール**](https://qiita.com/KZ-taran/items/56c1d39dbbdd26df6faf#29-postgresqlインストール)の部分の差し替えなので、それ以外の部分はそちらを参考にしてください。



# MySQLインストール
## MySQLインストール

```sh
# MySQLのyumリポジトリから、最新のCentOS7用のリポジトリを追加
$ sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm

# MySQL Community Serverのインストール
$ sudo yum -y install mysql-community-server

# インストールできたか確認
$ mysqld --version
```



## 起動・自動起動設定

```sh
# vagrant起動時に自動で起動するように設定
$ sudo systemctl enable mysqld.service
# 自動起動が設定できているか確認
$ sudo systemctl list-unit-files -t service | grep mysqld
mysqld.service                                enabled

# MySQL起動
$ sudo systemctl start mysqld.service
```




## MySQL初期設定

```sh
# rootユーザーにパスワードを設定(今回はrootパスワードを設定)
$ /usr/bin/mysqladmin -u root password 'root'

# セキュリティー関連の初期設定(ここでパスワードを聞かれると'root'とする)
$ mysql_secure_installation
```

## 文字コード追記

`/etc/my.cnf`をエディタで開いてUTF-8の文字コードを追記する

```sh
vi /etc/my.conf
```

```conf:/etc/my.conf
# 一番下に次の２行を追加する
character_set_server=utf8
skip-character-set-client-handshake
```

## Railsで必要なパッケージをインストール

```sh
# RailsでMySQLを使用するためのパッケージをインストール
$ sudo yum install mysql-devel
```



# プロジェクト作成まで進んだらconfigファイルの編集
- [「Vagrant＋Rails6＋PostgreSQL12 開発環境構築 まとめ」**3.3 DB作成**](https://qiita.com/KZ-taran/items/56c1d39dbbdd26df6faf#33-db作成)まで進んだら、**DB作成前**に接続できるようにパスワードを追記する
- パスワードがデフォルトで空欄のため設定したパスワードを追記(今回は**root**)

```:プロジェクトディレクトリ
vi /config/database.yml
```

```conf:/conf/database.yml
# パスワードを追記
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
- password:
+ password: root
  socket: /var/lib/mysql/mysql.sock
```



# 接続する場合
```sh
# 接続
$ mysql -u root -p
```
AWS移行の全記録 

#■概要
以前、オンプレで動いていたWEBサービスをAWSへ移行したのでその内容です。
AWS環境は存在しなかったため、アカウント作成からはじめました。
コンサル会社と契約し、なるべく良い形で進めました。


##１１サービスを一気に移行しました。
※サイト規模として、PVは75000/1h。DBのデータ量は100GB。
各サービスが乗っているサーバーは絡み合っていたため１つ１つ移行することが難しく、一気に移行しました。

|変更項目|移行前      |       移行後|
|:-----------------|:-----------------|:------------------|
|環境	|オンプレミス	|<font color="Red">AWS</font>	|
|php	|php5.2					|<font color="Red">php5.3</font>		|
|DB	|mysql 5.1, PostgreSQL9.1.11					|<font color="Red">mysql 5.5, PostgreSQL9.5.18</font>		|
|APサーバー	|Apache 2.2					|Apache 2.2					|
|sessionサーバー	|tokyo tyrant		|<font color="Red">ElastiCahe(Redis)</font>	|
|CDNサーバー	|Akamai			|Akamai				|	
|webサーバー 	|オンプレ x 13				|ec2 x 10				|


サーバー代は150万円/月から、AWS移行後は60万/月まで下がりました。
![hiritu.PNG](https://qiita-image-store.s3.amazonaws.com/0/192134/768e629a-ab96-5e26-3209-62d033455a10.png)


#やったこと
・クラウドの選定。コンサル会社選定
・環境構築＜EC2、RDS、ElastiCache、S3、ELB、VPC・SG・NSネットワークまわり＞
・開発環境整備＜デプロイの自動化など、開発効率UP施策＞
・RDSデータ移行
・アプリ設置
・負荷テスト
・リリース
・運用監視


#◆クラウドの選定、コンサル会社選定
AWS、GCM、Azureの中から、コンサル会社複数社に対して見積もりを取り検討。
結果、AWS + クラスメソッドに選定。
Q, C, Dで比較をしましたが、他の企業に比べ全体的に優れていました。


#◆インフラ環境構築
EC2、RDS、ALB、NatGatewayなどなどを使う、普通の構成
今までバラバラだったネットワーク関連をルール化して管理
またソースにたどり着くまでにALB、Akamaiを経由することで、ソース側の改修が必要になります。

詳細はこちらの記事にまとめています： 
https://qiita.com/ryokwkm/items/cd885d8ef72176587466

##DNSをお名前.comから、Route53に移行
　route53のゾーンをあらかじめ作っておき、本番移行時にそちら切り替えました。



#◆開発環境整備
自動化できるものを以下のように自動化＆ルール化。

###デプロイを手動から自動へ
Jenkins + [deployer](https://deployer.org/)を使ってボタン１つでデプロイできるようにした。

###ソースの管理をGitLabからGitHubへ
GitHubでGitHub-Flowを採用して開発、Masterマージにはプルリク承認後でないとマージできない制限をかけた。
GitLabは当時の開発ベンダーが用意したものを使用していましたが、動作が重くなり通常使用に耐えなかった。


#◆データ移行
Postgresは、dump＆リストア
Mysqlは、レプリケーションでデータを移行
その他のファイルは rsyncコマンドで持っていき、その後aws s3 sync コマンドでS3へ移動させました。
rsyncは差分だけを持っていきますので、事前に一度実行しておくことで当日は短時間で移動できます。

詳細はこちらの記事にまとめています： 
https://qiita.com/ryokwkm/items/0230f547a666b2441d51

#◆アプリ設置
ここが一番苦労しました。
・今までサーバーごとにバラバラだったシステムのドキュメントルートを統一（ルール化）
・ソース内の環境依存部分の修正
・ロードバランサーが挟まったことによる修正
・DBの接続先をprivateドメインへ変更

詳細はこちらの記事にまとめています： 
https://qiita.com/ryokwkm/items/c6e35d28f8fec72ad3ce




#◆負荷テスト
[loadRoid](https://rocro.com/loadroid)というSaasツールを採用
Sonyが作ったという、手軽に負荷試験が行えるツールです。
現在はアルファ版で、なんと無料で使用できます。
負荷試験といえばJMeterという無料ツールがありますが、EC2から実行すると結局実行する側のEC2代がかかってしまいます。




#◆運用監視
これまで障害が発生した場合は、
Mackerel -> Twilioで電話 & Slackへ通知 -> リモートデスクトップで作業
という運用だった（DB負荷などで障害がよく起きていた）
AWS移行したことで障害はほとんどなくなったが、運用監視の会社に入ってもらった。
障害発生時のフローを決めておくことで、障害が起きても復旧まで行ってもらえます。
AWS移行 - mysql, postgres（RDS）リストア


#概要
**○環境　移行前、移行後**
・PHP5.2 -> 5.3
・Mysql5.2 -> 5.5(RDS)
・Postgres9.1 -> 9.5

##DB（Mysql)AWS移行、３パターン
・sql形式でのdump&リストア
・tsv形式でのdump&リストア
・レプリケーション
の３つを紹介しています。
今回のデータが特別だったたけで、通常は３つとも成功すると思います。

#sql形式でのdump&リストア
RDSへのデータ移行には、AWSのマイグレーションサービスを使えれば便利だが、これはMysql5.5からしかサポートしていない。
今回はMysq5.2からの移行なのでMysqldumpで移行を行う。

今回のDBサイズは70GBあるので、圧縮状態でdumpを行い、RDSに対しリストアします。
ただし、以下のように全てのデータを一つのファイルでdumpすると失敗します。

```sql:データのdump+圧縮>リストア
mysqldump -u USERNAME -p DBNAME | gzip > /home/user/dumpfilename.gz
zcat /home/user/dumpfilename.gz | mysql -u USERNAME -p DBNAME -h xxxxxx.rds.amazonaws.com
```

```sql:error内容
ERROR 1227 (42000)  at line 5163: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
```
viewやtriggerは作成ユーザーの情報を持っており、リストア時にそのユーザーでないとエラーが出ます。
Super権限を持つユーザーでリストアを行えば解決できるのですが、
RDSではSuper権限が付与されたユーザはAWS側が管理用に確保しているrdsadminというユーザのみになっており、自身で作成したユーザにはSuper権限が付与できません。
そのためdumpファイル側に工夫を施し、権限が無くてもリストアできるかたちにする必要があります。


##ダンプファイルを工夫
ダンプファイルを、テーブルやView、Trigger、データの３つのファイルにわけてダンプをし、
ViewとTriggerのSqlファイルから作成者情報を削除します。

```shell:データのみダンプ
mysqldump -u user -p db_name --no-create-info --skip-triggers --skip-dump-date | gzip > onry_data.gz
```

・テーブルとビューのみダンプ

```shell:テーブルとビューのみダンプ
mysqldump -u user -p db_name --no-data --skip-triggers --skip-dump-date > only_schema.sql
sed -i -e '/^\/\*!50013 DEFINER=/d' only_schema.sql
```

・トリガーとストアドのみダンプ

```shell:トリガーとストアドのみダンプ
mysqldump -u user -p db_name --no-create-info --no-data --routines --skip-dump-date > only_trigger.sql
sed -i -E 's/\/\*\!500.. DEFINER=`.*`@`.*`\*\/ //g' only_trigger.sql 
```

これによりテーブル、ビュー、トリガーの作成には成功したが、データのインポートに失敗します。

```sql:データimportエラー
ERROR 2013 (HY000) at line 8304: Lost connection to MySQL server during query
```

line 8304 で何を実行しようとしているか確認をしたいですが、大容量ファイルのため通常のエディタでは開けません。
大容量ファイルを開ける[EmEditor](https://jp.emeditor.com/)を使用して中身を見てみます。
するとデータが文字化けしていたことが原因だとわかりました。

#TSV形式でのインポート
文字化けしているデータは複数レコード存在した。
これを逐一修正するのは時間がかかるので、TSV形式でdump -> import を実施。
dumpで権限エラーが出る場合、rootで行えるならばスムーズに実施できる。

```shell:TSV形式でdump 
mysqldump -u {USER} -p --fields-terminated-by="\t" {DB名} {TABLE名} --tab=/tmp(保存ディレクトリ)
```

```shell:Import。対象RDSへアクセスし以下を実行
mysql> load data local infile '/home/xxxxx.tsv' into table {TABLE名};
```

#レプリケーション
上記でデータの移行には成功したが、
実際には以下のように、稼働中のDBとレプリケーションすることで対応した。

**オンプレ稼働中DB <-レプリケーション-> EC2上のDB <-レプリケーション-> 移行後のRDS**

中間に１つEC2を挟んでいるのは、稼働中のDBと、移行後のRDSでは直接レプリケーションができなかったためです。





#postgresでのデータ移行
postgresではひっかかるところは無く、すんなり移行が出来た。

##１．postgresqlに実行中プロセスが無いことを確認（10分）
readonlyに変更（やらなくてもいいかも）

```sql:
alter database DB名 set default_transaction_read_only = on;
```
		
##２．dump（10分）

```sql
pg_dump database名 > backup_file名
```
		
##３．データ移動（5分）	
リストア作業をするサーバーへ移動
	
##４．解凍（5分）		
gzip -d xxx.sql.gz	
		
##５．RDSへリモート接続でリストア　（15分）		

```sh
#マスターログイン
psql -h ホスト名 -U ユーザー名 -d DB名

#DB 削除　（一度でもデータインポートした実績がある場合はDBごと削除すると楽）	
drop database DB名;

#再度DB作成
create database DB名 encoding 'UTF8';

#postgres一旦ログアウト　
Ctrl + d

#データロード
psql -U postgres -h ホスト名 DB名 < XXXXXXXXXXXXX.sql
```
AWS移行 - アプリケーション側の改修ポイント


#概要
以前、オンプレからAWSへWEBアプリを移行した際に行ったことです。



##ELBを挟んだ
以前はCDN（Akamai）からWebサーバーを直接見るようにしていましたが、間にELBをはさみました

以前：	Akamai -> Apache -> アプリ(php)
今　：	Akamai -> ELB -> Apache ->  アプリ(php)


SSL証明書は、ApacheからELBに移しました。
##ELBが挟まったことによる影響
通信がSSLかそうでないかを判断している部分に影響がありました。
インターネットからELBの間はSSL通信ですが、
ELBからEC2の間は80番での通信なので、下記のようなコードだと正常に動作しません。

```php:ssl通信かどうか
if($_SERVER["SERVER_PORT"] == 443){
	echo "SSL通信です";
}
```

同じような判別をするなら下記のようなコードを記述する必要があります。

```php:ssl通信かどうか。ELB経由
if($_SERVER["HTTP_X_FORWARDED_PORT"] == 443){
	echo "SSL通信です";
}
```

改修範囲が多い場合、下記のコードでも可能です。

```php:強引に解決
$_SERVER['SERVER_PORT'] = $_SERVER["HTTP_X_FORWARDED_PORT"];
if($_SERVER["SERVER_PORT"] == 443){
	echo "SSL通信です";
}
```




##リソースのIPをprivateドメインで管理
セッションサーバーをElasticacheにした際、IPの管理方法を見直しました。
今まではphp.iniに直接キャッシュサーバーのエンドポイントを書いていましたが、route53のprivateドメインを使用するように変更しました。
これをすることで、セッションサーバーのエンドポイントが変更になってもRoute53の設定を変更するのみで済み、アプリやサーバーの設定を変更する必要がなくなります。

以下のようにHosted zonesにレコードを追加する。

```sh:追加したレコード
prd-web-redis.private.XXX.jp
CNAME
prd-redis.XXXXX.cache.amazonaws.com　（redisのプライマリエンドポイント）
```

エンドポイントをRoute53のprivateドメインにする運用方法は、RDSでも有効です。
エンドポイントの変更は本番稼働中の場合には、そう多くあることではありませんが、開発中は頻繁にあります。


##sessionの保存先をredisに変更
phpのセッションの保存先にelasticache を使用する。
当初、elasticacheのmemcachedを使用していたが、レプリケーション機能が付いていなかったためRedisに変更した。

```sh:phpのredisモジュールをインストール
sudo yum --enablerepo=epel install php-pecl-redis

```

```sh:sessionの保存先をredisに変更
sudo vi /etc/php.ini

; session.save_handler = files
; session.save_path = "/var/lib/php/session"
----------------------------------------

sudo vi /etc/php.d/redis.ini

session.save_handler = redis
session.save_path = "tcp://prd-web-redis.private.XXX.jp:6379"
```

##redisに値が保存されているか確認
redis cliを用いてelasticacheに値が保存されているか確認する。
※telnet等、他の手段を使って確認する方法もある。

```sh:redisインストール。値が保存されているか確認する
sudo yum --enablerepo=epel install redis

#以下のコマンドで値が保存されていることを確認した
redis-cli -c -h prd-web-redis.private.XXX.jp -p 6379
keys *
get キー名

```
kintoneカスタマイズ-基礎の基礎編-

# はじめに
この記事では、kintoneのカスタマイズ方法を記載しています。
基本的には、「こうゆう書き方すると、こうなるよ」という部品単位での説明を中心にします。
Javascriptの文法などの解説はしませんので、ご了承ください。
## ご注意事項 
サンプルプログラムは、その動作を保証するものではありません
サンプルプログラムの技術的なサポート等は行っていません

# kintoneカスタマイズファイルの作り方
kintoneのカスタマイズは、「Javascript」という言語で行うことができます。
言語の解説やファイルの作成方法、開発環境については、
kintone公式の開発者コミュニティをご参照ください。
https://developer.cybozu.io/hc/ja/articles/200730174-JavaScriptを使用したkintoneのカスタマイズ

# カスタマイズファイルの構成
カスタマイズを行うためのファイルは、以下のような構成になっています。
フィールドを非表示にする例

```js
(function() {
    "use strict";
    //レコードの追加、編集、詳細画面で適用する
    var events = ['app.record.detail.show',
                  'app.record.create.show',
                  'app.record.edit.show'];
    kintone.events.on(events, function(event) {
        var record = event.record;
        kintone.app.record.setFieldShown('other', false);
    };
})();
```
説明図
※わかりやすく囲んでいるため、厳密には異なります。
<img width="552" alt="image001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374573/56cc7e71-e6d7-6fe8-7e5a-db93a4d97d71.png">


## ①イベントハンドラー部
イベントハンドラーとは、kintoneを操作した際の「保存」や「詳細画面表示」、「編集」といったイベントの中で、
どのイベントの時に②の処理を実行するかを決めます。
上記の例では、３つのイベント発生時に処理を実施するように記載されています。

|イベントハンドラー|イベント詳細|
|---|---|
|app.record.detail.show|詳細画面を開いたとき|
|app.record.create.show|レコード追加(新規作成画面)を開いたとき|
|app.record.edit.show|レコード編集画面を開いたとき|


## ②イベント 
サンプルのイベントは、「レコードを非表示」にする処理です。
構成としては、まずレコード情報(record)を取得します。
ここは、kintoneの決まりなので、こうゆうものとして覚えてしまって良いと思います。

```js
var record = event.record;
```

次に、自分の実行したい処理を記載します。
今回の場合は、「フィールドを非表示にしたい」ということですので、下記のような書き方になっています。

```js
kintone.app.record.setFieldShown('other', false);
//kintone.app.record.非表示にするというコマンド(非表示にするレコード名,false);
//(ここは決まった書き方)                    ※trueの場合、非表示だったものが表示される
```
Flutterの１行で複数の要素を左寄せと右寄せにする

#Flutterの１行で複数の要素を左寄せと右寄せにする
IconとTextとButtonで以下のような配置にしたいときに少し迷ったのでメモ

<img width="303" alt="スクリーンショット 2019-11-04 10.31.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107187/fed7d44e-17d5-278e-f2ce-bf524c1ddc1e.png">

ContainerでひとかたまりにしてからRowなどで配置する

```dart
Row(
      mainAxisAlignment: MainAxisAlignment.spaceBetween, // これで両端に寄せる
      children: <Widget>[
        Container(
          child: Row(
            children: <Widget>[
              Icon(Icons.access_time),
              Text(
                "alpha",
                style: TextStyle(
                    color: Colors.black,
                    fontSize: 25,
                    fontWeight: FontWeight.bold),
              ),
            ],
          ),
        ),
        RaisedButton(
          onPressed: null, // 押した時の処理
          color: Colors.blue,
          child: const Text(
            '更新',
            style: TextStyle(
                color:Colors.white,
                fontSize: 20.0
            ),),
        )
      ]);
```
ang-simple-twitter

#はじめに
 6月からやりたかったことのようやく、第一歩。
 angularでtwitter clientの最初のバージョン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60225/c7bd3d53-96ed-4777-ecb4-b4ad35a3f8db.png)

#必須条件
node 12以上

#インストール
`git clone https://github.com/hideume/ang-simple-twitter
cd ang-simple-twitter
npm install`

そのあと,次のようにtwitterのaccess_token等を環境変数に定義
(process.envというのは環境変数を参照してますってこと）
<pre>
const client = new Twitter({
  consumer_key: process.env.Twitter_CONSUMER_KEY,
  consumer_secret: process.env.Twitter_CONSUMER_SECRET,
  access_token: process.env.Twitter_ACCESS_TOKEN_KEY,
  access_token_secret: process.env.Twitter_ACCESS_TOKEN_SECRET
});
</pre>

`node server.js
ng s
`
っで、localhost:4200で上の画面となります。

#今後の課題
昔、`https://github.com/hideume/simple-twitter-client`というのもアップしていてその機能まで追いつこうとしているが、まずは、古いモジュール(angular2-moment)とかを削除して最新にもっていこうかともしている。

オリジナルはgitのangular-twitter-clientだったかな？angular6を8に変更してあっぷしてます。
Laravel: DB: マイグレーションとシーダー

#####・前提
[Laravel5.5 インストール](https://qiita.com/Fell/private/dfe24647f16637807e88)

####・DBテーブルを生成 -> items

```console:DBマイグレーションファイルの作成
$ php artisan make:migration create_items_table
```

```php:マイグレーションファイルの編集
        Schema::create('items', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name', 255);
            $table->string('content', 255);
            $table->unsignedInteger('price');
            $table->unsignedInteger('quantity');
            $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
            $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
            $table->softDeletes();
        });
```

```console:マイグレーションの実行
$ php artisan migrate
```

```console:マイグレーションを１つ取り消す
$ php artisan migrate:rollback --step=1
```
####・Modelの生成

```console:
$ php artisan make:model Item
```

```php:app\Item.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Item extends Model
        //指定するテーブル名を追加
        protected $table = 'items';
}
```
####・Seeder でデータ挿入

```console:Seederファイルの生成
$ php artisan make:seeder ItemTableSeeder
```

```php:database/seeds/ItemTableSeeder.php
<?php
use Illuminate\Database\Seeder;
use App\Item;

class ItemTableSeeder extends Seeder
    public function run()
    {
        // 商品データを追加
        $item = Item::create([
            'name'     => 'Core i7 9700K BOX',
            'content'    => '8C 8T 3.6GHz LGA1151',
            'price' => 43464,
            'quantity' => 10,
        ]);
        $item = Item::create([
            'name'     => 'Core i5 9600 BOX',
            'content'    => '6C 6T 3.1GHz LGA1151',
            'price' => 26723,
            'quantity' => 15,
        ]);
        $item = Item::create([
            'name'     => 'Core i3 9100 BOX',
            'content'    => '4C 4T 3.6GHz LGA1151',
            'price' => 15787,
            'quantity' => 14,
        ]);
    }
}
```

```console:
$#全シーダーの実行
$ php artisan db:seed
$#特定のシーダーファイル実行
$ php artisan db:seed --class=ItemTableSeeder
```

```console:シーダーのやり直し（マイグレーションのやり直し）
$ php artisan migrate:rollback --step=1
```

お疲れさまでした。
DBにデータが格納されたか確認してください。
C言語の再入門

何らかの形でC言語を使った業務にかかわると、自分の知っているC言語と違う、と感じることが多々あります。なんでこんな風にしているの？とか疑問を持ちつつも、周りの人に聞いても要領の得ない回答しか得られず、結局、しんどい思いをしながらソースコードを読み解いていく、というのが世の中の常かもしれません。

そんな中、再びCでまとまったコードを書く必要に迫られたので手に取ったのが次の本でした。

#モダンC言語プログラミング

https://www.amazon.co.jp/%E3%83%A2%E3%83%80%E3%83%B3C%E8%A8%80%E8%AA%9E%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E8%8A%B1%E4%BA%95%E5%BF%97%E7%94%9F/dp/4048913093

#面白かった点
CI/CDなど最近の開発環境に併せたツールも視野に入れている。
オブジェクト指向をC言語で実現するには？といった他言語を学んだ上で再入門するにはとても入りやすい。
デザインパターンをC言語で書き下すといったことをやってくれている。

＃閑話休題
当方、開発遍歴（言語）遍歴としては
C=>C++=>Java/Kotlin=>Perl/Python/Ruby=>C(イマココ)

という流れでした。新卒で入った会社では、大学時代にC言語使ってましたー。って言ったものの、動画の編集ライブラリのインプリメンテーションを依頼されたものの、
渡されたサンプルコードのあまりのスパゲッティっぷり
Breakを張って動作をさせてみないと実際にどこが動いているのか追えないコードの可読性の低さ
Buildの方法が口伝継承
Buildに半日かかる。差分ビルドも癖がある。
と、開発環境の酷さに閉口してました。

関数ポインタであるとか、可読性を下げるだけの代物をなんでこんなに多用するんだーとか思っていたものが、当時、意識していたかはわかりませんが、デザインパターンの文脈で語られているものだったりすると、しっくり来たりします。
【SQLite3】データの取得 (SELECT文)

テーブルの中のどのカラムの値を取得するのかをSELECTの後に記述し、
取得するテーブル名をFROMのあとに記述します。

```sql:書式
SELECT カラム名 FROM テーブル名;
```

テスト用に次のようなテーブルを作成し、INSERT文を使ってテーブルにデータをいくつか格納しておきます。

```sql
CREATE TABLE testUser4(id INTEGER, name TEXT, address TEXT);

INSERT INTO testUser4 VALUES(1, 'Yamada', 'Tokyo');
INSERT INTO testUser4 VALUES(2, 'Kumada', 'Osaka');
INSERT INTO testUser4 VALUES(3, 'Hoshi', 'Kyoto');
INSERT INTO testUser4 VALUES(4, 'Endou', 'Tokyo');
INSERT INTO testUser4 VALUES(5, 'Suzuki', 'Osaka');
```

---

## 任意のカラムのデータを取得

SELECT文を使ってこのテーブルからデータを取得してみます。
複数のカラムの値を取得するときは、カンマ(,)で区切ってカラムを指定します。
userテーブルのidカラムとnameカラムの値を取得するには、次のように実行します。

```sql:書式
SELECT カラム名1, カラム名2, ... FROM テーブル名;
```

```sql
SELECT id, name FROM testUser4;

id          name      
----------  ----------
1           Yamada    
2           Kumada    
3           Hoshi     
4           Endou     
5           Suzuki    
```

---

## 全てのカラムの値を取得

テーブルに含まれるすべてのカラムの値を取得したい場合は、SELECT文でカラムをすべて列挙することで取得することができます。
全てのカラムを指定する以外に、全てのカラムを順番通りに取得する場合には、カラムの代わりにアスタリスク(*)を記述するとすべてのカラムを指定したのと同じ結果となります。

```sql:書式
SELECT * FROM テーブル名;
```
```sql
SELECT * FROM testUser4;

id          name        address   
----------  ----------  ----------
1           Yamada      Tokyo     
2           Kumada      Osaka     
3           Hoshi       Kyoto     
4           Endou       Tokyo     
5           Suzuki      Osaka     
```

---

### 本記事目次ページ
[【データベース】SQLite3・JDBCまとめ](https://qiita.com/tsweblabo/items/8fa21f3e9e30885be034)

### 参考サイト
- [DBOnline 初心者でもわかりやすいサイトSQLite入門](https://www.dbonline.jp/sqlite/)
日本の地形の3D画像を作成する

#はじめに
今回は備忘録として日本の地形の3D画像を作成する手順について書く．

#環境
OS windows 10
cygwin 2.11.0-1
(cygwinのパッケージとして，Perl，shells，GDALをインストールしておく)
GMT 4  
[基盤地図情報ビューア](https://fgd.gsi.go.jp/download/documents.html)（ページ下部）

#やり方（備忘録）
まず作りたい範囲の地形のメッシュデータを国土地理院の[基盤地図情報ダウンロードサービス](https://fgd.gsi.go.jp/download/mapGis.php)からダウンロード．
（この際にアカウント登録等の手続きが必要）
ダウンロード後，基盤地図情報ビューアを開き，ダウンロードしたメッシュデータを**zipファイル形式のまま**，ドラッグアンドドロップ．
すると以下のように地形データが可視化される．


![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526939/663e9443-4855-c1d1-8fe3-0f29e6048ea6.png)

その後，画面上部，エクスポート/標高メッシュをシェープファイルへ出力/　からシェープファイルを出力．この際当地域が直角座標系の何系にあたるか調べておく．
出力された4ファイルの位置で，cygwinから以下のコマンドを実行する．

```
ogr2ogr -f GMT ***_gcs.gmt ***.shp
```

上記コマンドからバイナリ形式のシェープファイルをGMTで利用可能なテキスト形式に変換．***にはファイル名．

出力されたファイルを``gmt``というフォルダに格納，同じ階層で以下のソースコードを実行する．

```ruby:gmt2grd.pl
#!/usr/bin/perl

# 球面またはデカルト座標系のxyz形式データをgrdファイルに変換する

$ratio = 2.0; # 勾配データ出力倍率

$input_path = $ARGV[0];

@paths = split (/\//, $input_path);

$gmt_dir = join ("/", @paths[0 .. $#paths - 1]);

$filename = $paths[$#paths];

if ($filename =~ /(.+)_gcs(.*)\.gmt$/)
{
	# 地理座標系の場合
	$filename = $1 . "_gcs" . $2;
#	$dx = 2.25 / 3600.0; # 50m
	$dx = 2.25 / 10 / 3600.0; # 5m
#	$dy = 1.5 / 3600.0; # 50m
	$dy = 1.5 / 10 / 3600.0; # 5m
	$prec = "7f";	# 出力データにおける小数点以下の精度
	$r = 0.1 * $dx;
}
elsif ($filename =~ /(.+)_xy(.*)\.gmt$/)
{
	# 平面直角座標系の場合
	$filename = $1 . "_xy" . $2;
	$dx = "5";	# 出力データの格子幅（単位：メートル；x方向）
	$dy = "5";	# 出力データの格子幅（単位：メートル；y方向）
	$prec = "2f";	# 出力データにおける小数点以下の精度
	$r = $ratio;
}
else
{
	print "Usage: gmt2grd.pl [ data_name ]_[ gcs | xy* ]\r\n";
	exit;
}
```

上記ソースコードを

``` 
perl gmt2grd.pl gmt/***_gcs.gmt
```
で実行．
実行後，``gmt/grd``の中に``***_gcs.grd``ファイルが作成されているのを確認．
次に同じ階層で``grd``フォルダを作成し，作成したgrdファイルを格納．そして以下のソースコードを``gmt``フォルダと同階層で実行．

```ruby:grd2eps.sh
#!/usr/bin/csh

# 3D作図用のtcshスクリプト

touch ./grd/null.xyz

xyz2grd ./grd/null.xyz -G./grd/null.grd -R./grd/###_gcs.grd -V -N-2

makecpt -Crelief -T-301/299/10 -Z -D > dem.cpt

grdmath ./grd/***_gcs.grd ./grd/null.grd AND = tmp10.grd
grdgradient tmp10.grd -D -Stmp10_slope.grd
grdmath tmp10_slope.grd 0.00001 MUL NEG = tmp10_slope.grd
#以下の-Rオプションは該当地域の地理座標系緯度経度を西/東/南/北の順に入力
#gmtフォルダに出力された***_gcs.txtに緯度経度が書き込まれている
grdview tmp10.grd -Jm190c -Jz0.0025c -
R*********/********/********/******** -Cdem.cpt -E90/30 \
	-Itmp10_slope.grd -Qc600 -N0/127/127/127 -Wf0.25p -Bg2000/g2000WeSn -V -Xc -Yc -P \
	> ***_gcs_3D_1.eps

```

上記ソースコード内のgrdviewコマンド -Rオプションに地理座標系の緯度経度を入力する必要があるので注意．
grdviewコマンドの各オプションを設定することで，3D画像の表示方法を自分で変えられる．-Jzでは鉛直方向の縮尺，-Eでは方位角，仰角を設定．他詳細は[こちら](http://gmt.shin-gen.jp/GMT4.1.4/grdview.html)．

このようなeps形式の3D画像ができれば完成．
![qiita2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526939/33e9b156-fb16-4f5a-3a74-52ca39bdf1c6.jpeg)
[数値計算法,python]Eular法による常微分方程式の解法

#はじめに
常微分方程式とは独立変数t,とtに従属する関数y(t), 及び、そのn階導関数(n=0,1,2,...,N)を含む方程式のことです。
つまり、

```math
g(t,y,y',y'',y^{(3)},...,y^{(N)}) = 0 \hspace{50pt}(1)
```
の形で記述可能な方程式のことです。

このような方程式はEular法(オイラー法)という数値解法により、解を近似できます。
実際の例を用いて説明していきます。

#Eular法を使うための準備
上の微分方程式$(1)$は、実はオイラー法を使うには適していない形になっています。
これをどうにかして下の$(2)$のような形に変形しなければなりません。

```math
\frac{dx(t)}{dt} = f(t,x(t)) \hspace{50pt}(2)
\\ただし, x(t)=\begin{pmatrix}y\\y'\\y''\\...\\y^{(N-1)}\end{pmatrix}
```

###実際の例

ばね定数$k$のばねの先端に質量$m$の質点のついた系を考えます。系に振動的外力がかかり、また、空気抵抗を考慮する時の微分方程式は以下のようになります。
※解析的に解くことが可能ですが、数値計算法で解くことを考えます。

```math
m\frac{d^2y(t)}{dt^2}+2\gamma \frac{dy(t)}{dt}+ky(t)=a\sin(\omega t)\hspace{50pt}(3)
```

$(3)$を変形すると、

```math
\frac{d^2y(t)}{dt^2}=-\frac{2\gamma}{m} \frac{dy(t)}{dt}-\frac{k}{m}y(t)+\frac{a}{m} \sin(\omega t) \hspace{50pt}(3-1)
```
また、

```math
\frac{dy(t)}{dt}=\frac{dy(t)}{dt}\hspace{50pt}(3-2)
```


ここで、ベクトル$x(t)$を

```math
x(t)=\begin{pmatrix} x_1(t)  \\ x_2(t) \end{pmatrix} = \begin{pmatrix} y(t)  \\ \frac{dy(t)}{dt} \end{pmatrix}
```

と置くと、$(3-1)$,$(3-2)$から、

```math
\frac{dx(t)}{dt}
=\frac{d}{dt} \begin{pmatrix} y(t) \\ \frac{dy(t)}{dt}  \end{pmatrix}
=\begin{pmatrix} \frac{dy(t)}{dt} \\ \frac{d^2y(t)}{dt^2}  \end{pmatrix}
=\begin{pmatrix} \frac{dy(t)}{dt} \\ -\frac{2\gamma}{m} \frac{dy(t)}{dt}-\frac{k}{m}y(t)+\frac{a}{m} \sin(\omega t)  \end{pmatrix}
=\begin{pmatrix} x_2(t) \\ -\frac{2\gamma}{m} x_2(t)-\frac{k}{m}x_1(t)+\frac{a}{m} \sin(\omega t)  \end{pmatrix}
```
よって、以下のように表せる。

```math
\frac{dx(t)}{dt} = f(t,x(t))\hspace{50pt}(4)
\\where : f(t,x)=\begin{pmatrix} x_2 \\ -\frac{2\gamma}{m} x_2-\frac{k}{m}x_1+\frac{a}{m} \sin(\omega t)  \end{pmatrix}
```

#Eular法
ここまでの作業で、見栄えのいい形の微分方程式を作ることが出来ました。
では、ここからはEular法そのものについて説明します。

まず、微分の定義から

```math
\frac{dx(t)}{dt} = f(t,x(t))
```

```math
⇒\lim_{\Delta t \to 0} \frac{x(t+\Delta t)-x(t)}{\Delta t} = f(t,x(t))
```

ここで、十分小さい$\Delta t$を用いれば、

```math
\frac{x(t+\Delta t)-x(t)}{\Delta t} \fallingdotseq f(t,x(t))
```

```math
⇒x(t+\Delta t) \fallingdotseq x(t)+f(t,x(t))\Delta t\hspace{50pt}(5)
```

この式を使えば、最初の$x(t)$が分かれば$\Delta t$秒後の$x(t+\Delta t)$が計算できます。

#プログラム(python)
Eular法をpythonで実装すると以下のようになります。

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

a = 10           #a(外力の振幅)
(m,gm2,k) = (30,5,1)#m,2Γ,k
omg = np.pi     #ω

def f(t,x):
    f0 = x[1]
    f1 = -(gm2/m)*x[1] -(k/m)*x[0] + (a/m)*np.sin(omg*t)
    return np.array([f0,f1])
```

```python:f_D.py
import numpy as np
from f import f as f

dt = 0.01

def f_D_eular(t,x):
    return (t + dt, x + f(t,x)*dt)
```

```python:main.py
import numpy as np
from f_D import f_D_eular as f_D

def main():
    (t0,x0)=(0,np.array([1,0]))
    t1 = 100
    (t,x)=(t0,x0)
    while(t < t1):
       print(t,x[0])
       (t,x)=f_D(t,x)

main()
```
という感じになります。
ちなみに、このプログラムの実行結果をグラフにすると、以下のようになりました。

![_data.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511838/8b7ac55d-a2e9-5f2e-0ef5-ea3a97e29394.png)

初期条件である$t0,x0$やf.pyの中の各種パラメータを変えると系の特性が見えてきます。
summpyで文章要約してみた

リクルートテクノロジーズが公開している文章要約ツールsummpyを試してみました。

summpy
https://github.com/recruit-tech/summpy

環境はUbuntu16.4です。
動作にはPython 2.7が必要。デフォルトでは入ってないのでanacondaで2.7の環境を整備します。

```
$ conda create -n 2.7 python=2.7 anaconda
```
ちゃんとインストールできたか確認

```
$ source activate 2.7
(2.7)$
(2.7)$ conda info -e
# conda environments:
#
base                     /home/croso/anaconda3
2.7                   *  /home/croso/anaconda3/envs/2.7
3.5                      /home/croso/anaconda3/envs/3.5
3.6                      /home/croso/anaconda3/envs/3.6
```

形態素解析にMeCabまたはjanomeが必要ということでMecab-pythonをインストール

```
(2.7)$ pip install mecab-python
```
続いてpipでsummpyをインストールします

```
(2.7)$ pip install summpy 
```

サンプルスクリプトを作成

```python

# -*- coding: utf-8 -*-
from summpy.lexrank import summarize

text=u'''
総務省が１日発表した９月の完全失業率（季節調整値）は２．４％となり、前月から０．２ポイント悪化した。

ロイターの調査では２．３％が予想されていた。

完全失業率は２０１８年１月以降、２．５％以下の水準で推移している。

総務省は「失業率は上昇したが、水準としては約２６年ぶりの低い水準で推移しており、雇用情勢は着実に改善している」（幹部）と総括した。

就業者数（季節調整値）は６７３０万人と前月に比べ５万人減少。

完全失業者数（同）は１６７万人と前月から１３万人増加した。

完全失業者数の増加は６カ月ぶり。

内訳をみると、非自発的な離職は前月と同数だったが、自発的な離職（自己都合）は同１万人増、新たな求職は同９万人増となっており、総務省は「新たに働きたいという人が増えている」とみている。

原数値では、就業者数は前年同月比５３万人増の６７６８万人だった。

８１カ月連続で増加し、比較可能な１９５３年以降過去最多となった。

１５―６４歳の就業率は７７．９％と過去最高タイ。

厚生労働省が発表した９月の有効求人倍率（季節調整値）は１．５７倍で、前月から低下した。

ロイターの調査では１．５９倍が見込まれていた。
'''

sentences, debug_info = summarize(
    text, sent_limit=2
)

for sent in sentences:
    print sent.strip().encode('utf-8')


```
ニュースサイトから適当に抜粋した記事を解析してみます。
sent_limitは`結果を何行にまとめるか？`みたいです。
ここまではsummpyのREADME.mdをそのままなぞった形です。

動作させるとエラーとなりました。

```
"error": "add_edge() takes exactly 3 arguments (4 given)"
```

調べてみるとnetworkxとやらのバージョン不一致とのこと。
https://teratail.com/questions/114565
バージョンを合わせることにします。

```
(2.7)$ pip install multiqc==1.2
(2.7)$ pip install networkx==1.11
```
`初めにmultiqcをインストール`してください。multiqcをインストールすると自動でnetworkxも2.2をインストールしちゃうので、その上からnetworkxの1.11を上書きしてあげないと上手く環境を再現できません。

出来上がった文章が以下です

```
就業者数（季節調整値）は６７３０万人と前月に比べ５万人減少。
完全失業者数（同）は１６７万人と前月から１３万人増加した。
```

どんなもんでしょうか。就業者数は減少、失業者数は増加、ということで日本の景気が冷え込みましたと要約文から読み取れます。ただ「前月から０．２ポイント悪化した」という主題ともいえる文章を見逃している気もします。

あと勘違いしていたのですが「文章の要約」はしてくれないみたいです。`文章のなかから重要な行だけを抽出するツール`というのが正しいみたい。

ちなみにmecabはインストールしてそのまま利用している人はほとんどいないと思います。辞書を追加しないと使い物になりません。というわけで、以下をインストール。

https://github.com/neologd/mecab-ipadic-neologd

最新ワード対応しているmecab辞書です。インストール後に以下に辞書情報が入っているはず。

```
(2.7)$ ls /usr/local/lib/mecab/dic/mecab-ipadic-neologd
char.bin  dicrc  left-id.def  matrix.bin  pos-id.def  rewrite.def  right-id.def  sys.dic  unk.dic
```

辞書を自動で読んでほしいのですが、summpyにはそんな機能ありませんでしたので、ソースの一部を書き換えて対応しました。（mecab-pythonのほうに手を入れるほうが正しいかも...)

```
(2.7)$ vi ~/anaconda3/envs/2.7/lib/python2.7/site-packages/summpy/misc/mecab_segmenter.py 
```

8行目

```
_mecab = MeCab.Tagger()
```
を

```
_mecab = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
```

に差し替え。これで多少精度は良くなっているはず...

関係ない話になってしまいますが、機械学習には膨大な量の学習データが必要です。そのなかで文章要約というのは学習データを比較的集めやすい課題だと思いました。数多あるニュースサイトから正解データは記事タイトル、学習データを記事本文にすれば、いくらでもネットにサンプルが転がっているわけで、勉強にはよい題材かもしれないと思いました。
コマンドプロンプトのcdが使いづらいのでなんとかしてみた

コマンドプロンプトの `cd` コマンドって使いづらいですよね？

Linux で一般的な POSIX シェルの `cd` とは違い、以下のような欠点があります。

1. `cd` だけでホームディレクトリに移動できない。
2. `cd -` で前のディレクトリに戻れない。
3. 環境変数 `PWD` と `OLDPWD` がない。（これは別に無くてもいいけど）
4. ドライブの移動には `/D` オプションを使用する必要がある。

そこでバッチファイルで `cd` コマンドのラッパーを作ってなんとかしてみました。

```:shcd.bat
@echo off

if "%OLDPWD%" == "" set OLDPWD=%USERPROFILE%
if "%PWD%" == "" (
  for /F "usebackq tokens=*" %%d in (`cd`) do set PWD=%%d
)

if "%~1" == "-" if '%1' == '-' goto :BACK

:GO
  setlocal
  for /F "usebackq tokens=*" %%d in (`cd`) do set OLDPWD=%%d

  if "%~1" == "" (
    cd /D %USERPROFILE%
  ) else (
    cd /D %*
  )
  if errorlevel 1 exit /B %ERRORLEVEL%

  for /F "usebackq tokens=*" %%d in (`cd`) do set PWD=%%d
  endlocal & cd /D %PWD% & set PWD=%PWD% & set OLDPWD=%OLDPWD%
  goto :EOF

:BACK
  setlocal
  cd /D %OLDPWD%
  if errorlevel 1 exit /B %ERRORLEVEL%
  endlocal & cd /D %OLDPWD% & set PWD=%OLDPWD% & set OLDPWD=%PWD%
```

このバッチファイルをどこかにおいて、`doskey` でエイリアス設定をすれば完成です。潰してしまった `cd` コマンドのカレントディレクトリを表示する機能の代わりとして `pwd` も用意しています。

```
doskey cd=shcd.bat $*
doskey pwd=cd
```

`doskey` のエイリアス設定はコマンドプロンプト起動時にバッチファイルを自動実行させると便利です。（参考 [コマンドプロンプトの開始時に定型処理を自動実行するには](http://sig9.hatenablog.com/entry/2015/01/11/020618)）

以上です。

## おまけ

これだけではなんなんで、少しコードの分かりづらい場所の解説を。

```
for /F "usebackq tokens=*" %%d in (`cd`) do set PWD=%%d
```

現在のディレクトリ（= `cd` コマンドの出力結果）を環境変数 `PWD` に入れるコードです。なんと冗長なのでしょうか・・・

```
if "%~1" == "-" if '%1' == '-' goto :BACK
```

`cd -` は前のディレクトリに戻るが、`cd "-"` だとディレクトリ名として扱うようにした（つもり。バグがあるかも）

```
:GO
  setlocal
  for /F "usebackq tokens=*" %%d in (`cd`) do set OLDPWD=%%d
　略
  endlocal & cd /D %PWD% & set PWD=%PWD% & set OLDPWD=%OLDPWD%
```

環境変数 `OLDPWD` を変更していますが、途中のディレクトリ移動でエラーになったときに途中で `exit` し、なかったことにするために `setlocal` を使用しています。ディレクトリ移動できた場合のみ `endlocal` を実行しますが、通常はこれで環境変数の変更（とディレクトリ移動）が元に戻るのですが、同じ行にコードを書くことで `endlocal` の外に環境変数を持ち出すことができます。（行の解釈と実行の順番からこのような挙動になるそうです。）


```
:BACK
　略
  endlocal & cd /D %OLDPWD% & set PWD=%OLDPWD% & set OLDPWD=%PWD%
```

ここも似ていますが、ワーク変数を用いること無く二つの変数の中身を入れ替えています。

あとグチですが、バッチファイルはダブルクォートの扱いが面倒ですね。本来の `cd` の挙動と同じく、引数をダブルクォートで括っても括らなくても問題なく、またスペースが含まれてるディレクトリであってもちゃんと動くようにしたつもりですが、ちょっとした書き方の違いで変数の中にダブルクォートが含まれたりして大変でした・・・。
【Jackson】カスタムシリアライザーで、BigDecimal型の返却値を変換した話

## はじめに
SpringBootを用いたWebAPIの開発において、Jacksonを用いているのですが、BigDecimal型の値をレスポンスとして返却する際に課題に直面しました。

それは、小数点以下の連続した0が残ったまま表示されてしまうということです。

例えばPostgresSQLのnumeric型(10, 5)のカラムに「99.9」と値が登録されているとして、この値を取得してJSONで返す場合、BigDecimal型で扱い返却すると「99.90000」と表示されてしまいます。

今回はこの事象を解決したので、記事にしました。

##解決法
まず、下記のBigDecimalSerializer.javaのようなBigDecimal型に対するシリアライザーを作成します。作成時には`StdSerializer`クラスを継承し、ジェネリクスに値を操作する対象のクラスを指定する必要があります。

``` java:BigDecimalSerializer.java
public class BigDecimalSerializer extends StdSerializer<BigDecimal> {

  public BigDecimalSerializer() {
    this(null);
  }

  public BigDecimalSerializer(Class<BigDecimal> c) {
    super(c);
  }

  @Override
  public void serialize(BigDecimal bigDecimal, JsonGenerator generator, SerializerProvider provider) throws IOException {
    generator.writeNumber(new BigDecimal(bigDecimal.stripTrailingZeros().toPlainString()));
  }
}
```

`serialize`メソッドの中で、`JsonGenerator`クラスの`writeNumber`メソッドを用いることによって、BigDecimal型の値に対してどのような値に変換するかを指定してあげることができます。

今回は`BigDecimal`クラスの`stripTrailingZeros`メソッドを用いて小数点以下の0を削除しました。

ただし、このメソッドは[公式ドキュメント](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/math/BigDecimal.html#stripTrailingZeros())にもあるように、例えば600.0に対して用いた場合、結果が6E2と指数標記になってしまいます。

そこで、さらに`BigDecimal`クラスの`toPlainString`メソッドを用いることで指数標記ではない形式にしました。

あとは下記のように先程作成した`BigDecimalSerializer`クラスを用いた`JsonSerialize`アノテーションをレスポンスとして返却するクラスのフィールドに付与してあげれば、小数点以下の0を取り除いた状態で表示してくれます。

``` java:CalculationResult.java
public class CalculationResult {
@JsonSerialize(using = BigDecimalSerializer.class)
private BigDecimal value;
}
```

## まとめ
`StdSerializer`クラスを継承するクラスを作成し、`serialize`メソッドに変換ロジックを記載することで、独自のシリアライザーを作成することができます。

レスポンスとして返却するクラスのフィールドに`JsonSerialize`アノテーションを付与し、作成したシリアライザーを指定することで、返却する値をカスタムすることができます。

この記事が少しでも誰かのお役に立てれば幸いです。

最後までお読みいただきありがとうございました。

## 参考文献
シリアライザーをカスタムする方法
https://www.baeldung.com/jackson-custom-serialization

toPlainStringについて
https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/math/BigDecimal.html#toPlainString()
https://qiita.com/shotana/items/e02357516798e6bc658e
Rustでカレントディレクトリを取得・表示・変更する

## コード

```rust
use std::env;
use std::path::Path;

fn main() -> std::io::Result<()> {
    let path = env::current_dir()?;
    println!("starting dir: {}", path.display());

    let root = Path::new("/");
    assert!(env::set_current_dir(&root).is_ok());

    let path = env::current_dir()?;
    println!("final dir: {}", path.display());

    Ok(())
}
```

## 出力

```bash
$ rustc wd.rs && ./wd && rm wd
starting dir: /Users/wildmouse/hoge/wd
final dir: /
```

## 参考

- [Function std::env::current_dir](https://doc.rust-lang.org/std/env/fn.current_dir.html)
- [Function std::env::set_current_dir](https://doc.rust-lang.org/std/env/fn.set_current_dir.html)
製薬企業研究者がRの基本的な記述ルールについてまとめてみた

# はじめに
ここでは、プログラミング言語Rを勉強し始めた人が最初に覚えるべき文法、構文を紹介します。

# コメントのつけ方

```R:comment.R
# 1行のコメント # 行の途中からコメントを書くことも可能。

# Rの場合、複数行のコメントアウトはできないので、1行1行'#'をつけてコメントを書く。
```

'#'で始まるコメントを改行すると、2行目以降はプログラムの実行範囲と認識され、エラーが発生したり、想定外の動作になることもあるので注意が必要です。 
コメントはスクリプトのメモとして記載できるほか、実行したくないスクリプトを実行されないようにする（コメントアウト）という使い方もできます。

# 文字の出力

プログラムを実行した結果得られる文字などは、print関数を使うことで出力することができます。

```R:print.R
print('Hello, World!') # 「Hello, World!」と出力される。
```

# データ型

他のプログラミング言語と同様に、Rにもデータ型があります。
このデータ型を意識しながらスクリプトを書かないと、プログラムが動作せずエラーが発生したり、想定外の動作をしたりすることにつながります。
文字型と数値型の区別以外は意識しないでも大抵大丈夫）

## 文字列

文字通り、一般的な「文字」を指します。

```R:string.R
# シングルクォーテーションで囲んでもダブルクォーテーションで囲んでもどちらでも良いですが、ダブルクォーテーションで囲むのが一般的です。
print('Hello, World!')
print("Hello, World!")

# シングルクォーテーションから始めて、ダブルクォーテーションで閉じる（もしくはその逆）のはNGです。
print('Hello, World!") # エラーになる。
print("Hello, World!') # エラーになる。
print('Say "Hello, World!"') #これはOK。文字列の中でさらにクォーテーションを使いたい場合は、最も外側のクォーテーションではない方のクオーテーションで囲む。
print("Say 'Hello, World!'") # これもOK。上述のように文字列はダブルクォーテーションで囲むのが一般的なので、こちらの書き方の方が普通。
```

## 数値

算術計算ができる「数値」を指します。
文字列の「数字」だと算術計算ができません。

```R:number.R
print(123) # クォーテーションで囲まず、数字をそのまま書く。これは整数型。
print(123.4567) # 小数点付き（浮動小数点数型と言う）でも書ける。
print("123") # こう書くと、数値ではなく「文字列としての数字」になってしまう（後述の算術演算が正確にできない）。
```

データ型の変換は、上記の例だと分かりにくいですが、変数を扱うようになるとよく出てきます。
例えば、どうしても文字列として定義されてしまう変数に数字が値として格納されていて、それを数値として扱いたい場合、などです。

## 真偽値（ブール型）

'TRUE'または'FALSE'のどちらかの値になります。

```R:boolean.R
print(TRUE) # 「真」
print(FALSE) # 「偽」
```

クォーテーションは不要です。大文字で書くか、頭文字の大文字だけ書くようにします。
この辺はif文と密接に関係するところです。


# まとめ

ここでは、プログラムの実行結果の出力方法と、データ型について解説しました。
プログラミング初心者の人はしっかり理解するようにすると良いと思います。

# 参考資料・リンク

[意外と少ない！？製薬会社でのプログラミングに必要な「最低限」の知識](https://pharma-engineer.com/basic-programming/minimum-information/)
【SQLite3】データの削除 (DELETE文)

テーブルからデータを削除するには、DELETE文を使います。

```sql:書式
DELETE FROM テーブル名 WHERE 条件式;
```

まず削除の対象となるデータをWHERE句の条件式を使って指定します。
条件式に一致するデータが複数の場合は、複数のデータがまとめて削除されることになります。
WHERE句を省略した場合はテーブルに含まれる全てのデータが削除されます。

それでは実際に試してみます。下記の通りテーブルを作成し、データをいくつか追加します。

```sql
CREATE TABLE testUser3(id INTEGER, name TEXT, old INTEGER);
INSERT INTO testUser3 VALUES(1, 'Yamada', 32);
INSERT INTO testUser3 VALUES(2, 'Suzuki', 15);
INSERT INTO testUser3 VALUES(3, 'Honda', 18);
INSERT INTO testUser3 VALUES(4, 'Endou', 24);
INSERT INTO testUser3 VALUES(5, 'Furuta', 19);
```
一応、データを取得してテーブルを確認します。

```sql
SELECT * FROM testUser3;
id          name        old       
----------  ----------  ----------
1           Yamada      32        
2           Suzuki      15        
3           Honda       18        
4           Endou       24        
5           Furuta      19        
```

old カラムの値が 20 より小さいデータを削除します。

```sql
DELETE FROM testUser3 WHERE old < 20;
```

データを取得してテーブルを確認します。

```sql
SELECT * FROM testUser3;
id          name        old       
----------  ----------  ----------
1           Yamada      32        
4           Endou       24        
```

条件式に一致したデータが削除されていることが確認できます。

では次にテーブルに含まれているデータを全て削除してみます。

```sql
DELETE FROM testUser3;
```
```sql
SELECT * FROM testUser3; 
```

データを取得して、テーブルの値が何も表示されなければ、全てのデータが削除されていることになります。

---

### 本記事目次ページ
[【データベース】SQLite3・JDBCまとめ](https://qiita.com/tsweblabo/items/8fa21f3e9e30885be034)

### 参考サイト
- [DBOnline 初心者でもわかりやすいサイトSQLite入門](https://www.dbonline.jp/sqlite/)