OmniAICreator/Qiita-1.07M huggingface dataset:
【PHPメモ】in_arrayで重複をチェック

###０．目的
自分用のメモ

###１．重複文字問題
(1)112233が入力の時
⇒123
(2)233342213が入力の時
⇒2341
のように出力するプログラムを作る。

###２．メモ

`in_array(検索対象文字列,配列):配列の中に検索対象文字列が存在するか確認する関数、存在する場合true,存在しない場合false`

###３．コード

※paiza.IOで動作確認

```php
<?php

    $in1 = fgets(STDIN);
    $in1=trim($in1);
    $len1=strlen($in1);
    //重複を取り除いた文字配列
    $arr_dict=[];
    
    for($i=0;$i<$len1;$i++){
        //$in1の1文字が$arr_dict配列に含まれない時
        if(!in_array(substr($in1,$i,1),$arr_dict)){
            $ans=substr($in1,$i,1);
            $arr_dict[]=$ans;
            echo $ans;
        } 
    }
    
?>

```
###入力
```
1234904743521627489064953371426326487539813121258593765158596901918
```

###出力
```
1234907568
```
RとPythonのDocker作業環境の構築2: 日本語対応


# はじめに

先日に以下の記事を投稿し，RとPythonが使える環境を構築するDockerfileを紹介しました。

[RとPythonのDocker作業環境の構築](https://qiita.com/SeijMura/items/373aa16060f79ffbe2b6)

こちらの記事のDockerfileでは，以下の問題がありました。

+ 日本語の対応ができていない
+ 文字コードが異なっており，他OSのテキスト解析の結果を再現できない

そこで，localeを変更することで，上記問題を解決するDockerfileに修正しました。

```Dockerfile
FROM ubuntu:18.04

# set timezone
RUN apt-get update \
    && apt-get install tzdata \
    && ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN date

# install packages
RUN ["/bin/bash", "-c", "\
    apt-get update \
    && apt-get install -y \
    vim \
    build-essential \
    git curl llvm sqlite3 libssl-dev libbz2-dev \
    libreadline-dev libsqlite3-dev libncurses5-dev \
    libncursesw5-dev python-tk python3-tk tk-dev aria2 \
    lsb-release locales\
    "]

RUN locale-gen ja_JP.UTF-8  
ENV LANG ja_JP.UTF-8  
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8

RUN ["/bin/bash", "-c", "apt-get install -y software-properties-common"]
RUN apt-add-repository ppa:ansible/ansible -y
# install r
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
#RUN add-apt-repository 'deb https://cran.rstudio.com/bin/linux/ubuntu $(lsb_release -cs)-cran35/'
RUN add-apt-repository 'deb https://cran.rstudio.com/bin/linux/ubuntu bionic-cran35/'
RUN ["/bin/bash", "-c", "\
    apt-get update \
    && apt-get install -y r-base \
    "]
RUN Rscript --version
CMD ["/bin/bash", "-c"]

```

差分は以下の通りです。

- python3.8 python3-pip のインストールをやめた
- インストールするパッケージにlocalesを追加した
- locale-genから始まるブロックで，日本語に設定した


以上です。
コンテナ上でpyenvを構築するためのスクリプトを作成中で，これができたらとりあえずPCを変えても再現できる環境が作れるのではないかと思っています。
スクリプトができたらまた記事書きます。
RaspberryPiのGPIO出力でファンを回してみた


ファンを取り付けようとしたらピンの5Vが埋まっていたのでGPIOを使ってみた。
起動するまで止まってるけどまあ、それはそれ。

#GNDにマイナス、GPIO26にプラスを接続

```/etc/rc.local
sudo echo 26 > /sys/class/gpio/export
sudo echo out > /sys/class/gpio/gpio26/direction
sudo echo 1 > /sys/class/gpio/gpio26/value
```
npm install --save について

## はじめに

本投稿は `npm install` コマンドの `--save` オプションについてですが、すでに

npmでパッケージをインストールする際、ネットを検索すると `--save` というオプションをよく見かける。
ex)axios をインストールする場合

```shell
$ npm install axios --save
```

`-g` でグローバルにインストールする際には見ないのだが、何者なのか調べてみた。

## npm install --save オプションについて

`package.json` の `dependencies` に登録してくれるようだ。

### 何がうれしいのか

git にコミットする際、パッケージをインストールしているフォルダ `node_modules` は `.gitignore` によって除外されます。
違う開発環境を git からクローンして構築する場合、`package.json` を元に復元します。
よって、同じパッケージ環境を簡単に構築することができます。

## 結論: `--save` オプションは必要か

現在の環境では `--save` オプションは不要です。
2017-05-30にリリースされた `npm5.0.0` 以降ではデフォルトで `--save` がつくようになりました。
よって、現在では古い環境を除いて基本的に不要です。

## 参考

[https://yosuke-furukawa.hatenablog.com/entry/2017/05/30/090602](https://yosuke-furukawa.hatenablog.com/entry/2017/05/30/090602)
[https://blog.npmjs.org/post/161081169345/v500](https://blog.npmjs.org/post/161081169345/v500)
[https://nodejs.org/ja/download/releases/](https://nodejs.org/ja/download/releases/)
画像縮小（LEDマトリクスパネル 16×32）

ppmファイルを縮小して、RGBマトリクスパネル16×32に表示する画像を作ります。

#1.ライブラリ
 pip install Pillow

```perl:resize.py
encoding:UTF-8
#-*- codinf:utf-8 -*-
from PIL import Image

img = Image.open("{変換前jpgファイル}")
width, height = img.size

img = img.resize((int(img.width / (img.height / 16 )), 16))
img.save("{変換後ppmファイル}")

```

#2.実行
python resize.py
QiitaのスクリプトブロックでVBSCRIPT、JScript、Batを明示する方法

# VBScriptはなくてVBしかない
昔はvb.netしかなかったのですが、いまは変わっています。
VBScriptを明示するにはどうすればいいのか。
偶然成功したのでメモしておきます
#VBScript
vb:VBScriptと書くのです

```vb:VBScript
```

#ということはVBAも

vb:VisualBasicForApplication
スペース不可

```vb:VisualBasicForApplication
```

#Jscript
javascript:JScript

```javascript:JScript
```
#bat
Shell言語なので
sh:bat

```sh:bat
CLS
ChCp 65001
Dir /b > DirList.txt
```

shell:bat

```shell:bat
CLS
ChCp 65001
Dir /b > DirList.txt
```


powershell:bat

```powershell:bat
CLS
ChCp 65001
Dir /b > DirList.txt
```

#ファイル名を続けるとき
このとき
vb:VBScript:ABC.VBS
とすると`:ABC.VBS`は無視されます

```vb:VBScript:ABC.VBS
```
@を使ってみます。この中にもスペースは使えません。

```vb:VBScript@C\hoge\hoge\ABC.VBS
```


スペースは失敗するので、Double Quatationで囲みます。この中にもスペースは使えません。

```vb:VBScript"C\hoge\hoge\ABC.VBS"
```

そういう欠点はありますが、ダブルクォーテーションで囲むのが一番問題ないようです。

#コロンのあとは言語名？
今までファイル名だと思っていましたが、ここはもしかして派生言語のときに記載するものだったみたいですね。
でもバッチファイルやVBSCRIPT、Jscirpt、VBAを明示できずずっと悩んでいましたが、これである程度解決できそうです。
実行ファイル→動的ライブラリA→動的ライブラリBのリンク構成で、実行ファイルは動的ライブラリBに依存しないか

# はじめに

拙著「[ライブラリを作ろう](https://techbookfest.org/product/5108106740629504?productVariantID=6672786418302976)」に入れられなかったネタを書きます。

実行ファイルが動的ライブラリAを動的リンクし、動的ライブラリAが動的ライブラリBを動的リンクする場合
実行ファイルは、動的ライブラリBを意識せず（依存せず）作れるのか。

![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69678/d27de075-138b-0f97-8878-62f3f3dd00fc.png)

理論的には依存しないはずだけど実際どうなのか、サンプルで検証します。
サンプルは、[Github](https://github.com/argama147/make_library/tree/master/Other/DynamicLinkLink)に格納してあります。
動作検証はWindows10のQt/C++で行っています。

次のような構成にします。

![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69678/267151cf-fb86-632f-2593-b288dca4c1ed.png)


* 実行ファイルプロジェクト：user_libray
* 動的ライブラリAプロジェクト：make_library
* 動的ライブラリBプロジェクト：make_library2


ビルドは、動的ライブラリBプロジェクト→動的ライブラリAプロジェクト→実行ファイルプロジェクトの順番に行います。

# make_library2プロジェクト

文字を修飾するクラスを用意します。
作成されるライブラリファイルは、libdeco.a（インポートライブラリ）とdeco.dll（動的ライブラリ）です。

````cpp:decoration.cpp
#include "decoration.h"
#include <QString>

Decoration::Decoration()
{
}

QString Decoration::getDecoration()
{
    return QString("#### ");
}
````

#make_libraryプロジェクト

Decoration.getDecoration()を使用して、文字を修飾します。
作成されるライブラリファイルは、libhello.a（インポートライブラリ）とhello.dll（動的ライブラリ）です。

````cpp:word.cpp
#include "word.h"
#include "decoration.h"

Word::Word()
{
}

const char* Word::getWord()
{
    Decoration decoration;
    QString deco = decoration.getDecoration();
    QString str = "Hello,World!";
    deco += str;
    return deco.toLocal8Bit().constData();
}
````

#user_librayプロジェクト

````cpp:main.cpp
#include <QCoreApplication>
#include <QDebug>

#include "word.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Word* word = new Word();
    qDebug() << word->getWord();
    delete word;

    return a.exec();
}
````

getWord()で取得した文字列をコンソール出力しています。

## 実行結果

````
#### Hello,World!
````


プロジェクトファイルを見てみます。

````
QT -= gui

CONFIG += c++11 console
CONFIG -= app_bundle

SOURCES += \
        main.cpp

win32: LIBS += -L$$PWD/../lib/ -lhello

INCLUDEPATH += $$PWD/../make_library
DEPENDPATH += $$PWD/../make_library
````

-helloでhelloライブラリは指定しますが、decoライブラリは指定していません。
ヘッダファイルについてもmake_library2ディレクトリは参照していません。

#検証結果

実行ファイルはdecoライブラリを意識せずに作成できることが検証できました。
ECCUBEのMySQLでmtbテーブルを削除してしまった場合の対処法

#ことのはじまり
配送方法のひとつを削除しようと思い、マスタデータ管理から削除しようとしたがなぜか消せない。ならばPHPMyAdminから直接消そう！と思い削除ボタンを押したものの、間違えてテーブルごと消去してしまった。配送方法のデータが丸々消えたせいで商品ページも管理画面もエラーが出るし、MySQLのバックアップはとっていないし...

#対処法
EC-CUBEのマスタデータは外部キー制約というものに基づいて作られています。例えば配送方法のテーブルであるmtb_sale_typeでであれば、それを参照して商品データであるdtb_productsにmtb_sale_type_idというカラムが存在していると思います。このような状態で、GUIから存在しない（僕の場合は消してしまったので）mtb_sale_typeテーブルを作成しようとしても
###「外部キー制約を追加できません。」
と出てしまい作成できないのです。この場合、「外部キー制約を無視」してクエリから制作する必要があります。
外部キー制約を無視するためには以下のクエリを使用します。

```SQL
SET FOREIGN_KEY_CHECKS=0;
```

最終的に書いたクエリは以下の通りです。

```SQL
SET FOREIGN_KEY_CHECKS=0;
create table 'mtb_sale_type' (
    'id' smallint(5) UNSIGNED NOT NULL, 
    'name' varchar(255) NOT NULL, 
    'sort_no' smallint(5) UNSIGNED NOT NULL,
    'discriminator_type' varchar(255) NOT NULL
    PRIMARY KEY(id);
)
DEFAULT CHARSET=utf8mb4_general_ci
```
これで元通りのテーブルを作ることができます。あとは「挿入」からもとあったデータを追加していくだけです。

#総括
MySQLのバックアップは、ちゃんととっておこう！
Elixirの集合演算

# はじめに
- @nezuq さんの[Pythonの集合演算](https://qiita.com/nezuq/items/4ea66c1bf6627eab2345)を拝見しまして、私はぜひElixirでの話をまとめておこうとおもいました
- [Elixir](https://elixir-lang.org/)はElixir 1.10.4 (compiled with Erlang/OTP 23)を使いました
- `IEx`で試していきます

# [MapSet](https://hexdocs.pm/elixir/MapSet.html#content)

```elixir
iex> x = MapSet.new([1,2,3,4,5,6,1,1,1])
#MapSet<[1, 2, 3, 4, 5, 6]>

iex> y = MapSet.new([9,9,9,4,5,6,7,8,9])
#MapSet<[4, 5, 6, 7, 8, 9]>
```

# [MapSet.union/2](https://hexdocs.pm/elixir/MapSet.html#union/2)
- `/`のうしろの数字は引数の数です
- **和集合**

```elixir
iex> MapSet.union(x, y)
#MapSet<[1, 2, 3, 4, 5, 6, 7, 8, 9]>
```

# [MapSet.intersection/2](https://hexdocs.pm/elixir/MapSet.html#intersection/2)
- **積集合**

```elixir
iex> MapSet.intersection(x, y)
#MapSet<[4, 5, 6]>
```

# [MapSet.difference/2](https://hexdocs.pm/elixir/MapSet.html#difference/2)
- **差集合**

```elixir
iex> MapSet.difference(x, y)
#MapSet<[1, 2, 3]>
```

# XOR

```elixir
iex> MapSet.union(x, y) |> MapSet.difference(MapSet.intersection(x, y))
#MapSet<[1, 2, 3, 7, 8, 9]>
```
- 関数は無いようでしたので、ベン図の要領で和集合から積集合を引きました

# [MapSet.subset?/2](https://hexdocs.pm/elixir/MapSet.html#subset?/2)
- 第一引数のMapSetのすべてのメンバーが第二引数のMapSetのメンバーに含まれているかどうか

```elixir
iex> x = MapSet.new([1,2,3])
#MapSet<[1, 2, 3]>

iex> y = MapSet.new([1,2,3,4,5])
#MapSet<[1, 2, 3, 4, 5]>

iex> MapSet.subset?(x, y)
true
```

# [MapSet.disjoint?/2](https://hexdocs.pm/elixir/MapSet.html#disjoint?/2)
- 共通要素が無いかの判定

```elixir
iex> x = MapSet.new([1,2,3])
#MapSet<[1, 2, 3]>

iex> y = MapSet.new([4,5,6])
#MapSet<[4, 5, 6]>

iex> MapSet.disjoint?(x, y)
true

iex> MapSet.disjoint?(MapSet.new([1, 2]), MapSet.new([2, 3]))
false
```



#Wrapping Up
- [Elixir](https://elixir-lang.org/)では[MapSet](https://hexdocs.pm/elixir/MapSet.html#content)を使います
- Enjoy [Elixir](https://elixir-lang.org/) !!! :rocket::lgtm::rocket::lgtm::rocket::lgtm:
RaspberryPiの有線LAN増設メモ


寝室のRaspberryPi ZERO WHの無線LANが安定しないので優先化したかったけど
USBで増設はツマランので以下を買ってみた。
https://www.amazon.co.jp/gp/product/B07CFWFGGT
https://wiki.52pi.com/index.php/Pi_Zero_Enc28j60_Network_Adapter_Module_SKU:_EP-0088

#使い方 
raspi-configでSPIをONにしてから設定に以下を追加。

```/boot/config.txt
dtoverlay = enc28j60
```

#感想
安定しているけど遅すぎる。
ボトルネックはSPIみたいなので設定をいじれば多少は早くなるけどUSBでいいやと諦めてしまった。

```
dtoverlay=enc28j60,int_pin=25,speed=25000000
```
省電力を重視しているIRC用に使っている初代RaspberryPi、が壊れたらこれとRaspberryPi ZEROに置き換えようかな。
【VPC】CIDRとは

## CIDRとは
**Classless Inter-Domain Routing** の略
クラスを使わないIPアドレスの割り当てと、経路情報の集成を行う表記法

- 8ビットを1オクテットとし、4つのオクテットに分割して表記
- 各オクテットは10進数で表す
- VPC・サブネットにそれぞれ付与され、識別される

### CIDRブロックの例
```
CIDRブロック 10.20.5.0/24
→ 00001010 00100100 00000101 00000000

10.20.5.0 〜 10.20.5.255 までのIPアドレスが同一ネットワークとして扱われる
```

- 「10.20.5.0」の部分がIPアドレス、「24」の部分がサブネットマスクを表す
- 24ビット（左から24桁）が**ネットワークアドレス**、残り8ビットが**ホストアドレス**

## サブネットに設定不可のIPアドレス
|ホストアドレス|用途|
|:-:|:-:|
|.0|ネットワークアドレス|
|.1|VPCルータ|
|.2|Amazonが提供するDNSサービス|
|.3|AWSで予約されているアドレス|
|.255|ブロードキャストアドレス|
RaspberryPiでL02Cを使ってインターネット接続

古のインターネットであるIRCに2回線目で接続するため光ファイバとSIMで接続しているんだけど、
SIMの方はRaspberryPiにL02Cを使ってTiarraさんでプロクシ化しているのでそのメモ

L02C DOCOMOの奴の中古やね
https://www.amazon.co.jp/gp/product/B00524UU3Q

SIM　ロケットモバイルの神プラン　書いている時点では月300円
https://rokemoba.com/

適当にインストール

```
sudo apt-get install ppp usb-modeswitch wvdial -y
```


モデムにシンボリックリンクを作って固定化

```/etc/udev/rules.d/10-lte.rules
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", ATTRS{bInterfaceNumber}=="02", ATTRS{../idVendor}=="1004", ATTRS{../idProduct}=="618f", SYMLINK+="usbmodem"
```

固定化の確認

```
ls -l /dev
```
以下が出ればOK

```
lrwxrwxrwx  1 root root           7 12月 15 20:34 usbmodem -> ttyUSB2
```


設定

```/etc/wvdial.conf
[Dialer Defaults]
Init1 = ATZ
Init2 = ATH
Init3 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init4 = AT+CGDCONT=2,"IP","4gn.jp"
Dial Attempts = 3
Stupid Mode = 1
Modem Type = Analog Modem
Dial Command = ATD
Stupid Mode = yes
Baud = 460800
New PPPD = yes
APN = 4gn.jp
Modem = /dev/usbmodem
ISDN = 0
Phone = *99***2#
Carrier Check = no
Password = rokemoba
Username = roke@moba
```
接続テスト

```
sudo wvdial
```

tiarraさんがモバイル回線を使ってくれるように設定

```/etc/dhcpcd.conf
allow-hotplug rokemoba
iface rokemoba inet wvdial
  pre-up sleep 3
```

接続確認

```
sudo ifup rokemoba
ip a show dev rokemoba
sudo ifdown rokemoba
```


疲れたので続きはまた今度
RaspberryPiのSPI接続ディスプレイの表示


ピンにさして表示させるディスプレイの使い方。
HDMIじゃなくてSPIで通信しているやつ。
https://www.amazon.co.jp/gp/product/B01A3359AE

当たり前だけどSPI無効化すると止まる。

インストール前に以下の2ファイルをバックアップしとくといい。
`/boot/cmdline.txt`
`/boot/config.txt`
USBデバイスからブートしている場合、`cmdline.txt`がSDカード(`root=/dev/mmcblk0p`)から起動に書き換えられてしまい起動出来なくなるのでバックアップ見て戻そう。

インストール

```
git clone https://github.com/waveshare/LCD-show.git
cd LCD-show
./LCD4-show
```

戻す

```
cd LCD-show/
./LCD-hdmi
```

なんかいっとき動かなかったのがあったので対策。
今は普通に動くっぽいけど備忘録的に

```
git clone https://github.com/swkim01/waveshare-dtoverlays.git
sudo cp waveshare-dtoverlays/waveshare35a.dtbo /boot/overlays/
```
mysqldumpでデータベースを指定してdumpする


## dumpコマンド
- dbname = test

```
mysqldump -uroot -p -h<hostname> -B <dbname> > test.sql
```

## dumpfileの中身
- データベースが指定される

```
  20 --
  21 -- GTID state at the beginning of the backup 
  22 --
  23 
  24 SET @@GLOBAL.GTID_PURGED='';
  25 
  26 --
  27 -- Current Database: `test`
  28 --
  29 
  30 CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
  31 
  32 USE `test`;
  33 
  34 --
```

## あ、
- docker-composeで初期データを入れる場合、データベースの指定がないと流し込めないので、こちらのやり方でdumpを取得する必要があるみたいです

```
  1 db:                                                                                           
  2   image: mysql:latest
  3   volumes:
  4     - ./initdb.d:/docker-entrypoint-initdb.d
  5   environment:
  6     - MYSQL_ROOT_PASSWORD=root
```
【JS】重複しないランダムな三桁の数字を作る

#コード

```sample.js
// ランダムな三桁の数字
function three_random_number() {
  const three_digit_number = [];

  for (let i = 0; three_digit_number.length < 3; i++) {
    const number = Math.floor(Math.random() * 10)

    if(!three_digit_number.includes(number)){ 
      three_digit_number.push(number);
    }
  }

  console.log(three_digit_number);
}

three_random_number()
```

#コードの説明
```const three_digit_number = [];```：カラの配列の作成

```for (let i = 0; three_digit_number.length < 3; i++) {}```：長さが3の配列が出来るまでループ

```Math.floor(Math.random() * 10)```：0~９までのランダムな整数値の作成

```if(!three_digit_number.includes(number)){ }```:three_digit_numberが、numberで作られたランダムな整数値を持っていなければ、true（!は否定の論理演算子）


・```three_digit_number.push(number)```
：配列three_digit_numberにnumberの数字を追加

#補足

@cfm-artさんのコメントより

```sample.js
[...Array(10).keys()].sort(() => Math.random() * 3 - 1).slice(0, 3).join('')
```

自分で作成したものと違ってスマートです。。。

僕には、一目見ただけでは理解できなかったので、簡単に分解して説明してみました！

##コードの説明
まず、最初が難しい
①```[...Array(10).keys()]```：

```
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

[この記事](https://qiita.com/kajirikajiri/items/aff91ccfe3dc135ab7bd)を参考になんとか意味はわかりました。

②```sort(どのように並び替えるか？)```：配列の（破壊的な）並び替えメソッド。

しかし、これだけではどのように並べ替えるかが指定されていないので、引数にランダムに並び替えると指定。

③```Math.random() * 3 - 1```：

[この記事](https://sleepygamersmemo.blogspot.com/2018/12/get-random-items-from-array.html)を参考にしましたが、```* 3 - 1```の部分が理解できませんでした。

```sample.js
[...Array(10).keys()].sort(() => Math.random() * 3 - 1)
```

後、こころなしか、配列の最初が0になりやすいなど、ランダムな並び替えに偏りがある気がします。

>この方法は比較関数を指定し「隣り合う値を入れ替えるかどうか」をランダムに決めているだけ

といった理由があるみたいです。

④```slice(0, 3)```：slice(開始インデックス, 終了インデックス)

これは、インデックス番号が```0,1,2```の三つの新しい文字列を返しています

⑤```join('')```：配列の全ての要素を連結した文字列を返します。

→```('')```でカラの文字列と連結した文字列を返しています。
【VPC】VPCとは

## VPCとは
**Amazon Virtual Private Network** の略
AWSクラウド上で論理的に分離された仮想プライベートネットワーク

- リージョンを跨いでの作成は不可
- IPアドレスの範囲をIPv4 CIDRブロックの形式（16~28のサイズ範囲内）で指定する

## サブネット
1つのアベイラビリティーゾーン内に含まれる論理的なネットワークの分割区分

- アベイラビリティーゾーンごとに1つ以上のサブネットを追加する
- 1つのサブネットは複数のアベイラビリティーゾーンに跨って設定出来ない
- VPC内に複数設置可能（作成上限数はデフォルトで200）

### 1. パブリックサブネット
インターネットゲートウェイへのルーティングを含むルートテーブルがアタッチされ、インターネットとの通信が可能になったサブネット

### 2. プライベートサブネット
アタッチされたルートテーブルにインターネットゲートウェイへのルーティングが含まれず、インターネットとの通信が不可能なサブネット

## インターネットゲートウェイ
VPCとインターネットとの間の通信を可能にするVPCコンポーネント

- VPCに対して明示的にアタッチすることでVPCとインターネットを接続する
- インターネットゲートウェイを経由してEC2がインターネットと通信するためには、ルートテーブルの設定が必要

![スクリーンショット 2020-09-13 20.30.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/13f5d872-e236-d2a1-c5db-020fa10ca39d.png)

## NATゲートウェイ
プライベートサブネットからインターネットにアクセスする際、プライベートIPアドレスからパブリックIPアドレスにアドレス変換を行う場合に利用するゲートウェイ

- アベイラビリティゾーン単位で作成する
- AWSのマネージド型サービスなので、NATゲートウェイ自体のサーバー運用はAWSが代行する
- パブリックサブネットに作成し、Elastic IPを割り当て、プライベートサブネットのルートテーブルのターゲットにNATゲートウェイのIDを設定することで機能する

![スクリーンショット 2020-09-13 20.31.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/01c1ae88-f20d-7381-a0d8-40205af5ad60.png)

## ルートテーブル
VPC内で発生する通信に対して、ルーティング設定を行う機能

- 適用したいサブネットに対してルートテーブルを明示的に関連付けする必要がある
- VPC作成時にデフォルトで1つ作成される

![スクリーンショット 2020-09-13 20.38.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/c1c31aaa-b5bb-326e-ce29-5e07abfacda5.png)

## VPCエンドポイント
本来インターネットからしかアクセス出来ないAWSのサービスに対し、VPC内部からプライベートに接続することを可能にするサービス

### 1. インターフェイスエンドポイント
サポートされるサービスを宛先とするトラフィックのエントリポイントとして機能するサブネットのIPアドレス範囲のプライベートIPアドレスを持つElastic Network Interface

### 2. ゲートウェイエンドポイント
サポートされるAWSのサービス（S3, DynamoDB）を宛先とするトラフィックのルートテーブルで、ルートのターゲットとして指定するゲートウェイ

## トラフィック制御
### 1. NACL（Network ACL）
- ステートレス：戻りトラフィックも許可設定が必要
- サブネット単位で適用
- 許可・拒否をIn/Outで指定
- デフォルトでは全ての送信元IPを許可
- 番号の順番通りに適用

### 2. セキュリティグループ
- ステートフル：戻りトラフィックの考慮は不要
- サーバー単位で適用
- 許可のみをIn/Outで指定
- デフォルトでは同じセキュリティグループ内通信のみ許可
- 全てのルールを適用

## VPC Flow Logs
VPCのネットワークインターフェイスとの間で行き来するIPトラフィックに関する情報をキャプチャ出来るようにする機能

- フローログデータは Amazon CloudWatch Logs または Amazon S3 に発行可能
- フローログを作成すると、選択した送信先でそのデータを取得して表示出来る

![スクリーンショット 2020-09-15 8.19.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379501/dadaeff8-6616-8d69-379c-844c9286fc29.png)

（例）
`fl-aaa` → インスタンス A1 のネットワークインターフェイスで受け入れられたトラフィックをキャプチャし、フローログレコードを Amazon S3 バケットに発行するフローログ
`fl-bbb` → サブネット B のすべてのネットワークインターフェイスのトラフィックをキャプチャし、フローログレコードを Amazon CloudWatch Logs に発行するフローログ

## 設定上限
| リソース | 　　数　　　|
|:-:|:-:|
| リージョンあたりのVPCの上限数 | 5 |
| VPCあたりのサブネットの上限数 | 200 |
| AWSアカウントあたりの1リージョン内のEIP | 5 |
| ルートテーブルあたりのルート上限数 | 100 |
| VPCあたりのセキュリティグループの上限数 | 500 |
| セキュリティグループあたりのルールの上限数 | 50 |

## 設計ポイント
- 将来の拡張も見据えたアドレッシング、他ネットワークとの接続性を考慮する
- CIDRは、既存のVPC、社内のDCやオフィスと被らないアドレス帯を指定し、組織構成やシステム構成の将来像も考えて計画する
- VPC構成は、VPC全体の関係性を視野に入れてる
- 組織とシステム境界からVPCをどのように分割するかを将来構成も考慮して検討する
- 複数AZを利用して可用性の高いシステムを構築する
- サブネットは大きいサブネットを使い、パブリックサブネット・プライベートサブネットへのリソースの配置をインターネットアクセス可否から検討する
- セキュリティグループを使ってリソース間のトラフィックを適切に制御する
- 実装や運用を補助するツールを有効利用し、VPC Flow Logsを使ってモニタリング出来るようにする
RaspberryPiの動作確認のメモ


音量調整　F6でデバイス選んで音量調節

```
alsamixer
```

音量保存

```
sudo alsactl store
```
鳴らしてみる

```
aplay /usr/share/sounds/alsa/Rear_Center.wav
```

フレームバッファに書き込み。砂嵐になる。

```
sudo cat /dev/urandom > /dev/fb0
```

CPU温度の表示

```
vcgencmd measure_temp
```

HDDのIDとか表示

```
sudo fdisk -l
sudo blkid
sudo lsblk
```

USBデバイスの接続確認

```
lsusb
```


テキストエディタ　Windowsライクなので最初は使いやすい　今はviでいいやってなってる crontabの例

```
sudo mousepad /etc/crontab
```
CSSで作る必須マーク

# 「*」のマーク
![スクリーンショット 2020-09-13 20.43.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/1c1d6da7-d9af-cd35-d646-3fbf30e624ea.png):arrow_left: でこんな感じになる :arrow_right:![スクリーンショット 2020-09-13 20.43.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/a6e07058-9f94-6b6e-253f-c1c43750acc0.png)

```xml
<!-- classで「required」を付けた文字の後ろに必須マークが出る -->
<h:outputText styleClass="required" value="好きな生き物" />
```
```css
.required::after {
  content: " *";
  color: red;
  vertical-align: middle;
}
```

# 「必須」文字のマーク
![スクリーンショット 2020-09-13 20.22.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/50047383-3ee9-578e-5f3f-633edea60db1.png) :arrow_left: でこんな感じになる :arrow_right: ![スクリーンショット 2020-09-13 21.02.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/82c30621-e2a5-c51d-022c-fee1d76fc0d8.png)

```css
.required::after {
  content: "必須";
  background-color: #f0ad4e;
  color: #fff;
  font-size: 12px;
  font-weight: bold;
  min-width: 10px;
  padding: 3px 7px;
  margin: 0px 5px;
  line-height: 1;
  vertical-align: middle;
  white-space: nowrap;
  text-align: center;
  border-radius: 10px;
  display: inline-block;
}
```
Mac OSX でgitをauto-completionする

git-completion.bashをダウンロードする


```
curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash
```


~/.bash_profileを作成する

```
touch ~/.bash_profile
```


~/.bash_profileを修正する

```
vi ~/.bash_profile

if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi
```

~/.bash_profileの修正内容を有効する

```
source ~/.bash_profile
```

**git branchを表示させる**

こういう風にgit branchをターミナルに表示させる
![Screen Shot 2020-09-13 at 21.06.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699891/9a862064-2d89-6b61-6ffb-af69c2335f2b.png)

以下のポストをご覧ください。
https://medium.com/@thucnc/how-to-show-current-git-branch-with-colors-in-bash-prompt-380d05a24745
RaspberryPiで個人的に最初にやる事


作業用ディレクトリの作成。sftpで作業できると楽。

```
sudo mkdir /git
sudo chown pi /git 
```

ログとかをメモリーに出力

```:/etc/fstab
tmpfs  /home/pi/tmp      tmpfs  defaults 0 0
tmpfs  /tmp           tmpfs defaults,size=32m,noatime,mode=1777 0 0
tmpfs  /var/tmp       tmpfs defaults,size=16m,noatime,mode=1777 0 0
tmpfs  /var/log       tmpfs defaults,size=16m,noatime,mode=0755 0 0
tmpfs  /home/pi/share       tmpfs defaults,size=16m,noatime,mode=1777 0 0

tmpfs  /var/log/apache2       tmpfs defaults,size=16m,noatime,mode=0755 0 0
```

アップデート

```
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get dist-upgrade -y
sudo apt autoremove -y

sudo reboot
```


RaspBerryPiの設定
ホスト名：適当
オーバースキャン：無効
SSH：有効
VNC：有効
GPUメモリ：100以上に適当に増やす
Pardot Lightning アプリケーションの基本⇒Pardot Lightning アプリケーションの使用開始

１．Pardot でビジターをプロスペクトに変換するために必要な情報にはどのようなものがありますか?
２．リードの育成はマーケティングオートメーション戦略で重要な役割を担います。リードの育成ではどのようなことを行いますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/1b0b1363-0d1e-a6cb-6d52-90c48f133206.png)
Dockerのインストールと初期設定


# 環境
Mac OS Mojave

# Dockerのインストール

まずはDockerのアカウントを作成する
[こちら](https://hub.docker.com/)

Sign Up Todayのところに情報を入力してSign Upボタンを押す。
![スクリーンショット 2020-09-12 20.41.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/05bca47c-b721-d930-6158-e87515d6f5bf.png)

![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/eca7f212-01cf-e8f1-e2b7-adbe2caaa761.png)

左下のContinue with Free をクリック

するとメールアドレスにメールが届くので
`Verify email address`ボタンを押す。

すると以下の様な画面になるので
![b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/1bdad2fb-749e-52ed-9dda-bfa2addeefef.jpeg)
「Download Docker Desktop for Mac」を押す。

もしくは、[こちら](https://hub.docker.com/editions/community/docker-ce-desktop-mac)からDockerをインストールするためのdmgをダウンロード。


![スクリーンショット 2020-09-12 20.43.32-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/432d28b2-b13d-b5c8-45eb-d38cf63c52cc.jpeg)

あとはインストーラーの指示にしたがってインストール

Dockerのアプリケーションを起動すると右上にくじらのアイコンが出る。
![スクリーンショット 2020-09-12 20.47.36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/e57bc687-5081-c27d-10f2-83d3fd7c8b19.jpeg)

コマンドラインで以下のように入力し、バージョンが表示されればインストールできている。

```
docker version
```

# 初期設定

![スクリーンショット 2020-09-12 20.57.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/faea345f-8cc1-1c96-0ec5-4d91e7e30012.png)

くじらマーク > Preferences で環境設定画面を開く。

右上のsign inボタンでsigninはしておく。

##### General
Start Docker Desktop when you log in をオフ
Macにログイン時にDockerを起動する必要はないため。

#### Resources
CPUs 2
Memory: 2GB
Swap 1GB
Disk image size 16GB

Disk image sizeは減らしておかないと容量がめっちゃなくなる。
それ以外は適当。減らしても良さそう。

Apply & Restartボタンを押すと、やっちゃっていいですか？みたいなダイアログが出るのでOKおす。


# 参考

https://qiita.com/k5n/items/2212b87feac5ebc33ecb
kubernetesで更新したはずのイメージが更新されていない問題


## 原因

- `imagePullPolicy`をつけていないと、ローカルのキャッシュを利用しているっぽいので更新されていなかった

## 対処方法
- `imagePullPolicy: Always` で常に、imageをpullするようにすると解決

```app-deployment.yaml
        image: xxxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/business:app
        name: app 
        imagePullPolicy: Always
```

## 設定値の意味

- Always: 常にコンテナイメージをPullする
- IfNotPresent: 既にコンテナイメージがあればPullを実行しない
- Never: Pullを実行しない。ローカルにコンテナイメージがあることを期待する

## 参考
https://cstoku.dev/posts/2018/k8sdojo-04/
[heroku] run rails db:migrateがうまくいかない

#環境
・Rails 6.0.3.2
・mysql Ver 14.14 Distrib 5.6.47
・osx10.15
・herokuへデプロイ

#はじめに
`Rails`でアプリを作成し`heroku`へアップロードするときにうまくいかなかった時の対応です。
開発環境では`MySQL`で`heroku`ではDBが`PostgreSQL`のためその対応が必要。
その途中段階でエラーが生じた。
順番に書いていきます。

#PostgreSQLへの対応
まずは`Gemfile`へ以下を記述。本番環境で`PostgreSQL`を使うというものです。自分は一番下に書きました。

```ruby
group :production do
  gem 'pg'
end
```
Gemfileを変更したので忘れずにbundle installをします。
まずここで一つ目のエラーでました。そのまま`bundle install`すると自分の開発環境には`PostgreSQL`がないのでエラー発生。

対応は`group :produciton　end`のところを飛ばすコマンドをターミナルで実行します。

```ターミナル

$ bundle install --without production 
```
データベースへ接続する記述をconfigフォルダの中にある`database.yml`へします。
一番下へ追記しました。

```ruby
production:
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5

```
自分の場合は記述は以上でした。
参考になった記事はコチラです！
【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】
・https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39

#herokuへデプロイ
今回ここは割愛します。
デプロイ完了まで進みます。

#ここでdb:migrate
`heroku run rails db:migrate`をしますがエラー発生！
いろいろ見ているうちにこのエラーにやっと出会う。。。


ターミナルには中ほどに以下のような記述が。

```
Caused by:
PG::ConnectionBad: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
```
#原因
調べてみると単純なことで`heroku`にはデフォルトでは`PostgreSQL`が入ってないので、追加してあげる必要があるということです！
なんと！！！！
まだまだ慣れてないのでこの単純なことに気づけませんでした。。。。

#対応

ターミナルで`PostgreSQL`を追加するコマンド

```
$ heroku addons:create heroku-postgresql
```

その後に

```
$ heroku run rails db:migrate
```

そうするとマイグレーションが完了しました！

別のところが誤っていると思い全然違うことをして数時間を費やしてしまいましたが、単純なことでした！
無事アプリが動作し完了しました！

#参照
【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】
・https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39

【Rails】「heroku run rake db:migrate」を実行しようとすると発生するエラーについて
・https://qiita.com/suzuki-x/items/b878723080aea1a673ed
【ReactNative】SafeAreaの余白を設定する方法(Android, iOS両方)

## SafeAreaとは？

スクリーンで言うとこの部分です。

![スクリーンショット 2020-09-13 19.32.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252348/0fe354f2-24f8-f72f-d99c-0ecba3dd3666.png)

![スクリーンショット 2020-09-13 19.33.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252348/e231b735-f62c-01ce-9557-f313be4818dd.png)

上の画像は既にSafeAreaの余白を設定したあとのスクリーンショットなのですが、`View`だけで構成すると、ステータスバーにコンテンツが重なってしまいます。

## 対策

1. SafeAreaViewを使う (iOS)
2. StatusBar.currentHeightをpaddingTopに設定する (Android)

### SafeAreaView

SafeAreaViewはiOSのノッチの部分の余白を取ってくれる、`react-native`が提供するコンポーネントです。このコンポーネントを使えば、iOSでノッチやステータスバーとコンテンツがかぶることはありませんが、Androidのステータスバーの余白は設定されないため、以下のように別途対応が必要になります。

### StatusBar.currentHeight

`StatusBar`は、`react-native`が提供するコンポーネントで、`StatusBar.currentHeight`でステータスバーの高さを取ることができるので、`paddingTop: Platform.OS === "android" ? StatusBar.currentHeight : 0`のようにして、Androidの場合に`paddingTop`で余白を取るようにすれば良いです。

最終的には、以下のようなコードになりました。

```tsx:App.tsx
import { StatusBar as ExpoStatusBar } from "expo-status-bar";
import React, { useState, useCallback } from "react";
import {
  StyleSheet,
  Platform,
  StatusBar,
  Text,
  View,
  Button,
 
 SafeAreaView,
} from "react-native";

export default function App() {
  const [count, setCount] = useState(0);
  const increment = useCallback(() => setCount(count + 1), [count]);

  return (
    <SafeAreaView style={styles.container}>
      <ExpoStatusBar style="auto" />
      <View>
        <Text>Open up App.tsx to start working on your app!</Text>
        <Text>Count = {count}</Text>
        <Button title="Count Up" onPress={increment} />
      </View>
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    backgroundColor: "#fff",
    paddingTop: Platform.OS === "android" ? StatusBar.currentHeight : 0,
  },
});

```

[参考にしたStackOverflowの記事](https://stackoverflow.com/questions/51289587/react-native-how-to-use-safeareaview-for-android-notch-devices/55017347)
VBScriptでMsgBoxに日本語を使うとエラーが出るときの対処法

VBScriptで、以下のようなソースを実行するとエラーが出る

```VB
Msgbox("日本語のメッセージ")
```

特におかしいところは無さそうなのに、「終了していない文字列型の定数です」というエラーが出る。
![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/5654eb61-ac33-a719-4aa9-8b02c5875812.jpeg)


# 対処法
ソースに不備がないのにエラーが出るときは、エンコードが原因かもしれない。
UTF-8 → Shift-JIS に変えると、ちゃんと実行された。
![SJIS.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/346c015f-8f5d-d410-a601-06f279df3bb9.jpeg)
![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/967e5d3a-3edb-c4d5-30cc-2e2f957d67d4.jpeg)

# 絵文字が使いたいとき
どうしてもメッセージに絵文字を使いたい時などは、UTF-16のBOM付にすれば表示された。
![UTF16.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/4f6c5bea-9b5c-cc1c-5cea-a1a52015eb25.jpeg)
![003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/7a727b89-3913-5980-8d72-833069fe12e8.jpeg)


参考になったサイト
[utf-8として保存されたvbsファイルが実行されない](https://stackoverrun.com/ja/q/2274372)
iMacrosまとめ

# iMacrosとは？

ブラウザの拡張機能として、ブラウザを自動操作するマクロツールです。

# iMacros導入

iMacros導入については、以下の記事を参照すると良いと思いました。
簡潔かつ実践的で、個人的にQiitaにこうやって投稿したい！という記事の形を体現してくれています。
https://qiita.com/Gro/items/8c93d17fa740b23b8d64


# iMacrosコマンド一覧

iMacrosコマンド一覧については、以下の記事が良いと思いました。
https://teilab.net/imacros-commandline/#TIMEOUT_STEP

# よく使うコマンド集

```
'4桁ランダム数値を変数に設定
SET !VAR1 EVAL("var min = 1000; var max = 9999; var randomNumber = Math.floor(Math.random() * (max - min + 1)) + min; randomNumber;")
{{!VAR1}}

'1秒待つ
WAIT SECONDS=1

'取得したEXTRACT値を、JSで加工して設定
TAG POS=1 TYPE=TD ATTR=TXT:取得対象テキスト* EXTRACT=TXT
SET !VAR1 EVAL("let s = '{{!EXTRACT}}';")

'タイムアウト60まで
SET !TIMEOUT_STEP 60
```
tqdmでタスクバー表示

#きっかけ
Kaggle中で出てくるtqdmって何？って思ったから。

#結論
処理の進捗をタスクバーで表示するためのもの

#使用例

```ruby:qiita.rb
import time
from tqdm.notebook import tqdm 

for i in tqdm(np.arange(10)):
    time.sleep(1)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/f8e9c75d-c376-8436-08b6-f38db967cdc5.png)


#参考
[参考①](https://blog.narito.ninja/detail/65/)
boto3でno attributeのエラーがでたときはバージョンを確認しよう

## boto3のエラー
boto3のput_function_event_invoke_configを使用したところ、

```python
import botocore
import boto3

client = boto3.client('lambda')
response = client.put_function_event_invoke_config(
    FunctionName=FunctionName,
    MaximumRetryAttempts=0,
)
```

以下のエラーが発生

```
AttributeError: 'Lambda' object has no attribute 'put_function_event_invoke_config'
```

翻訳すると
> AttributeError: 'Lambda' オブジェクトには 'put_function_event_invoke_config' 属性がありません。

とのこと。

lambdaに以下を追記して、boto3とbotocoreのバージョンを確認しました。

```python
    print('botocore vertion is {0}'.format(botocore.__version__))
    print('boto3 vertion is {0}'.format(boto3.__version__))
```

これが結果

```
botocore vertion is 1.12.253
boto3 vertion is 1.14.57
```

現在のバージョンを以下で確認したところ・・
[Releases · boto/boto3 · GitHub](https://github.com/boto/boto3/releases)
[Releases · boto/botocore · GitHub](https://github.com/boto/botocore/releases)

botocoreが半年以上古いようです。

## botocoreを最新化する

以下の記事の通りで最新化できます。

[【AWS】Lambdaでのbotoの使い方と最新botoの使用方法](https://bbh.bz/2019/11/10/how-to-use-latest-ver-boto-at-lambda/#boto-3)

ServerlessFrameworkの場合は、`serverless-python-requirements`のプラグインを入れてrequirement.txtに`boto3`と`botocore`を追記することで、最新化できます。

以下の記事が参考になります。
[【Tips】Serverless Frameworkで最新のboto3をインストールしたLambda Layerをデプロイする](https://dev.classmethod.jp/articles/serverless-framework-with-latest-boto3/)


## 解決
botocoreを最新化することで、エラーが解消しました。

参考
---
- [Lambda object has no attribute tag_resource #1306](https://github.com/boto/boto3/issues/1306)
gdm, lightdm の XDMCP 設定

[ディスプレイマネージャ](https://ja.wikipedia.org/wiki/X%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3)を用いてユーザーを切り替える [VNCサーバー](https://wiki.archlinux.jp/index.php/TigerVNC#.E3.83.9E.E3.83.AB.E3.83.81.E3.83.A6.E3.83.BC.E3.82.B6.E3.83.BC.E3.83.A2.E3.83.BC.E3.83.89) や、[X端末](https://ja.wikipedia.org/wiki/X%E7%AB%AF%E6%9C%AB) を使うときに、[ディスプレイマネージャ](https://ja.wikipedia.org/wiki/X%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3)を[XDMCP](https://ja.wikipedia.org/wiki/X%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3#X_Display_Manager_Control_Protocol) に対応させる必要がある。gdm と lightdm でその設定を紹介する。ディスプレイマネージャを動作させるコンピュータのキーボードと画面はgdmやlightdmで管理せずCUIだけで使うものとする（そうしないとgdmは動作しないしlightdmも挙動不審になるため）。また、人間が操作するコンピュータでPulseAudioが動作している場合に、音声入出力をそちらに送る方法も述べる。

# gdm の設定
Ubuntu の場合は `/etc/gdm3/custom.conf`, Debian の場合は `/etc/gdm3/daemon.conf` に以下を追加

```config
[xdmcp]
Enable=true
ShowLocalGreeter=false
```

# lightdm の設定
Ubuntu の場合 `/etc/lightdm/lightdm.conf.d/10-xdmcp.conf`, Debian の場合は `/etc/lightdm/lightdm.conf` に以下を追加

```config
[LightDM]
start-default-seat=false
lock-memory=false # こうしないと systemd-nspawn コンテナ内で動作しない
remote-sessions-directory=/usr/share/lightdm/sessions:/usr/share/xsessions:/usr/share/wayland-sessions

[XDMCPServer]
enabled=true
# もし必要なら listen-address=127.0.0.1
```

# 音声の設定
# 音声の送り方
これだけだと音が出ないので、ウェブブラウザなどを実行する計算機から音声をラズパイに送るように、を下記のファイルを設置することで指示する。

```$HOME/.xsessionrc
export PULSE_SERVER=音源がついている計算機のIPアドレスかホスト名
```

音源がついている計算機側のPulse Audio設定は https://qiita.com/kakinaguru_zo/items/e8e4e75eb2dea571608e#vnc-viewer%E3%81%A8pulseaudio%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%BD%9C%E6%88%90 を参照
AtCoderLibraryをCLionで使う


# はじめに

[ac-library](https://github.com/atcoder/ac-library)が出ました。

AtCoderでは、これからはデータ構造のライブラリを提供することで、少し難しめのデータ構造を使った問題がABCにも頻繁に出てくるようになるようです。

ac-libraryはC++で書かれたものであり、多言語のライブラリは有志がGitHub上で開発をしているようです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【ACL Contestについて】ACL Contestでは、ACLの内容を使用した問題が出題されますが、他言語でも出場することが可能です。<br>他ユーザと協力して、予めACLの内容を共有可能な形で準備しておくことをおすすめいたします。<br>（連絡はこのツイートのリプライ欄をお使いください）</p>&mdash; AtCoder (@atcoder) <a href="https://twitter.com/atcoder/status/1302977048017694720?ref_src=twsrc%5Etfw">September 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


ganariyaは普段CLionで使っているため、できればCLionでatcoderライブラリを使えるようにしたいと考えました。
（時間を見つけて　自分で実装したライブラリに移行したいですが　色々と忙しくできていない...）

# CLionで使う

https://atcoder.github.io/ac-library/document_ja/
を参考にatcoderフォルダを用意します。

その後、CLionのプロジェクト直下にatcoderフォルダを移してください。
以下のような画像になればOKです。

![スクリーンショット 2020-09-20 18.00.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211482/352f606a-b6df-3a67-6ca3-5179d9e982d0.png)


あとは`CMakeLists.txt`を開き

```
include_directories(.)
```

を最後の行などに追加すればOKです。
これまで通り実行ボタンを押すといい感じにCLionがやってくれます。

例)

```
cmake_minimum_required(VERSION 3.15)
project(CompetitiveProgramming)

set(CMAKE_CXX_STANDARD 17)

add_executable(CompetitiveProgramming main.cpp)

include_directories(.)
```

# 何が行われているのか

g++からは`g++ main.cpp -std=c++14 -I .`のコマンドでmain.cppをコンパイルできます。

この-Iオプションは`g++ --help`で調べると

```
  -I <dir>                Add directory to include search path
```

上記のように`カレントパスにあるディレクトリ(atcoderを含む)`をコンパイル時に入れている　のだと考えられます。（正確な理解ではないため、詳しい人がおりましたら教えていただけると幸いです。）
【VBA】思わずポチッと押したくなるボタンの作り方

こんにちは。
日曜日は、ためになるのかならないか分からない、そんなブログを書こうかなと思っています。
くだらない内容です。ご容赦ください。

今回は__思わずポチッと押したくなるボタンの作り方__です！

Excelマクロでは、挿入した好きな図形にマクロを登録できますが、より押したくなる、そしてボタンを押した感がでるボタンが欲しくて作りました。
お好きな処理と組み合わせて使ってみてください。


##ボタンを作成して加工する
まず適当な楕円の図を挿入して、ずの名前を__btnStart__とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700414/f248eb64-03b9-9bbc-9410-919c15bae071.png)

以下のマクロで図の設定を施します。

```vb
Sub btnStartSet() 'ボタンの作成
    Dim btnSheet As Worksheet
    Set btnSheet = ActiveSheet
    btnSheet.Shapes("btnStart").Select
'形、サイズ、名前
    btnSheet.Shapes("btnStart").Height = 50.2
    btnSheet.Shapes("btnStart").Width = 66.3
'塗りつぶし
    btnSheet.Shapes("btnStart").Fill.ForeColor.RGB = RGB(255, 0, 0) '塗りつぶしの色
'枠線
    Selection.ShapeRange.Line.Visible = msoFalse
'3D
    btnSheet.Shapes("btnStart").ThreeD.RotationY = -35.1560166667 '図形のY軸周りの回転角度
    btnSheet.Shapes("btnStart").ThreeD.FieldOfView = 45 '3-D図形遠近感
    btnSheet.Shapes("btnStart").ThreeD.BevelTopType = msoBevelArtDeco '面取り設定
    btnSheet.Shapes("btnStart").ThreeD.BevelTopInset = 10
    btnSheet.Shapes("btnStart").ThreeD.BevelTopDepth = 6
End Sub
```
これです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700414/edc7697e-7cca-57e1-60c3-ac4319d4c75d.png)
押したら何かが起こりそうなボタンです！
__「お…押してみたい…」__

##ボタンを押したあとの加工
作ったボタンに、__押した感__が出るように以下のマクロを登録して実行します。


```vb
Sub btnStartClick() 'ボタンを押したあとの加工
    Dim btnSheet As Worksheet
    Set btnSheet = ActiveSheet
    
    btnSheet.Shapes("btnStart").Select
    
    btnSheet.Shapes("btnStart").ThreeD.BevelTopType = msoBevelSlope '面取り設定
    btnSheet.Shapes("btnStart").ThreeD.BevelTopInset = 5.5 '3D加工の幅
    btnSheet.Shapes("btnStart").ThreeD.BevelTopDepth = 6 '3D加工の高さ
End Sub

```
押したら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700414/fef2846a-9405-cb25-c1ba-eced692c6ff2.png)
こうなります。
「ペコってなった！！」

##押す前の状態にリセットする
以下のマクロをリセットボタンに登録してリセットさせます。

```vb
Sub btnStartEnd() 'ボタンをリセット加工
    Dim btnSheet As Worksheet
    Set btnSheet = ActiveSheet
    
    btnSheet.Shapes("btnStart").Select
    
    btnSheet.Shapes("btnStart").ThreeD.BevelTopType = msoBevelArtDeco '面取り設定
    btnSheet.Shapes("btnStart").ThreeD.BevelTopInset = 10 '3D加工の幅
    btnSheet.Shapes("btnStart").ThreeD.BevelTopDepth = 6 '3D加工の高さ
End Sub
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700414/65484412-0a77-902a-8f20-77ed3ac5588e.png)
↓リセットする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700414/0956ab5c-eb38-cd42-088e-bba27992e49b.png)

##ちなみに
挿入＞3Dモデル＞"ボタン"で検索　にそれっぽいのもあるみたいです～
初めてみました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700414/1172497b-c0d5-fae5-d141-ed9fac4ab350.png)


##おまけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700414/1bbbd5ac-d0ea-ed6b-c723-eacf80d936a8.png)
押すなよって言われると押したくなるよね！
JUnit 試験用アノテーションまとめ

- 以下はJUnitの良く使うアノテーションの解説と例になります。

|No|アノテーション|解説|
|---|----|---|
|1|@Mock|モックにしたクラスのメソッドにスタブを作ってテストする|
|2|@BeforeEach|付与されたメソッドは各テスト/インナーテストクラスが実行される前に実行される|
|3|@AfterEach|付与されたメソッドは各テスト/インナーテストクラスが実行された後に実行される|
|4|@Nested|テストクラスのインナーテストクラスであることを示す|
|5|@Test|付与されたメソッドがテストであることを示す|
|6|@Disabled|付与されたメソッドはテストしないことを示す|
|7|@DisplayName|テストの表示名を付与する|
|8|@DirtiesMasterData|テスト用DBデータを改めて再投入したいとき利用する|
|9|@SequenceRestartBeforeMethod|指定するテーブルのシーケンスをデフォルト「１」から開始したいとき利用する|

###例
```
class Test {

    @Mock
    private ClassName xxxx;

    @BeforeEach
    void setup() {
        // 処理
    }

    @AfterEach
    void closedProcess() {
        // 処理
    }

　　@Nested
　　class innerClassT {
       
       @Test
       @DisplayName("テスト１")
       void test01() {
           // 処理
       }
       
       @Test
       @DisplayName("テスト２")
       void test01() {
           // 処理
       }
   }　　　

    @Disabled
    @Test
    @DisplayName("当メソッドの試験実施目的")
    void test01() {
        // 処理
    }

    @Disabled("試験しない理由")
    @Test
    void test02() {
        // 処理
    }

    @DirtiesMasterData
    //１テーブル名を指定する場合、「@DirtiesMasterData("table")」
    //複数テーブル名を指定する場合、「@DirtiesMasterData({"table_1", "table_2"})」
    @SequenceRestartBeforeMethod(name = "table_name")
    @SequenceRestartBeforeMethod(name = "table_name", restartWith = 22) // 22から開始する
    void test03() {
        // 処理
    }
}
```
【Rails】ビューに画像を表示する方法

初投稿です。
至らぬ点もあるかと思いますので暖かい目で見守っていただけると幸いです・・・

Railsで画像を表示する方法にかなり手こずったのでメモとしての記録です。
それでは早速参りましょう！

※haml・scssで記述しています。

<h1>画像を表示する方法</h1>
まずは、スタンダードに画像を表示する方法。
haml・scssどちらに書いても表示されるみたいです。
どっちに書くのが正解なのと思うところです。

個人的な印象としては画像を背景として使いたい時、
例えば画像の上にテキスト情報表示したい時とか。
そんなときは、background-imageとしてscssに記述したほうが良さげ。
ここの違いよくわからないので違いがわかる方いたらご教授いただきたいです:frowning2:

まず、表示する画像がないといけません。
app/assets/images
こちらのディレクトリーに表示したい画像を格納して準備完了です。

<h2>hamlに記述する場合</h2>

```ファイル名.html.haml
= image_tag ("画像名.jpg")
```

これじゃまだ表示できないんですよね。
widthとheightを設定してあげないと表示されません。
そんな時は、scssに画像を整える記述を書く必要があります。

```_ファイル名.scss
        img {
          width: 100%;
          height: 100%;
        }
```
こんな感じで、width: 100%;とheight: 100%;を指定すると無事表示されます。
今回の場合は「％」ですが「px」でも可能！
hamlで書く時は”= image_tag”これが必須ですね。

<h2>scssに記述する場合</h2>
```_ファイル名.scss
.クラス名 {
  height: 560px;
  width: 100%;
  background-image: image-url("ファイル名.jpg");
  background-size: cover;
  background-repeat: no-repeat;
  background-position: top center;
}
```
こんな感じで書くと表示できます。
background-sizeとかその辺のプロパティ書かないと、
画像が「ばぁぁぁぁあぁぁん」ってなります。（悲惨）
あとは、widthとheightの設定も必要です。
実装したいイメージにあったプロパティを選択する必要があります。

<h1>本番環境でのみ画像が表示されない</h1>
ローカル環境で表示されるのに、本番環境で表示されない・・・
なんてこともあります。

表示できないときのコードがこちら

```_ファイル名.scss
.クラス名 {
  height: 560px;
  width: 100%;
  background-image: url("ファイル名.jpg");
  background-size: cover;
  background-repeat: no-repeat;
  background-position: top center;
}
```

上のコードと見比べて違うところは

```_ファイル名.scss
.クラス名 {
  background-image: url("ファイル名.jpg");
}
```

この部分です。
この書き方だと、ローカルでは表示できるけど、本番では表示されません。

```_ファイル名.scss
.クラス名 {
  background-image: image-url("ファイル名.jpg");
}
```
このように修正することでで本番でもローカルでも表示できるようになります。

<h1>データベースにある画像を表示する方法</h1>
例えば、商品を登録するときに画像も登録することがあります。
登録した画像を表示したい！！そんな時の方法です。

<h2>◇条件1◇画像は別テーブルで保存する場合</h2>
別テーブルで保存する理由は、複数枚画像を登録するためです。
一枚だけ登録する場合は、テーブルを分ける必要はないかと思います。

```コントローラー名.rb
  def index
    @items = Item.includes(:item_images).order("created_at DESC").limit(5)
  end
```
こんな感じで情報を取得。
item_imagesは画像を保存している箇所です。

```ファイル名.html.haml
- @items.each do |item| #eachで展開
　= image_tag item.item_images[0].image.url
```
```_ファイル名.scss
        img {
          width: 100%;
          height: 100%;
        }
```
このように書くと表示できました。
正直、めっちゃ記述長い・・・そんな印象
[0]→画像は配列で格納されているみたいで何枚目かの指定をする必要があります。

<h2>◇条件2◇画像は別テーブルで保存しない場合</h2>
html.erbの記載となります。

```コントローラー名.rb
  def index
    @items = Item.order("created_at DESC").page(params[:page]).per(5)
  end
```
こんな感じで情報を取得。

```ファイル名.html.erb
<% @items.each do |item| %>
　<%= image_tag item.image.to_s, :size =>'220x220'%>
```

ちゃっかり、ファイル名.html.erb内でサイズ指定しちゃっています。
これで表示できました:clap:

他に、表示する方法あればご教授いただきたいです:pray:
実行できて見栄えも良いMarkdown手順書で快適な運用ライフを送ろう！


### 実行できる手順書(LC4RI)ってのご存じでしょうか？

ドキュメントとコマンドが混じって書いてあって、コマンド部分は実行できて、
その実行結果が載っています。
なので、**手順書として読めて、かつ実行した内容とその時の出力がエビデンスとしてとれるもので
運用作業者にとってはExcel手順書の置き換えにぴったし**なんですね

そういう書き方が出来るツールとしてjupyter notebookが良く使われているんですけど、
これが運用してみるとドキュメントの並び替えとか、編集が意外と面倒だったりする。

もっと普通のエディタで書けたら・・そう思ってました。したらヒラめいた！

### VSCodeのmarkdown編集機能を実行できるようにすれば良いんだ！！

# つくってみたわ

![lc4ri2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/1cd4535d-49d1-19c4-1532-3e60654e61f4.gif)

[VScodeのマーケットプレイスからインストールするならこちら](https://marketplace.visualstudio.com/items?itemName=yasutakatou.code-lc4ri)

こっちGit。

<a href="https://github.com/yasutakatou/code-lc4ri"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/yasutakatou/code-lc4ri.png" width="460px"></a>

# つかいかた

基本は普通のmarkdownと同じ書きっぷりです。**リスト**と**水平線**と**番号リスト**で変わります。

**VSCodeのカーソル位置から下にあるコマンドを実行していきます**。
なので、実行したい部分までカーソルを持ってってこの拡張機能を動かしてください。
（**ショートカットキーに拡張機能の実行を割り当てると超便利ですよ！**）

## リスト

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/3348b600-300e-62ef-a83f-b69478af163f.png)

実行したいコマンドを書きます。
タブでインデントをずらすと**AND条件**になります。
つまり、

- - ls existsfile.txt
	- \- rm existsfile.txt

でexistsfile.txtが無ければ削除しない、みたいな書き方ができます。

## 水平線

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/b21d9948-cdb4-52d3-17e9-56f74bd58469.png)

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/087009f2-bebe-c704-527b-8aea24724dfa.png)

コマンドの**実行範囲を区切ります**。区切らないとリスト表記のを上から順に実行しちゃいます。

## 番号リスト

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/f29b2638-4bc7-7774-3ca0-68461794ce10.png)

**変数をもてます**。**1.～9.の範囲で実行結果の出力を変数として格納します**。
重いコマンドとか何度も実行したくないものは結果を格納して使いまわせます。

# コンフィグファイル

以下のようなサンプルで設定ファイルを作れます（無ければ自動生成します）

```
{
  "timeout": 10000,
  "template": {
    "linux": "ssh user@192.168.0.1 {COMMAND}"
  },
  "changeWord": {
    "#HOME#": "/home/user"
  },
  "toutf8": true,
  "toterminal": true
}
```
## timeout

タイムアウト時間です。実行する時間が長いものはタイムアウトするようになってます

## template

OSの環境にあわせて各コマンドを実行するテンプレートを定義します。
例えばlinuxの環境だったら、全部SSH経由で実行するみたいな定義が出来ます

```
通常lsと書いた場合ローカルでlsコマンドを実行します
    - ls
ただ、定義をこのようにすると
    ssh user@192.168.0.1 "{COMMAND}"
全てSSH経由でリモート実行されるようになります
    ssh user@192.168.0.1 ls
```

## chageWord

ワードで文字列変更します

```
元の文字がこうなってて
    - ls #HOME#
定義がこうなってると
    "#HOME#": "/home/user"
このように置き換えて実行されます
    ls /home/user
```

## toutf8 

デフォオン(true)で、falseにするとSJISのまま処理されるはずなんですが・・・なんか手元だとうまく動かないですね。。

## toterminal 

trueに設定するとターミナルで直接実行します。↑のオプションがうまく動かない時はこちらで・・・

# あとがき

VSCodeのエコシステムが使えるので文章校正とか他の拡張機能の恩恵も受けれますね！
これで運用作業ドキュメントも見栄え良く、使いやすくなるものと思います。
GitHub の有効なユーザー名を正規表現で確認する（命名規約の確認）

> [GitHub 上の公開鍵](https://qiita.com/KEINOS/items/2abce1e5b15d799ac6d7)やリポジトリなど、何かしら GitHub にリクエストする前に URL に含めるユーザー名が **GitHub で有効なユーザー名かを正規表現でチェックしておきたい**。

[「github ユーザー名 正規表現」でググって](https://www.google.com/search?q=site:qiita.com+github+%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%90%8D+%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE)もドンピシャの記事が出てこなかったので、自分のググラビリティとして。

## TL; DR <sub><sup><sub><sup>（今北産業）</sup></sub></sup></sub>

```bash:grep(-E)の正規表現
^[a-zA-Z0-9]([a-zA-Z0-9]?|[\-]?([a-zA-Z0-9])){0,38}$
```

```bash:javascript
/^[a-z\d](?:[a-z\d]|-(?=[a-z\d])){0,38}$/i
```

- [`grep` の動作をオンラインでみる](https://paiza.io/projects/zTDF24ofNrCjmAI8aAkPBw) @ paiza.IO
- GitHub のユーザー名の命名ルール
    - `alphanumeric`（半角英数字） および `-`（ハイフン） であること
    - 連続したハイフンは使えない
    - ハイフンから始まる、もしくはハイフンで終わることはできない
    - 39 文字以内であること
- <font color=red>注意</font>
    - この正規表現は **GitHub の予約語はチェックしません**（例えば `help`, `about`, `pricing` など）
    - 命名ルールは https://github.com/join の入力時に表示されるツールチップの内容から得たものです。公式ドキュメントは見つかりませんでした

## TS; DR

```bash:sh/bash/dash

githubUsernameRegex() {
    name_input="$1"
    regex='^[a-zA-Z0-9]([a-zA-Z0-9]?|[\-]?([a-zA-Z0-9])){0,38}$'
    echo "$name_input" | grep -E "$regex" 1>/dev/null
    return $?
}

githubUsernameRegex 'a'         # true
githubUsernameRegex 'A'         # true
githubUsernameRegex '0'         # true
githubUsernameRegex '00'        # true
githubUsernameRegex 'a-b'       # true
githubUsernameRegex 'a-b-123'   # true
githubUsernameRegex 'ab-123-cd' # true
githubUsernameRegex 'a-b-c-d-e' # true

githubUsernameRegex ''         # false
githubUsernameRegex 'a b'      # false
githubUsernameRegex 'a_b'      # false
githubUsernameRegex 'a--b'     # false
githubUsernameRegex 'a-b-'     # false
githubUsernameRegex '-a-b'     # false
githubUsernameRegex 'a-b-c-d-' # false
githubUsernameRegex '38aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'    # true
githubUsernameRegex '39aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'   # true
githubUsernameRegex '40aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'  # false
githubUsernameRegex '41aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' # false
```
- [オンラインで動作をみる](https://paiza.io/projects/zTDF24ofNrCjmAI8aAkPBw) @ paiza.IO

### Node.js/Javascript/`npm`/`bower` ユーザー なら `githubUsernameRegex` がおすすめ。
  - [github-username-regex](https://github.com/shinnn/github-username-regex) @ GitHub


## 参考文献

- [github-username-regex](https://github.com/shinnn/github-username-regex) @ GitHub
メモ: 2038年問題の例

## 参考

* https://www.excellence-blog.com/2017/09/07/c%E8%A8%80%E8%AA%9E%E3%81%A82038%E5%B9%B4%E5%95%8F%E9%A1%8C/

## サンプル

```c
#include <time.h>
#include <stdio.h>

int main() {
        time_t test;
        time(&test);
        printf("今年は：%ld\n", (1970 + test/3600/24/365));

        test += 17*365*24*3600;
        printf("17年後は：%ld\n", (1970 + test/3600/24/365));

        test += 1*365*24*3600;
        printf("18年後は：%ld\n", (1970 + test/3600/24/365));

        return 0;
}
```

```go
今年は：2020
17年後は：2037
18年後は：1903
```

※32bit GCCでビルド。

## 情報

* (JST) 2038年1月19日12時14分8秒を過ぎると 1970年1月1日になる。
* `unsigned int` を使うと 2106年まで表現可能になる。
    * [警告C4244： '引数'： 'time_t'から 'unsigned int'への変換、データの損失の可能性あり - C++](https://stackoverrun.com/ja/q/2414666)
    * [組込み機器開発における2038年問題への対応事例](https://www.ipsj.or.jp/dp/contents/publication/39/S1003-1809.html)
* [Windows 2000 は 2099年まで](http://blog.livedoor.jp/blackwingcat/archives/1822179.html) これは面白い