OmniAICreator/Qiita-1.07M huggingface dataset:
CarrierWaveの保存先をS3からローカルに戻す方法。


#両方とも Fileにする
```config/initializers/carruerwave.rb
CarrierWave.configure do |config|
  if Rails.env.production?
    config.storage :file
  # config.fog_credentials = {
  #     :provider               => 'AWS',
  #     :aws_access_key_id      => ENV['UPLOAD_APIKEY'],
  #     :aws_secret_access_key  => ENV['UPLOAD_SECRETKEY'],
  #     :region                 => 'ap-northeast-1'
  # }
  #
  # config.fog_directory = ENV['UPLOAD_BUCKET']
  else
    config.storage :file
  end

end

```

AWS　S3の表記をコメントアウトして　両方ともFileにする。


#Uploaderのファイルを編集
```app/uploaders/ckeditor_wave/ck_image_uploader.rb
  class CkImageUploader < CarrierWave::Uploader::Base

    # Include RMagick or ImageScience support:
    # include CarrierWave::RMagick
    include CarrierWave::MiniMagick
    # include CarrierWave::ImageScience

    # Choose what kind of storage to use for this uploader:
    if Rails.env.production? || Rails.env.staging?
      # storage :fog
      storage :file
    else
      storage :file
    end
```

こちらも両方ともFileにする。

#Herokuから ENVKEYを削除する
```
$ heroku config:unset UPLOAD_BUCKET
$ heroku config:unset UPLOAD_SECRETKEY
$ heroku config:unset UPLOAD_APIKEY
```
これでS3 への接続が削除される。

#補足
このままでも運用できるが、Herokuはローカルに保存すると
毎日アップロードしたデータ・画像は削除される。
Java Script 　学習記録　初めて時計を作ってみました。

JavaScriptで時計を作成

#はじめに
ドットインストール、ProgateでJavascriptの基本を勉強したので、練習、おさらいの為に
時計を作ってみました。備忘録として投稿します。


#時計を作成したステップ
　1.HTML　日付、時刻部分を作成
　2.CSS　背景色、フォントサイズなどを決める
　3.JavaScript　
　　Dateオブジェクトを使って現在日時を取得
　　日時を常に２桁にする
　　HTMLに日付、時刻を表示される
　　毎秒ごとに繰り返し処理をさせる
************************************************************************

#サンプルコード

```HTML:index.html

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>clock</title> <!-- ブラウザのタイトルバーに表示 -->
    <link rel="stylesheet" href="./style.css"> <!-- css読み込み -->
    <script src="./clock.js"></script> <!-- JavaScript読み込み -->
  </head>
  <body>
      <!-- clock部分-->
        <div class="clock_frame">
          <!-- date部分-->
          <span id="clock_date"></span>
          <!-- time部分 -->
          <span id="clock_time"></span>
        </div>
  </body>
</html>



```

```CSS:style.css
/* boby要素 */

body{
  color:white;
  background-color: red;
}

/* id clock_frame*/
div#clock_frame{

  width: 100%; /* 横幅をbodyと同じ幅に */
}

/* span要素 */
span{
  display: block; /* spanをブロック要素として扱う*/
  float: right;  /* 右寄せに配置 */
  width:80%; /* 横幅を指定*/
  font-style: italic; /* フォントスタイル　*/
}

/* id clock_date */
span#clock_date{
  text-align: left; /* テキストを左詰め */
  font-size: 40px; /* フォントサイズ*/

}

/*  id clock_time*/
span#clock_time{
  font-size: 40px; /* フォントサイズ*/
}


```

```JavaScript:clock.js

// clock 関数
function clock() {

  // 現在日時を表すインスタンスを取得
  let now = new Date();
  // 年
  let year = now.getFullYear();
  // 月　0から11で取得されるので実際の月は+１したものになる
  let month = now.getMonth() + 1;
  //　日
  let date = now.getDate();
  //　曜日　0から6で日曜始まりで取得されるので配列のインデックスを指定する
  let weeks = new Array("Sun","Mon","Tue","Wed","Thr","Fri","Sat")
  let day = weeks[now.getDay()];
  //　時
  let time = now.getHours();
  //　分
  let min = now.getMinutes();
  //　秒
  let sec = now.getSeconds();

  // 日付時刻　常に2桁にする処理
  if (month < 10) month = "0" + month;
  if (date < 10) date = "0" + date;
  if (min < 10) min = "0" + min;
  if (sec < 10) sec = "0" + sec;

// HTML span clock_date 日付を表示
  document.getElementById("clock_date").innerHTML = year + "/" + month + "/" + date + "(" + day + ")";
// HTML span clock_time 時刻を表示
  document.getElementById("clock_time").innerHTML = time + ":" + min + ":" + sec;

}

// clock関数を1000ミリ秒（毎秒）に実行する
setInterval(clock,1000);

```

#作成してみて
初めて作成したのがこの時計です。ただ、他の人が作ったサンプルコードを真似する形となってしまいましたが一つ一つ学習した内容を確認しながら出来たのは良かったかなと思います。CSSを勉強していきもう少し見た目がかっこいい時計に改善したいです。
iTextで印刷時のみ出力するウォーターマークを設定

<font color="Red">**※2020.9.25追記**
iText2.1.7はLGPLだけど、なんかライセンスが怪しいらしいです。記事内容はiText5以降でも使えるかも知れないんで技術情報として残しますが、まあなんかライセンスとかそういうのはちゃんと調べて気を付けたりとかして下さいね。</font>
# 印刷時のみ出力とかあるの？
はえー、PDFってそんなんもあるのね。分かりました作りましょ。PDFと言えばiText。iTextで出来ない事なんかないよ。え？　リニアライズドPDFはできるのかって？　うるせえな、そういうの知ってるならこんな記事読んでんじゃねーよ。

# オッケー分かった早速書いてみるよ
さて日本語を使うなら、**iTextAsian.jar**と**iTextAsianCmaps.jar**も忘れないでね。

```Watermark.java
import java.awt.Color;
import java.io.FileOutputStream;
import java.util.stream.IntStream;

import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfGState;
import com.lowagie.text.pdf.PdfLayer;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;

import lombok.val;

public class Watermark {

	public static void draw(String src, String dest) {
		try {
			val reader = new PdfReader(src);

            try(val fos = new FileOutputStream(dest)) {
				val stamp = new PdfStamper(reader, fos);

				val layer = new PdfLayer("watermark", stamp.getWriter());

				layer.setOnPanel(true);

				layer.setOn(false);
				layer.setPrint("Watermark", true);
				layer.setView(false);

				val transparent = new PdfGState();
				
				// 透明度
				transparent.setStrokeOpacity(0.3f);
				transparent.setFillOpacity(0.3f);

				val bf_courier = BaseFont.createFont("HeiseiKakuGo-W5", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED);

				IntStream.rangeClosed(1, stamp.getReader().getNumberOfPages()).forEach(page-> {

					val cb = stamp.getOverContent(page);

					cb.setColorFill(Color.RED);

					cb.beginLayer(layer);
					cb.setGState(transparent);

					val watermarkText = "持ち出し禁止";

					val cropBox = reader.getCropBox(page);
					
					cb.beginText();
					cb.setFontAndSize(bf_courier, 20);
					
					// 斜めに適当な間隔で書いてみる
					for(int x = 0; x < cropBox.getWidth(); x += 100) {
						for(int y = 0; y < cropBox.getHeight(); y += 100) {
							cb.showTextAligned(PdfContentByte.ALIGN_CENTER, watermarkText, x, y, 45);
						}
					}
					
					cb.endText();

					cb.endLayer();
				});

				stamp.close();
			}
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {

		if (args.length < 2) {
			System.out.println("Usage: Watermark src.pdf dest.pdf");
			return;
		}

		Watermark.draw(args[0], args[1]);
	}
}
```

#こんな感じになりましたとさ
ちょっと小さくて見づらいけど、印刷プレビューにだけウォーターマークが描画されたよ。
ま、大体こんな感じ。
![wmpdf.png](https://qiita-image-store.s3.amazonaws.com/0/117698/ea6a04ce-3d1a-f4c4-2f08-ac3940302105.png)
初心者がフロントエンドエンジニアを目指す

#はじめまして

はじめまして、ほにゃちと申します！
フロントエンドエンジニアを目指しています。
アウトプットをすることで、日々の勉強内容が身につくと思い投稿をしていこうと思います。
自分用メモのようになるかもしれません！

#学んでいきたいこと
HTML、CSS、JavaScriptを学んでいきたいです。
専門学校で軽く学びましたが、感覚の取り戻しと
新たな技術を吸収していきたいです！
ゆくゆくは自分の思い通りにWebサイトを作りたいです！

#さいごに
自分なりに頑張っていこうと思います！
よろしくお願いします！
Androidの録音をするためにAudioRecordでreadを呼び出しても、setRecordPositionUpdateListener内のコールバック関数が呼ばれない際の対処

Androidで音声の録音を実行しようとした際にAudioRecordを使用したのですが、setRecordPositionUpdateListenerのonPeriodicNotificationが正しく呼ばれずに録音が継続的に行わえないという問題が発生して苦戦してしまいました。そのときの忘備録もかねてまとめたいと思います。

# 起きていた現象
AudioRecordではsetPositionNotificationPeriodで呼び出される間隔の指定、そしてsetRecordPositionUpdateListenerでリスナーを設定することでreadを行った際に一定間隔でコールバック関数が呼ぶように設定することができます。コールバック関数内で再度readを呼びだしたり、他の処理を記載することで継続的に録音を行うことや決められた処理を実行することができます。
今回起きた現象としては、setPositionNotificationPeriod、setRecordPositionUpdateListenerを設定したのにも関わらずコールバック関数が呼ばれないという現象でした。
# 原因
録音したデータを格納する変数の型とAudioRecordのaudio dataのencodingの型が一致していなかったため、コールバック関数が呼ばれなくなっていましたのが原因でした。エラーも出力されておらず原因を特定するのに時間がかかってしまいました…
Android developersの[AudioRecordのreadの説明](https://developer.android.com/reference/android/media/AudioRecord.html#read(byte[],%20int,%20int))を見てみるとここに説明が記載されていました。

> Reads audio data from the audio hardware for recording into a byte array. The format specified in the AudioRecord constructor should be AudioFormat.ENCODING_PCM_8BIT to correspond to the data in the array.

readの第一引数にbyte配列を指定する場合には、AudioRecordのコンストラクタにてAudioFormat.ENCODING_PCM_8BITを指定する必要がありました。しかし、私はここでAudioFormat.ENCODING_PCM_16BITを指定してしまっていたためコールバック関数が呼ばれなくなってしまいました。
正しくはbyteかつAudioFormat.ENCODING_PCM_8BIT、もしくはshort[]かつAudioFormat.ENCODING_PCM_16BITにする必要がありました。これを設定することでコールバック関数が呼ばれるようになりました。

他にも同じような現象が起きていないか調べてみたところ、コールバック関数の呼び出し間隔の設定が正しくないと同じようにコールバック関数の呼び出しに問題が発生するようでした。

# まとめ
AudioRecordの設定をしっかりと確認するのが一番と学びました。
AudioRecordは特に設定する個所が多く混乱が起きやすかったので、より注意深く確認することが大事と学びました。
（今回、録音と再生を行おうとしたので、さらに設定が増えてしまい、混乱してしまっていました…反省…）
コンパイル時もしくは実行時にエラーが出力されることの偉大さに今回の件でひしひしと感じました。
プログラミング学習記録4〜やる気復活〜

##今日やったこと

- Progate Ruby1~3 そのまま復習
- Progate Ruby4　リセット復習
- Progate Ruby5 リセット復習

100DaysOfCodeのDay4です。

やってることはそんなに大したことないですが、やる気が戻ったのでよかったです。

毎朝、毎晩一回ずつノートを広げて自分と向き合い、自問自答をすることで進むべき道を確認し、モチベーションを戻す方法が自分にはあっているようです。

どうしてもプログラミングの学習はすぐに効果が出るものが少なく、学習している最中は「出口の見えないトンネル」にいるような気分になります。

しかし、学習する意志・目的を確認することで少しは明るい気分になれるので、この確認作業は大事なことだと思います。

そして、学習過程をQiitaやブログに投稿すれば、今後同じ道を歩む人たちの為にもなるでしょう。


多くの人は、未熟な自分を見せるのは恥ずかしいという思いから、学習過程を公開することをためらうと思います。

私自身もその気持ちがなくはないのですが、若さが魅力という言葉があるように（ないかも）、未熟さもまた魅力だと思っています。

上級者には出せない魅力です。

なので、これからも未熟さをどんどん出しつつ、最低限過去の自分には役に立つような記録を残していきます。


プログラミングのことはほぼ書いていない記事になりましたが、何をするにしてもやはり内側の部分（マインド）が大事なので自戒の意味も込めて、今回このような記事を書きました。

明日からも引き続きプログラミングの勉強を頑張りたいと思います。

おわり
Ubuntu14.04にAtom+Hydrogenを入れる

# 環境
- Ubuntu 14.04(LTS)
- Atom 1.34.0
- Python 3.6.8 (Anaconda3-5.3.1)

# Atomのインストール
公式サイトからdebファイルをダウンロード
https://atom.io/download/deb
(最新版は1.34.0)
ダウンロードしたディレクトリへ移動してインストール

```bash
sudo dpkg -i atom-amd64.deb
```

# Hydrogenのインストール
HydrogenとはAtomのパッケージの1つで、Atom上でJupyter Notebook的なことを実現するものです。
1. Atomを起動しSettingsを開く
2. Installから `Hydrogen` を検索しInstall
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251371/fbfb5153-605b-c24b-580b-fd71089342fd.png)
おすすめのパッケージの1番上に出てますね。
（日本語化してありますが、 `japanese-menu` をインストールするとをインストールするとできます。）

# Hydrogenの設定
通常であればインストールすると使えるようになるそうですが、
私の環境では動かなかったのでその対応を記します。

１. Jupyter Notebookにpython3 Kernelを追加

```bash
python3 -m ipykernel install --user
```

２. Atomにkernelspecを登録
ターミナル上で

```bash
jupyter kernelspec list --json
```
出てきた結果をコピー
ちなみにこんな出力がきます

```json
{
  "kernelspecs": {
    "python3": {
      "resource_dir": "/home/USERNAME/.pyenv/versions/anaconda3-5.3.1/share/jupyter/kernels/python3",
      "spec": {
        "argv": [
          "/home/USERNAME/.pyenv/versions/anaconda3-5.3.1/bin/python",
          "-m",
          "ipykernel_launcher",
          "-f",
          "{connection_file}"
        ],
        "env": {},
        "display_name": "Python 3",
        "language": "python",
        "interrupt_mode": "signal",
        "metadata": {}
      }
    }
  }
}
```
**Atomを `開発モード` で起動します**（重要）

```bash
atom . --dev
```

設定を開き、Hydrogenの設定を開きます
下の方にある `Startup Code` のところに先ほどコピーしたものを貼り付けます（開発モードでAtomを開かないと出てこない）
ちなみに、他のサイトではkernel Specに貼り付けるとあったが、存在しなかった
これでkernelspecを指定できました


３. Atomを再起動
QuickSort in C, C++, Java & Python

Source: https://www.interviewbit.com/tutorial/quicksort-algorithm/

    # include <stdio.h>

// to swap two numbers
void swap(int* a, int* b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

int partition (int arr[], int low, int high)
{
    int pivot = arr[high];  // selecting last element as pivot
    int i = (low - 1);  // index of smaller element
 
    for (int j = low; j <= high- 1; j++)
    {
        // If the current element is smaller than or equal to pivot
        if (arr[j] <= pivot)
        {
            i++;    // increment index of smaller element
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[high]);
    return (i + 1);
}
/*  
    a[] is the array, p is starting index, that is 0, 
    and r is the last index of array.  
*/
void quicksort(int a[], int p, int r)    
{
    if(p < r)
    {
        int q;
        q = partition(a, p, r);
        quicksort(a, p, q-1);
        quicksort(a, q+1, r);
    }
}


// function to print the array
void printArray(int a[], int size)
{
    int i;
    for (i=0; i < size; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
}

int main()
{
    int arr[] = {9, 7, 5, 11, 12, 2, 14, 3, 10, 6};
    int n = sizeof(arr)/sizeof(arr[0]);
    
    // call quickSort function
    quicksort(arr, 0, n-1);
    
    printf("Sorted array: \n");
    printArray(arr, n);
    return 0;
}
【Wordpress】ある固定ページをブログ記事一覧ページにする

<h3>静的ページで構成されるサイトで、あるページを投稿記事一覧ページにする方法</h3>


1. まずは記事一覧ページを作成。今回はデフォルトの「ブログー投稿ページ」からInformationというページを作成しました。パーマリンクは`information`にしてます。
<img width="1271" alt="wp1.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/0f69a0eb-3d77-e3ac-33c9-b6f3740e3ecd.png">

2. 設定ー表示設定にて。`固定ページ`を選択し、投稿ページに`Information`を指定する。
<img width="1270" alt="wp2.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/e9e2c2d3-d8de-b4b3-3e1b-903570590729.png">

3. 設定ーパーマリンク設定にて。カスタム構造を選択し、`information/%category%/%postname%`を記述する。
<img width="1361" alt="wp3.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/3bcf0c73-b748-4555-fdd6-cdf3ab9cc058.png">
Linux (Ubuntu) 環境でサービスアカウントからgsutilを利用する

Dockerfileなどのスクリプトで `gsutil` を実行したい時があったので。
環境変数 `GOOGLE_APPLICATION_CREDENTIALS` にサービスアカウントキーファイルをセットすればいいかと思いきや、それだけでは

```
ServiceException: 401 Anonymous caller
does not havestorage.objects.list access to bucket
```

のようなエラーが出てしまう。

# 結論
https://cloud.google.com/storage/docs/gsutil_install?hl=ja#deb を参考にする。

```bash
$ export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)" && \
    echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | \
    sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \
    sudo apt-key add - && \
    sudo apt-get -y update && \
    sudo apt-get -y install google-cloud-sdk && \
    gcloud auth activate-service-account \
    --key-file=/path/to/service_account/key_file.json
```

最後の

```bash
gcloud auth activate-service-account \
--key-file=/path/to/service_account/key_file.json
```

がミソ。 ドキュメントの通りに `gcloud init` とすると、ログイン操作が必要になってしまいスクリプトでは実行できない。
PHP: Null合体代入演算子(??=)の使い所を考えてみた

Null合体演算子`??`の代入版である[Null合体代入演算子]`??=`がPHP7.4で導入されることになった。

```php
// PHP7.3以前
$a = $a ?? $b;

// PHP7.4以降
$a ??= $b;
```

Null合体演算子`??`が導入されたのはPHP7.0で結構前のできごとで、よく使う人もいれば、使いみちが見つからないという感想を持っている人もいそうだ。

そこに来て、Null合体代入演算子`??=`が追加されるニュースが出たので、ますます「それどこに使うの？」と感じる人も出てきそうだ。

僕がぱっと思いつく限りでは、`??=`の使い所はデフォルト引数だと思う。以前、[PHP7からは引数デフォルト値にはNull合体演算子｢??｣を使うと良い - Qiita](https://qiita.com/suin/items/b333dcc22f820eb1eed1)という投稿をした。この投稿の内容は、引数の値に`null`を渡したら関数のほうで定義したデフォルト値が使われるような関数を作るときは、`??`演算子を使うと良いというものだった。

```php
// PHP7.1〜PHP7.3の書き方
function f(?int $x = null, ?int $y = null, ?int $z = null): void
{
	$x = $x ?? 1;
	$y = $y ?? 2;
	$z = $z ?? 3;
	echo "$x, $y, $z\n";
}

f(); //=> 1, 2, 3
f(null, null, 9); //=> 1, 2, 9
```

Null合体代入演算子`??=`が導入されれば、こうした関数の実装はもう少しシンプルに書くことができるようになる。

```php
function f(?int $x = null, ?int $y = null, ?int $z = null): void
{
	$x ??= 1;
	$y ??= 2;
	$z ??= 3;
	echo "$x, $y, $z\n";
}
```

ちょっとした改善ということで`??=`が加わることも個人的には嬉しく感じる。

他にもこんな実用法あるよ、などあれば教えて下さい。

## 所感

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">引数にnullを渡すのって、nullを渡したいというより、その引数を省略したいだけだから、??とか??=を使ったイディオムが増えるより、こういう書き方ができるようになるのがPHPerにとってはいいんでしょうけど。 <a href="https://t.co/txJyDPpiwY">pic.twitter.com/txJyDPpiwY</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1098150891041898498?ref_src=twsrc%5Etfw">2019年2月20日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



[Null合体代入演算子]: https://wiki.php.net/rfc/null_coalesce_equal_operator
PHPの配列をSQLのWHERE句で指定

## タイトルの通りPHPの配列をSQLのWHERE句で指定できる形に成型

以下の形でSQLを実行したい。

```sql:sql
SELECT * FROM test WHERE id IN ("A001", "A002, "A003");
```

phpで配列形式になっているidを上記SQLの形に成型したい。
以下で、できた。

`implode` の第一引数の`', '`をつなぎ文字として、第二引数の`$ids`の要素をつなぎ合わせて成型。

```php:php
$ids = array("A001", "A002", "A003");
if ($ids) {
    $whereIds = "AND id IN ('".implode("', '", $ids)."')";
} else {
    $whereIds = "";
}

$sql = "
        SELECT * FROM
            tset
        WHERE 1=1
        {$whereIds}
";
```

使用しているDBがPostgresSQLなので、従来使用していたMySQLとクォーテーションの扱いが変わり、
文字列はシングルクォーテーションで囲むことになっているので以下ではダメ

```php:php
'AND id IN("'.implode('","',$ids).'")'; // PostgresSQLだと構文NG
```

意外と同じSQLだと思って甘く見てたらちょこちょこ相違点があることに気づいた日でした。
Apple Storeにあるアプリの短縮URLとアップデート申請のリジェクト内容

## 短縮URLの入手方法
[App Store公開前にアプリURLを知る方法](https://qiita.com/akatsuki174/items/92bcf53d04a77cf293c0)を参考にして
公開前にアプリURLを取得しようとしたけど、APP情報の追加情報に「App Storeで表示」というボタンが表示されず、公開した後に「Appで表示」というボタンが現れました。

現在はAppleID(アプリ用に自動生成される）を使って以下のURL規則でアクセスできるようです。このAppleIDはiTunes ConnectのApp情報で確認できます。

<img width="433" alt="スクリーンショット 2019-02-13 12.02.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/117549/af37de24-e1d1-bbb5-9401-f52958a2eafe.png">

`https://itunes.apple.com/国コード(jpやenなど）/app/idAppleID`

私の場合のURL
[`https://itunes.apple.com/jp/app/id1451475254`](https://itunes.apple.com/jp/app/id1451475254)


## 2回目のアップデート申請でリジェクトされる
1度アップルストアに申請が通れば、アップデートは割と早く公開されるという勝手な偏見があったんですが、見事にリジェクトされました。1回目の申請の時とほとんど変更を加えておらず、変更したのはデザインの更新と少しの不具合修正程度。Appleから以下の内容のメールが届いていました。

>We noticed that your app requires users to register with personal information that is not directly relevant to your app’s core functionality. Specifically, the following fields are required but do not appear to be directly relevant to your app’s core functionality:

>Age
Gender

>Next Steps

>To resolve this issue, please either remove all required fields that are not relevant to the app or make those fields optional. Information requested during registration must be relevant to the features the app provides.


>Please see attached screenshot for details.

アンケートフォームに年齢と性別の入力欄があるのですが、これを選択しないと次に進めないように変更したのが原因のようです。1回目の申請では未入力でも先に進めるようにしていたため、申請が通ったのでしょう。性差別やプライバシーを考慮してのことだと思います。選択をオプショナルにしてからアップデート申請したら無事に通りました。

今はApple Storeの審査も早くなっていて今回の審査も初回もアップデート申請もだいたい12時間程で結果が返ってきてますね。
高橋君とカード

-  [高橋君とカード / Tak and Cards](https://atcoder.jp/contests/abc044/tasks/arc060_a)

## 考察

- DFSで全探索すると$O(2^N)$で間に合わない
- 貪欲だと厳しいかな…?普通に無理そう
- とりあえず全探索を書いてみる
- 最終的には平均値を求めるわけだが、これがちょっと複雑。小数点とか出てきそうだし。最終的に選んだカードの枚数を$m$枚とすると、平均の式は$\frac{m枚の合計}{m枚} = A$とすることができる。これを式変形すると、$m枚の合計 = A\times m枚$にできる。つまり、最終的に選んだカードの枚数とその合計がわかればそれがAになるかがわかる（後で気づいたけど、式変形とかなくても解けるな。この問題）
- これまでの情報で、`rec(インデックス, 選んだ枚数, 合計) = 総数`って感じの関数でDFSを実装すればいいことがわかる。あとは、遷移を考えて頑張って実装する。
- 実装したら、正しく動くか確認する。サンプルと合わせた結果、出力された数値は答えより1大きくなってる。答えから1を引いて提出してもいいけど、なんか気持ち悪いのでデバッグしてみる。すると、選んだ枚数が0枚の時も平均値がAであるという結果を返すコードになっていた。なので、選んだ枚数が0枚の時の処理も書く。
- [コード](https://atcoder.jp/contests/abc044/submissions/4329375)をみると、メモ化再帰にできそうなのでそうする。
- 終了



## [コード](https://atcoder.jp/contests/abc044/submissions/4329172)

- 暇なので[ループDP](https://atcoder.jp/contests/abc044/submissions/4329427)でも実装してみた。

```cpp
#include <bits/stdc++.h>
using namespace std;

#define int long long

int N, A;
vector<int> x;
int dp[55][55][2555]; // dp[インデックス][枚数][合計] = 総数

int rec(int idx, int mai, int sum) {
  // 全部調べ終わる
  if (idx >= N) {
    return ((mai * A) == sum) && (sum != 0);
  }

  // 計算済み
  if (dp[idx][mai][sum] != -1) {
    return dp[idx][mai][sum];
  }

  int ret = 0;

  // index枚目のカードを選ぶ
  int yes = rec(idx + 1, mai + 1, sum + x[idx]);
  // index枚目のカードを選ばない
  int no = rec(idx + 1, mai, sum);

  ret += yes + no;

  return dp[idx][mai][sum] = ret;
}

signed main() {
  cin >> N >> A;
  x.resize(N);
  for (int i = 0; i < N; i++) {
    cin >> x[i];
  }

  memset(dp, -1, sizeof(dp));
  int ans = rec(0, 0, 0);

  cout << ans << endl;

  return 0;
}
```





## もうちょい計算量を減らす

- なんと[解説PDF](http://arc060.contest.atcoder.jp/data/arc/060/editorial.pdf)では2次元DPで解説されてる。何それ怖い。
- まあ、この考察がいつか使えるかもしれないので考えてみる
- さっきの考察で、$ A\times m枚 = m枚の合計$という式を作った。これは、mの枚数とm枚の合計がわかっているときに平均がAになるかを判定するのに使った式ね。この式が正しければ平均をAにすることができる（これ大事）
- ここで、選ぶと平均値がAになるようなカードの集合を$Y$とする。
- そして、$ A\times m枚 = m枚の合計$と言う式をシグマの式に変形すると$\sum_{i \in Y}^{|Y|}A = \sum_{i \in Y}^{|Y|}x_i$となる（$|Y|$は集合Yの中身の個数みたいな意味で使ってる）
- さらに式変形すると$\sum_{i \in Y}^{|Y|}(x_i - A) = 0$となる。これは選ぶ全カードからAを引いたときのカードの総和が0になることを意味している。先ほどと同様にこの式が正しい時、平均をAにすることができる。
- この式を見ると、枚数を考えなくていいことがわかる。なので、DPの次元が1つ減って計算量も減る。



### 解法

1. あらかじめ全カードの値からAを引いておく。
2. DPする



- [コード](https://atcoder.jp/contests/abc044/submissions/4329820)



## 感想

- 1年くらい前に[この記事](https://qiita.com/nomikura/items/3fc15341062c8247f1f8)で解説を書いた問題。当時はあんまり理解してなかったけど今ではすんなり解けたので嬉しい（DPで解くことがわかってたからすんなり解けたってのもあるけど）
- Aを引いておくことで合計が0になっていればOKってやつ、式変形すると正しいことはわかる。でも、直感的に理解できない。わかるようなわからないようなふわふわした感じになる。
- あと、このDPの次元減らすやつを思いつける気がしない。式変形思いつくしかないのか？
ReactiveProperty導入後のエラー対処方法

##パッケージ ReactiveProperty 導入時エラーへの対処方法
下記環境でプログラムを作っていたところ、エラーに遭遇したのでその対処方法と備忘録。
既出でも大目に見て下さい。

###開発環境
- Visual Studio 2017
- .NetFrameWork 4.6.1
- 言語はVB(C#でも同じエラーが出るらしい)
- ReactiveProperty

###エラー内容
パッケージReactivePropertyをインストールして作業をしていたところ、下記のようなエラーが発生しました。
`BC30652 型'[Object]'を含むアセンブリ'netstandard,Version=2.0.0.0,Culture=neutral,PublickeyToken=cc7b13ffcd2ddd51'への参照が必要です。参照をプロジェクトに追加してください。`
![ReactivePropertyのエラー.png](https://qiita-image-store.s3.amazonaws.com/0/61364/81b54560-b188-2a1c-8e7c-5aba8c10220d.png)

「netstandardのVersion2.0.0.0が参照できません。参照を追加してください」ってことでしょうか。
なんちゃってエンジニアな私には詳しいことは分かりませんが、対処法が下記にサイトに載っていました。

>引用元: https://github.com/dotnet/standard/issues/542
>I managed to fix this problem by adding to csproj file with the references:

>```
><Reference Include="netstandard" />
>```

「プロジェクトファイル(VBの場合は拡張子が.vbproj)内に`<Reference Include="netstandard" />`を記述すると解決するよ」らしいです。
回答者さん、ありがとうございます。

早速、プロジェクトフォルダを開いて、○○○.vbprojを適当なエディターで開いて、`<Reference Include="○○○"/>`って記述されている`<ItemGroup></ItemGroup>`内に言われた通りに記述します。
![ReactivePropertyのエラー2.png](https://qiita-image-store.s3.amazonaws.com/0/61364/b12ec44a-5345-eb2f-f0fc-3b9169e8c037.png)

上書き保存をしたら、Visual Studioに戻って、
![ReactivePropertyのエラー3.png](https://qiita-image-store.s3.amazonaws.com/0/61364/a5b818e5-7514-900f-7a04-2e06a0cfa6f9.png)
再読み込み。
以上で解決しました。

##参考文献&引用元
文章中で参考にさせて頂いた文献及び引用元の一覧です。
-『You must add a reference to assembly netstandard errors』(github内フォーラム)
　URL：https://github.com/dotnet/standard/issues/542
Word2016 for Mac 目次の英字を全て大文字・小文字にさせない方法

##やりたいこと
表題の通り、Macのwordで目次が勝手に大文字、小文字のみになる設定を止めてやります！
調べたら意外となかったので、共有です。

## 方法
まずは参照設定タブの「目次」からプルダウンし、「ユーザ設定の目次」をクリック
<img width="407" alt="スクリーンショット 2019-02-20 17.42.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/260257/eece14f3-ea55-d0a7-d413-25d5a9ad1ebd.png">

「変更」をクリック
<img width="543" alt="スクリーンショット 2019-02-20 17.43.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/260257/dbc9ca4e-4afd-a5f9-29fa-824930c6ff6d.png">

「変更」をクリック
<img width="813" alt="スクリーンショット 2019-02-20 17.43.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/260257/012f4004-fa97-5450-60f7-b993bb90b34c.png">

「書式」のプルダウンから「フォント」を選択
<img width="640" alt="スクリーンショット 2019-02-20 17.44.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/260257/c3e8834e-3262-c425-dc0e-7d57515893e3.png">

「文字飾り」のチェックボックスを消してやります！
<img width="627" alt="スクリーンショット 2019-02-20 17.44.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/260257/4952bfa0-eb11-d657-7cc2-58e213c96551.png">

完了！
どんだけポップアップするんだ
Nuxt.jsとCloudFront + S3 hosting

こちらの記事を読んで
[Nuxt.jsとContentfulでモダンなブログを構築してみた](https://qiita.com/hareku/items/acd9dfe5d77293a4a6d9)

自分のケースを書いて置きたいと思いました。

# CloudFront + S3構成について

自分はLambda@Edgeは設定していないです。

index.htmlとか、サブURLの処理のため、Lambda@Edgeの利用でなく、
CloudfrontのError Pagesに、400, 403, 404のResponse Page Path を /に、HTTP Response Codeを200に設定しています。

<img width="1025" alt="cloudfront_for_s3_hosting.png" src="https://qiita-image-store.s3.amazonaws.com/0/19606/93b722a7-97e4-7a44-8e01-f565cdcdcec3.png">

一つ短所としては、cloudfrontにWAFを連携しいる場合。
WAFによって403になってもindex.htmlだけ読み込まれるので、
テスト環境では Error Pagesの403設定は外しています。
もしくは、テスト環境でアクセス制限のために Lambda@Edgeを利用しています。

以前からこの設定をやっていましたが、
最近 AWS AmplifyのHostingの作ったCloudFront + s3のhosting環境の同じ設定でした。
なので、**awsのお墨付き方法**だと思います。

# デプロイ
aws codebuildの設定fileの一部です。

```buildspec.yml
      - npm run generate
      - aws s3 cp dist s3://$S3_BUCKETNAME --recursive
      - aws cloudfront create-invalidation --distribution-id $CLOUDFRONT_DISTRIBUTION_ID --paths '/*'
```

これだけにしています。
これだけでも、デプロイ中にサイトがエラーになることはないかと思います。

なぜなら、CloudfrontでObject cacheをしていからです。
（もし、静的コンテンツをObject cacheをせずに TTLを全部０にしている場合はエラーになるでしょう）

Nuxtでbuildした場合、js filenameはdefault設定でhashになっていて、そのhash filenameはindex.htmlに記録されています。
なので、fileを削除しなければdeploy中でもエラーになったりはしないです。
また、index.html,jsともにcloudfrontによってcacheされているので、削除したとしても大抵の場合は大丈夫です。（一度も呼ばれてないfileをdeployタイミングで呼ばれたらエラーになる可能性はあります。）

また、このデプロイ方法も AWS AmplifyのHostingで `amplify publish`でやっている方法と同じです。
なので、**awsのお墨付き方法**だと思います。

# デプロイでAmplify cliを使うのはだめなのか？

どのみち、cloudfront + s3を利用するなら、amplifyでしたくなります。

私もそうでしたので

やってみましたが、まだ現時点（2019/02/20）では、
amplify hostingを amplify cliはci/cdは完全ではない感じでした。

最近、amplify cliもupdateされて、multiple envとheadless optionができているが、
結局まだ足りない部分があったり、
むしろ上のbuildspec.ymlの3行より複雑になるので、ci/cdではamplify cliを使わずに利用しています。
bitcoin: 何为燃烧地址

>![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/214d2fdb-1ed9-991e-0675-67ce37748f1f.jpeg)

如果你观察过很多的比特币地址，隐隐会发现有些规律：长度很多是`34`位，好多是`1` `3` 开头的，字母排列杂乱无章。

以下都是合法的地址：

```
3MWqbpfzxgojEAah6PMZoZPdUPUTuyTpan
1EdBvVAVP98zUsz2n8Pereop29y9fUFk2i
3Cbq7aT1tY8kMxWLbitaG7yT6bPbKChq64
3Nxwenay9Z8Lc9JBiywExpnEFiLp6Afp8v
18tTLso5jaa4XqyTQzo9S6mqhfCsgcufdh
1FeexV6bAHb8ybZjqQMjJrcCrHGW9sb6uF
1HQ3Go3ggs8pFnXuHVHRytPCq5fGG8Hbhx
1PnMfRF2enSZnR6JSexxBHuQnxG8Vo5FVK
3Kzh9qAqVWQhEsfQz7zEQL1EuSx5tyNLNS
1EBHA1ckUWzNKN7BMfDwGTx6GKEbADUozX
1LdRcdxfbSnmCYYNdeYpUnztiYzVfBEQeC
...

```

`34`位的长度是绝对的么，有特例么？还真找到一个地址 [1111111111111111111114oLvT2](https://blockchair.com/bitcoin/address/1111111111111111111114oLvT2)，长度只有`27`位，而且这么多的`1`，感觉很优雅。一般比特币地址的长度是`34`位，也有`33`位，最短的应该是`26`位。

## 燃烧地址

1111111111111111111114oLvT2 还有特殊的地方，看 ta 的交易，只有输入，没有输出，只进不出。咋这抠门呢，这是个貔貅啊。

看下第一笔交易[2c637592a4b4a95cf4b19260730c66de540d7d3b14d8d352de591c5ee6eac0fc](https://blockchair.com/bitcoin/transaction/2c637592a4b4a95cf4b19260730c66de540d7d3b14d8d352de591c5ee6eac0fc)，
输出脚本是 `OP_DUP OP_HASH160 0000000000000000000000000000000000000000 OP_EQUALVERIFY OP_CHECKSIG`

>![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/e4531a80-f3e0-d4f8-689c-03119d0d4d97.png)

我们把 `0000000000000000000000000000000000000000` 叫做 hash160，hash160 可以转换为比特币地址。
你可以认为：**比特币地址就是对 hash160 的简化，比特币地址是对人更友好的一种表现方式**，就像语法糖一样。

>![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169726/bf4db0f7-7a05-4c28-802f-63f395405d90.png)
> 比特币地址的正常推导过程是：`私钥 ==> 公钥 ==> Hash160 <==> 地址`

输出脚本是啥？我们经常说，谁有比特币地址的私钥谁就能花费这些币，**私钥相当于钥匙，输出脚本相当于锁**，你把私钥放入输出脚本中，组成一个**完整的脚本**，
执行输出脚本，是私钥转化为 Hash160 的过程。如果与脚本里提前写好的 Hash160 一致，最后的输出结果就是 `True`，你可以花费这些币了。

Hash160 就是没有规则的字符串，我们可以提供个任意的值，从**半截腰**上推导地址：`Hash160 <==> 地址`。1111111111111111111114oLvT2 很明显就是这种情况，ta 的 hash160 全是`0`，这显然是特意拼凑的，既然从半截腰推导出来的，自然没人知道私钥。
由于整体运算过程的不可逆性，我们无法推算出这个地址的私钥，既然不知道私钥，就无法动用币，只能进不能出，成了一个“废地址”，也叫燃烧地址，即 `burn address`，像燃料一样烧没了。具体请看 https://qiita.com/shooter/items/1383ff1bcc8f1c97c53b

## 为什么还要向燃烧地址发送交易呢
- 减少币的流通量
- 土豪的心思不要猜

## 生成个燃烧地址

设定 `hash160 = 1111111111111111111111111111111111111111`，最终得到地址`12ZEw5Hcv1hTb6YUQJ69y1V7uhcoDz92PH`。
也有人打过币了，具体请看 https://qiita.com/shooter/items/1383ff1bcc8f1c97c53b

## 安全提示

```
强烈建议不要自己生成 addres
强烈建议不要自己生成 addres
强烈建议不要自己生成 addres

请用信赖的工具来做这事
如果地址计算错误，这个私钥并不能解开你的地址，相当于币丢了。
```

《Mastering Bitcoin》已经给了我们一个[大教训](https://github.com/bitcoinbook/bitcoinbook/pull/483)。
TOEIC285学生のためのXcodeエラー備忘録

<h1>Could not launchi "ふにゃらら"</h1>
間違っても、コールドノットローソンと読んではならない。
固まらなかったローソンではない、**ふにゃららのローンチができませんでした**という意味である。

【Could】クッドゥ・・・～することができた
【not】ノット・・・否定（反転）
【launchi】ローンチ・・・立ち上げ、公開、起動、発進

さて、エラーの詳細には下記が記されている

**Verify the Developer App certificate for your account is trusted on your device.
Open Settings on ほにゃらら and navigate to General -> 
Device Management, then select your Developer App certificate to trust it.**

べりふぃーざでヴぇろぺああぷぷせあちふぃかてふぉぁようああこうんといずてぃるすてどおんようあでヴぃせ.
おぺんせっちんぐすおんほにゃららあんどなヴぃがてとげねらる -> でヴぃせまなげめんと,ぜんせぇくとようあでヴぇろぺああぷぷせあちふぃかてとつるすといっと.....明らかに読めてない


**あなたのアカウントの開発者アプリ証明書があなたの端末で信頼されていることを確認してください。
ほにゃららの「設定」を開き、「一般」 - >に移動します。
デバイス管理をタップし、それを信頼するためにあなたの開発者アプリ証明書を選択してください。**

つまり実機側で開発アプリに対して信頼されてないので信頼できるアプリだという設定をしてやればいい。
iPhoneを起動＞設定（歯車のアイコン）＞一般＞デバイス管理＞開発者のアカウント＞信頼、これでこのエラーは消える、恐らく。

【Verify】ベァファイ・・・確認する
【the】ザ・・・～の
【Developer】デベロパ・・・開発者
【App】アプリ・・・アプリ
【certificate】セーティフィケート・・・証明書
【for】フォァ・・・～にとって、～あての
【your】ユァ・・・あなたの
【account】アカウント・・・アカウント
【is】イズ・・・Be動詞（ってなんやねんって方は自分で調べてください）
【trusted】トラステッド・・・信頼できる（本当に？）
【on】オン・・・～に、～で
【device】デバイス・・・装置、端末
【Open】オープン・・・開いた、開く
【Settings】セティングス・・・設定
【and】アンド・・・～と
【navigate】ナビゲート・・・操作する、操縦する
【to】トゥー・・・に（トゥートゥートゥマシェリーマーシェーリではない）
「シェリーに口づけ」はそもそもフランス語であるし綴りもTout, toutである、AAは環境によって型崩れが激しいからヤメロオオオ

　　　　　　　　トゥートゥートゥマシェリーマーシェーリ
.　　　+　　　 ／■＼　　／■＼　　 ／■＼　　　／■＼
　　　　　　（　´∀｀∩（´∀｀∩）（　´∀｀）（´∀｀　）
　+　　（(　（つ　　　ノ（つ　　丿（つ　　つ⊂　⊂丿+
　　　　　　 ヽ　 （　ﾉ　（　ヽノ　　）　）　）　（　（　（
　　　　　　 （＿）し'　し（＿）　（＿）＿）　（＿（＿）

あ、ちなみにおにぎりは英語で【Rice ball】ライスボールである。
【Management】マネジメント・・・管理
【then】デン・・・それから
【select】セレクト・・・選択
【trust】トラスト・・・信頼

Trust me.Trust me.Trust me.Trust me.
I really wanna be with you.
Trust me Trust me Trust me Yeah!!
って歌詞の曲がありましたがあれはつまり私を信頼して（私を信じて）ってことですね。
間違えても　目を信頼して　ではないので英語が苦手な人は注意しよう

さて、自分用に書いたエラーについての備忘録でしたがだいぶ脱線してしまいました。
将来ＡＲやＧＰＳを用いたアプリ開発ができる会社に就職できるように就活を続けていきたいと思います。
ここまでお読みいただきありがとうございました。
Kotlinで時間を選ぶPickerを扱う

このようなTimePickerのDialogを作る。
![IMG_3532.JPG](https://qiita-image-store.s3.amazonaws.com/0/364014/2918378a-073e-8013-4c73-b42320ee2a13.jpeg)

---
DialogなのでDialogfragmentとかく。

```kotlin

class TimePicker: DialogFragment(), TimePickerDialog.OnTimeSetListener {

private var listener : onTimeSetListener? = null
````

```kotlin
override fun onAttach(context: Context) {
    super.onAttach(context)
    if (context is onTimeSetListener) {
        listener = context
    } else {
        throw RuntimeException(context.toString() + " must implement OnFragmentInteractionListener")
    }
}

override fun onDetach() {
    super.onDetach()
    listener = null
}
```
---
現在時刻を取得する。

```kotlin
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    super.onCreate(savedInstanceState)

    val calender = Calendar.getInstance()
    val hour = calender.get(Calendar.HOUR)
    val minute = calender.get(Calendar.MINUTE)

    return TimePickerDialog(activity, this, hour, minute, true)
}
```
---
選択した時刻を取得し、任意のSimpleDateFormatで表す。
選択していない年、月、日はゼロを設定する。

```kotlin

private fun getTimeString(hourOfDay: Int, minute: Int): String{
    val calendar = Calendar.getInstance()
    calendar.set(0,0,0,hourOfDay,minute)
    return SimpleDateFormat("HH : mm").format(calendar.time)
}
```
---
先ほど取得した時刻を元のActivityに返す。

```kotlin
override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) {

    val time = getTimeString(hourOfDay,minute)
    listener?.onSelected(time)
    // onSelected は返すための関数。後述
}
```
---
Dialogを閉じる。

```kotlin
fragmentManager!!.beginTransaction().remove(this).commit()
```
---
interfaceをかく。

```kotlin
interface onTimeSetListener{
    fun onSelected(time: String)
}
```

---
元のActivityに以下の二つを書く。
classのところ↓

```kotlin
TimePicker.onTimeSetListener
```
Pickerで取得した時刻を得るため↓

```kotlin
override fun onSelected(time: String) {
}
```

---
###DatePickerの場合
上述のonCreateDialog, getDateString, onDateSetを下のように書き換える。

```kotlin
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    super.onCreate(savedInstanceState)

    val calender = Calendar.getInstance()
    val year = calender.get(Calendar.YEAR)
    val month = calender.get(Calendar.MONTH)
    val day = calender.get(Calendar.DAY_OF_MONTH)

    return DatePickerDialog(activity, this, year, month, day)
}

private fun getDateString(year: Int, month: Int, day: Int):String{
    val calendar = Calendar.getInstance()
    calendar.set(year, month, day)
    return SimpleDateFormat("yyyy / MM / dd EEE")
.format(calendar.time)
}

override fun onDateSet(datePicker: DatePicker?, year: Int, month: Int, day: Int) {
    val date = getDateString(year, month, day)
    listener?.onSelected(date)
}
tsで[Array.includesが存在しません]のエラーが出る

こう型を定義していて、

```
  public sizes: string[];
```

こうかくと

```
this.sizes.includes('35')
```

エラーが出る

```
error TS2339: Property 'includes' does not exist on type 'string[]'.
```

対処方法
https://github.com/Microsoft/TypeScript/issues/2340

tsconfig.jsonのlibを以下のようにすれば直った。

```
    "lib": [
      "dom",
      "es7"
    ],
```
Laravel チートシート メール 編

#Mailableを作らず、サクッと送る
```php5

    Mail::send('emails.user_reset_passowrd', compact('user_data'),
        function($message) use ($user_data) {
            $message->to($user_data['email'])
                    ->bcc(env('MAIL_ADMIN'))
                    ->subject("パスワード再設定URL");
        }
    );
```
#Mailableを作る場合 - php artisan
```php5
    php artisan make:mail UserResetPassword
```
Project EulerをHaskellで解いていく(Problem6: Sum square difference)

# TL;DR
Haskellの勉強を兼ねてProject Eulerを解いていきます。
始めたばかりでわからないことが多いのでコメント頂けると嬉しいです。

# 問題文
>The sum of the squares of the first ten natural numbers is,

>```math
 1^2+2^2+3^2+...+10^2 = 385
```
>The square of the sum of the first ten natural numbers is,

>```math
 (1+2+3...+10)^2 = 3025
```
>Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 − 385 = 2640.
Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.

<br>

>最初の10個の自然数について, その二乗の和は,

>```math
 1^2+2^2+3^2+...+10^2 = 385
```
>最初の10個の自然数について, その和の二乗は,

>```math
 (1+2+3...+10)^2 = 3025
```
>これらの数の差は 3025 - 385 = 2640 となる.
同様にして, 最初の100個の自然数について二乗の和と和の二乗の差を求めよ.

# コード

```haskell
main::IO()
main = do
  let x1 = sum $ map (^2) [1..100]
  let x2 = sum [1..100] ^ 2
  print $ x2 - x1
```

別回答

```haskell
func1::[Int] -> Int
func1 = sum . map (^2)

func2::[Int] -> Int
func2 = (^2) . sum

func3::[Int] -> Int
func3 = foldr (-) 0 . (\x -> map (\f -> f x) [func2, func1])

main::IO()
main = do
  print $ func3 [1..100]
```
Project EulerをHaskellで解いていく(Problem5: Smallest multiple)

# TL;DR
Haskellの勉強を兼ねてProject Eulerを解いていきます。
始めたばかりでわからないことが多いのでコメント頂けると嬉しいです。

# 問題文
> 2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?

> 2520 は 1 から 10 の数字の全ての整数で割り切れる数字であり, そのような数字の中では最小の値である.
では, 1 から 20 までの整数全てで割り切れる数字の中で最小の正の数はいくらになるか.

# コード

```haskell
isDivisible::Int -> Bool
isDivisible n = all (==True) [n `mod` x == 0 | x <- [11..20]]

main::IO()
main = do
  print $ (2+) $ maximum $ takeWhile (\x -> not $ isDivisible(x)) [x | x <- [2520,2522..]]
```
めちゃくちゃ遅いからどうにかしたい…
Project EulerをHaskellで解いていく(Problem4: Largest palindrome product)

# TL;DR
Haskellの勉強を兼ねてProject Eulerを解いていきます。
始めたばかりでわからないことが多いのでコメント頂けると嬉しいです。

# 問題文
> A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.

> 左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.
では, 3桁の数の積で表される回文数の最大値を求めよ.

# コード

```haskell
isPalindrome::Int -> Bool
isPalindrome n = show n == reverse(show n)

main::IO()
main = do
  print $ maximum [x * y | x <- [100..999], y <- [100..999], isPalindrome(x * y)]
```
Project EulerをHaskellで解いていく(Problem3: Largest prime factor)

# TL;DR
Haskellの勉強を兼ねてProject Eulerを解いていきます。
始めたばかりでわからないことが多いのでコメント頂けると嬉しいです。

# 問題文
> The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?


> 13195 の素因数は 5, 7, 13, 29 である.
600851475143 の素因数のうち最大のものを求めよ.

# コード

```haskell
primes::Int -> [Int]
primes 1 = []
primes n = x : primes (n `div` x)
  where
    factors n = [x | x <- [1..n], n `mod` x == 0]
    x = (factors n) !! 1

gcdPrime::Int -> Int
gcdPrime n = maximum $ primes n

main::IO()
main = do
  print $ gcdPrime 600851475143
```
うーん…なんかもうちょっと良い実装がありそう…
Project EulerをHaskellで解いていく(Problem2: Even Fibonacci numbers)

# TL;DR
Haskellの勉強を兼ねてProject Eulerを解いていきます。
始めたばかりでわからないことが多いのでコメント頂けると嬉しいです。

# 問題文
> Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.


> フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
数列の項の値が400万以下の, 偶数値の項の総和を求めよ.

# コード

```haskell
fib 0 = 0
fib 1 = 1
fib n = fib(n-1) + fib(n-2)

fibList n = takeWhile (<=n) [x | x <- map fib [0..]]
evenList list = filter even list
evenSumFib n = sum $ evenList $ fibList $ n

main::IO()
main = do
  print $ evenSumFib 4000000
```

このコードで約5秒くらい処理時間がかかりました。
高速化するためにメモ化してみようと思いググりながらやって以下のfib関数ができましたが、 (map memo [0..] !!) の!! が理解できずに不採用にしました。

```haskell
fib = (map memo [0..] !!)
  where
    memo 0 = 0
    memo 1 = 1
    memo n = fib(n-1) + fib(n-2)
```
Project EulerをHaskellで解いていく(Problem1: Multiples of 3 and 5)

# TL;DR
Haskellの勉強を兼ねてProject Eulerを解いていきます。
始めたばかりでわからないことが多いのでコメント頂けると嬉しいです。

# 問題文
> If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.

> 10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.

# コード

```haskell
f :: Int -> Int
f 0 = 0
f n
  | n `mod` 3 == 0 = n + f(n-1)
  | n `mod` 5 == 0 = n + f(n-1)
  | otherwise = f(n-1)

main::IO()
main = do
  print $ f(999)
```
Wagbyで画面遷移をカスタムしたい

# 調べた動機
自前で画面遷移をしたかった。
#### Wagbyのバージョン
8.2.0
# サーバサイドの場合
サーバサイドのカスタムポイントであるjavascriptでreturnする文字列を以下のようにすれば画面遷移してくれる。

```test.js
return "redirect:/mainMenu.do?name=" + 画面名 + "&" + アクション名;
```
_redirect_は_forward_にも置き換えられる。
画面名は「処理名(insertなど)＋モデル名」となる。

[スクリプトを使った画面遷移](https://wagby.com/manual8/operation-transition-script.html)に記載がある方法でうまくいかなかったので調べたら、
_mainMenu.do_にすべての遷移が集約されているっぽい。


# フロントの場合
[フロントでの画面遷移](https://wagby.com/manual8/operation-transition-confirmdialog.html)で紹介されている方法がうまくいかなかったので調べた。

_submitNavigationCommand_に渡す引数がwagbyのバージョン8.2.0から変わったらしい。

以下のように引数を設定することで画面遷移できる。

```test.js
submitNavigationCommand(0, 'mainMenu.do?name=' + 画面名 + '&' + アクション名, '', 'null');
```

---

**誰かWagbyで使えるAPI一覧をください**
複数のセグメントからのみsnmpの接続を許可したい場合。

以下のようにcom2secを複数書けばいい。
知らなかった。。

```
#vi /etc/snmpd/snmpd.conf

##       sec.name  source          community
#com2sec local     localhost       COMMUNITY
#com2sec mynetwork NETWORK/24      COMMUNITY
com2sec mynetwork 172.32.40.0/24   public
com2sec mynetwork 127.0.0.0/24   public
```
OkHttp は addHeader だと同じ名前のヘッダを上書きしてくれない


以下、本文には誤りがあります。
https://square.github.io/okhttp/3.x/okhttp/okhttp3/Request.Builder.html
Request.Builder には、header という、メソッドがあり、それだと上書きしてくれるようです。
大変ありがたいコメントにより知ることができました。
ありがとうございます😊

---

まま

詳しくは読んでない
Headers.Builder の持ってる変数が List であることとおれが遭遇した事象だけでそうだと断定した

https://github.com/square/okhttp/blob/d28d2cec21641b61f3d34e05dd52f43a717c2d32/okhttp/src/main/java/okhttp3/Headers.java#L291

そもそも同じ名前のヘッダは仕様として許容されている

https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2

自動でトークンのリフレッシュとかを interceptor で行うような実装していると、ハマることがある

ので、こんな拡張関数で上書きするようにする

```kotlin
  private fun Request.Builder.overwrite(name: String, value: String): Request.Builder {
    return removeHeader(name) // Remove old one
      .addHeader(name, value)
  }
```

よかったですね
29歳未経験新人プログラマがSES業界に飛び込んで最初の(約)2週間を過ごして思ったこと　その1

Qiitaをはじめ様々な場で
「アウトプットの大切さ」について触れられていたので
実践してみることにしました。

　

29歳、新人プログラマです。
今月の頭から、未経験でプログラマとして業界に飛び込んでみた。
所謂SESというやつで、事務所には社長と事務の人と自分だけ。
他の社員はみんな基本客先。

JAVA？マイクラ作ってる言語だっけ？
SQL？なんとなくどこかで聞いたことあるかも？
eclipce？遊戯王カード？
こんなレベルの知識。
※PCは動画見たりゲームやったりで普通には使える

「未経験」と言っても実務で未経験なだけで、
趣味でプログラミングやってます～
とか、
学校で〇〇を製作しました！
とか、割とプログラムに触れたことのある「未経験」な人も多いが、
真の意味での未経験者である。

備忘録と冒頭で述べた「アウトプット」の意味も込めて、
この約2週間で行ったことを書き残していきたいと思う。

　

■初日
会社説明とメール等のセットアップ等で終わった。
特にプログラムに関することはしていない。
会社情報や事前の面談で研修があると聞いていたが、
どうやら授業的なものがある訳でも、傍に先生役の先輩がいるわけでもなく、
簡単な課題を自分で調べて行う完全なる自己学習の模様。
かろうじて日報などで不明な点を聞いたりは出来そうだが、
基本的にはそこも自分で調べて解決する模様。

恐らく、何がわからないのかすらわからないんだろうな･･･
と、初日から不安になる。
しかし、幸いにも金曜日。休日に逃げろ！


■1週目
・月
セットアップ系の続きを少しと、課題の内容を読んでみた。
SQLとかJAVAとかの課題もあったが、
「何言ってるか全然わからないと思うから」とのことで、
まずは「テスト」についての課題を行うことになった。
研修課題には「まずは資料を読めそして単体試験を実施しろ」とあった。
資料を読んでみたが、何言ってるか全然わからなかった。

・火～水
何言ってるか全然わからなかったことを単語単位で調べながら、
試験計画書や試験仕様書をググりながら読み解いていった。
試験計画書の解読に1日半くらいかかった。
エビデンスってなんだよ海老ダンスかよって突っ込みは、
おそらく半数以上が思った事あるのではなかろうか。
他にも知らない単語だらけで、テキストメモ取りながら進めた。
100%理解できて説明できるレベルのものは殆ど(今も)無いけど、
「なんとなくこんな事を指すんだっけ」ってレベルでも知識が身につくのは非常に大きい。
ただ読むだけと手打ちでメモるのじゃ全然違う。メモを取ろう(コピペは駄目な気がする)

・木
試験環境構築と単体試験手順書の作成(既存のものに少し足すだけ)をした。
環境構築が資料通りに進めたが上手くいかない。
もうだめだと思ったら前任者が既に環境構築してた。
手順書も8割出来てるものに少しだけ内容足すのみなので割とすぐ終わった。
残り時間は気分転換に社会人マナーの本とか読んでた。

・金
単体試験に着手。試験自体はそんな難しいもんじゃないけど、
項目が多い+エビデンス取得作業が面倒。
100枚以上くらいスクショ撮った。
Snipping toolには慣れといたほうが良いね。。。
午後は途中から歓迎会を開いて貰った。
みんな仲良さそうで少し安心。

　
　



思いのほか長くなってしまったのでその2↓に続きます
https://qiita.com/ginger_t/items/385080a52a27c6eec7fd
僕がweb系業界に入るまでの流れと、やってきたこと

# まず

2015年からこの業界に初めて足を踏み入れました。
最初は、右も左もわからず、

- どのようにwebサイトが作られているか
- どのようにデザインデータを扱うか
- どのようにコーディングを進めていくか
- どのようにシステムを構築して組み込んでいくか

がまったく未知の世界の連続でした。
今は、最初に入社した会社を離れて、新しく転職した会社にいるので、2社目になります。

もちろん今でもわからないことは山のようにあるし、自身を喪失するような場面に出くわすことも多々あります。その度に、調べまくり、それでも解決しない場合は先輩に質問したり、時には丸投げしたり（これはあまりよくないですが笑）。

地道に案件をこなして行けば、それなりに力もついてくるでしょう。

ただ、これからこの世界に入って活躍したいと考えておられる方々は、その取っ掛かりをよく知らないというパターンが多いのではないのかなと思います。

周りに経験者や、実際にweb系の仕事をしている人が入れば、話を聞けるでしょう
でも周りにそういった人がいない環境に身を置かれている方々の助けに少しでもなればいいなと思い、僕の、この世界に入るまでの道のりをお教えしようかと思います。あまり参考にならないかもしれませんが、少しくらいは参考にできるように気をつけて書きます。


## この業界を志す前は…

京都の大学に通っていました。学科は文学部人文学科で、専攻は日本史コースでした。
正直言って、今の仕事とまったく関係ないですw
どうしてこの大学に進んだのかというと、学力でいける限界だったからです。
そして僕は当時、歴史が好きで、特に三国志が大好きでした。日本史コースを専攻してはいますが、卒論も三国志をテーマにしました（教授が三国志でもいいよと言ってくれたのでw）

まあ、そんなに遊ぶこともなく、ほどほどにバイトして、ちょっとだけバンドして、あとは家で自分の時間を満喫するという生活スタイルでいました。

## 就職活動開始…

4回生になってしまい、とうとう就職活動という名の地獄に叩き落とされてしまいました。
特にやりたい仕事はなかったので、なんとなくしか就職活動をしていませんでした。（親にこっぴどくやれと言われたのもありましたが）

一応内定はもらえましたが（パチンコ店でした。）多分自分には向いてないなと思い、音楽の専門学校に行こうと思い、フリーターになって、バイトしてお金を貯めようと思いました。しかし、結局、思うようなバイトも見つからず、結局大学生からやっているスーパーのバイトだけしていました。

## 従兄に相談…

いつの間にか、音楽の夢も薄れて、何しようか考える日々は続いていました。実家で暮らしていたので、親の説教がただただうざいと感じるようになっていきました。確かに、正社員でいた方がフリーターよりは安定しているし、世間体も良い。しかし、やりたい仕事がわからない。

大学を卒業して、約半年ほど経って、そろそろ就職しないとやばいなと思うようになり、webデザイナーの従兄に相談しにいきました。

その時、僕が仕事で譲れなかったポイントが、

- 毎日スーツ来て仕事
- 営業職

が嫌でした。
もともと、髪が長かったし、

- 自分一人でもできる仕事
- 作り出す系の仕事
- 技術を身につけられる仕事

が良いと思っていたので、それを従兄に相談しました。

そしたら、従兄が

「俺はwebデザインの仕事してるけど、それを目指してみたら？ もしやってみてダメだったら他の仕事探す感じにしたら良いんじゃない？」と言われ、とりあえず、そのwebデザイナーを目指すことにしました。


## 修行開始…

ただ、webデザイナーを目指すには、自分でHPを作品として作って、面接の時に見せて、選考の材料にしてもらう必要があると言われたので、まずは、HPの作り方を勉強することになりました。

勉強でやって来たことは、

- イラストレーター・フォトショップ・fireworksなどの基本的な使い方
- HTML CSSの記述の仕方
- FTPを使って、ファイルのアップロード

大雑把に書くと以上になります。

しかし、独学でやっていたので、デザインも最下層中の最下層でした(無間地獄級）。

## スクールに通えることに…

僕が比較的ラッキーだったのは、従兄のお父さん（叔父）がスクールのお金を全額負担してくれたことでした。感謝しつつ、僕はスクールに通い、デザイン・コーディング・プログラム（これは本当に触り部分だけ）全部を勉強できました。
独学でやっている頃と比べたら、知識はメキメキと身につきました（と言っても最下層中の最下層のスキルには変わりありませんが、独学と比べればという話です）。
そして、とうとう、面接に向けての作品作りに入りました。

## 実際に面接へ…

作品を作り終え、とうとう実際の面接です。
いろんな会社に応募して、面接を受けましたが、悉く失敗に終わりました。

ていうか、面接にすらたどり着けないパターンの方が多かったですね…。

何社目か忘れましたが、前職の会社を受けて（思っ切り私服でいきました笑）、受かりました。なんかあっさりというような感もありましたが、、。
前職の会社には、面接時にはもともと行く気があまりありませんでした。
大阪だったし、変な感じのオーラがしたので。

まあ、合わなければ、辞めようくらいの気持ちでいたので、とりあえず入社することに決めました。


## まとめ…

ここまでが入社するまでの流れになります。
正直、タイトルから大分それてしまった感がありましたが。。

- イラストレーター・フォトショップ・fireworksなどの基本的な使い方
- HTML CSSの記述の仕方
- FTPを使って、ファイルのアップロード

この3点を抑えて置けばとりあえずは問題ないかと思います。
あとは、今後自分がどういう人材になっていきたいかを考えてから、得意な色を伸ばして行けば良いかなと思います。

僕は結局デザインのセンスがこれっぽっちもありませんでしたので、プログラマ寄りのスキルです。

今は2社目にいますが、ここで少し、デザインの勉強もこっそりですがしております（実務ではなく家でこっそり）。

これからweb業界に入りたい方の参考に慣れれば幸いです。（ほとんど僕の経歴みたいな感じになってしまいましたが、、）
Android Developers Blog 適当意訳 #3 An Update on Android Things

# Android Things に関する更新
2019年2月12日

[原文](https://android-developers.googleblog.com/2019/02/an-update-on-android-things.html)
**※英語の勉強と自分用のメモ程度のかなり適当なものです。**


ここ一年以上グーグルは密にパートナーとGoogleアシスタントが内臓されたAndroid Thinsが使われたコンシューマー向け製品の開発の為に協力してきました。
我々とパートナーとのスマートスピーカー、スマートディスプレイの分野における成功を考慮して、我々はAndroid Thingsをこれらの成長分野を製造しているOEMパートナーのプラットフォームとして再度力を入れています。
ですので、NXP,Qualcomm,MediaTekを元にしたシステムオンモジュールズ(SoMs)機器は現時点では、パブリックデベロッパープラットフォームを通じては利用不可になる予定です。

Android Thingsは [Android Things SDK](https://developer.android.com/things/reference) を使っている機器(特にNXP i.MX7D や Raspberry Pi 3B など)の実験や容易な開発のプラットフォームであり続けます。
これらの基盤用のシステムイメージは、[Android Things console](https://partner.android.com/things/console)経由で利用可能です。
Android Things consoleは、開発者が非商用利用で最大の100端末向けに新しいビルドを生成し、アプリのアップデートをプッシュ可能です。

我々のIoTデバイス(ターンキーソリューション含む)への注力も続けます。 
2019年に商用のIoT製品に注目している開発者は、安全で大規模な端末接続の情報や、来たるエッジコンピューティングサービス向けの[Cloud IoT Edge](https://cloud.google.com/iot-edge/)を[Cloud IoT Core](https://cloud.google.com/iot-core/)で確認してください。
デバイス上での機械学習アプリは、引き続き[Edge TPU development boards.](https://aiyprojects.withgoogle.com/edge-tpu)を注視していてください。
Laravel チートシート バリデーション(フォームリクエスト/カスタム/コントローラ) 編


#フォームリクエスト - php artisan
php artisan make:request CreateUserRequest

# リクエスト取り出し
```php5
$hoge = Request()->input('hoge');

$hoge_file = Request()->file('hoge_file');

$hoge_id = Request()->route('hoge_id');

$session_id = Request()->session("id")->getId();
```

# 条件に応じて、バリデーションルール追加
```php5
    public function rules() {
        $validation = ['resume2' => 'max:255'];
        if ($flag==true) {
            $validation['author'] .= '|required';
        }
        
        return $validation;
    }
```

# 携帯電話入れて無いなら、家電は入れてよね
```php5
    public function withValidator(\Illuminate\Contracts\Validation\Validator $validator)
    {
        $validator->sometimes('telephone_no', 'required', function ($input){
            return is_null($input->mobile_phone_no]);
        });
    }
```

# カスタムバリデーション
```php5
\app\Extension\Validation\ValidationServiceProvider.php
```
M5Stack(ESP32)のWiFiサーバーにPCからtelnetで繋いでSerialとtelnetでリモートエコーを受け取る

ArduinoにM5Stackのboard定義をインストールすると一緒に入ってくるM5Stack-Core-ESP32用のサンプルスケッチのSimpleWifiServerはWebサーバーとして振る舞ってますが、もっと原始的にPCからtelnetで繋いでPCから送信した文字をSerialからリモートエコーさせて動作を確認するスケッチを作ったので共有します。

これをESPに書き込んで

```
#include <WiFi.h>

const char* ssid     = "yourssid";
const char* password = "yourpassword";
const int port = 3232;

WiFiServer server(port);

void setup()
{
    Serial.begin(115200);

    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(100);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected.");
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
    Serial.print("Server port: ");
    Serial.println(port);
        
    server.begin();

}

void loop(){
 WiFiClient client = server.available();
  if (client) {
    Serial.println("New Client.");

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        client.write(c);
      }
    }
    
    client.stop();
    Serial.println("Client Disconnected.");
  }
}
```

シリアルコンソールを開くとIPとかポートが表示されるので（WiFiに接続できてれば）

```
Connecting to yourssid
....................
WiFi connected.
IP address: 192.168.1.8
Server port: 3232
```

\> telnet 192.168.1.8 3232

あとはコマンドラインからtelnetで接続してキーボードを叩けば同じ文字がシリアルコンソールとtelnetのコンソールに表示されます。
Oracleでパーセンタイル(百分位数)を求める


|ID|T_VALUE|
|--:|--:|
|1|2.3|
|2|4.5|
|3|3.3|
|4|1.2|
|5|9.5|
|6|7.3|
|7|6.2|
|8|3.8|
|9|5.1|
|10|8.9|
このようなテーブルがあったとする。(テーブル名は「TARGET」とする)

```sql
SELECT
    MAX(T_VALUE)                                              AS pmax,
    PERCENTILE_CONT(0.99) WITHIN GROUP (ORDER BY T_VALUE ASC) AS p99,
    MEDIAN(T_VALUE)                                           AS pmed,
    PERCENTILE_CONT(0.01) WITHIN GROUP (ORDER BY T_VALUE ASC) AS p1,
    MIN(T_VALUE)                                              AS pmin
FROM TARGET
```

結果は

|pmax|p99|pmed|p1|pmin|
|--:|--:|--:|--:|--:|
|9.5|9.446|4.8|1.299|1.2|

ちなみに「PERCENTILE_CONT」はExcel関数の「PERCENTILE.INC」と同じ計算結果となる。
Kotlinで内部ストレージに保存・読み取り

###保存するとき

```kotlin
val fileName = "FileName"
val content1 = "Content1"
val content2 = "Content2"

val fos: FileOutputStream = openFileOutput(fileName, Context.MODE_PRIVATE)

fos.write(content1\n.toByteArray())
fos.write(content2.toByteArray())
fos.close()

```

このときのFileNameの中身は下のようになる。

```:FileName
Content1
Content2
```

ここで、AndroidStudioにおけるエミュレータの内部データの見方
①Device File Explorer(画面右下)
②エミュレータを選ぶ
③data/data/ドメイン.プロジェクト名/filesの中にある！


###読み取るとき

```kotlin

val fis: FileInputStream = openFileInput(fileName)
val isr: InputStreamReader = InputStreamReader(fis)
val reader: BufferedReader = BufferedReader(isr)

val contentA = reader.readLine()
// contentA -> Content1
val contentB = reader.readLine()
// contentB -> Content2
fis.close()
```

readLineと書くことによって、一行ずつ読むことができる。
その行に何もない場合はnullと出力される。