OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel 5.5 で remember_tokenカラムを使わない方法


Laravel5.5でremember_tokenカラムがない状態ログアウトすると、`remember_token'カラムがないとエラーでました。

```php:User.php

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    protected $rememberTokenName = false; //ここ

```
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　
`Authenticatable`トレイトに`rememberTokenName`という、カラム名を指定できるものがあるのでこれをオーバーライドして`false`に設定します。
Microsoft Learn 32日目

2019年12月に Advent Calendar を使って [Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/) で学んでいく...と試みてなんとか完遂した([記事はこちら](https://qiita.com/advent-calendar/2019/d01tsumath_learn))。
しかし、スローペースだったのもあり25日間毎日受講しているとは言え、コースの半分しか終わってない。
そこで、「Azure の基礎」コースが終わるまで続けていこうと思う。毎日できるかは不明、でもがんばる。

と、いうことで。以下、受講記録のはじまりはじまり～。

1/1は
Azure におけるセキュリティ、責任、信頼
 - 共有ドキュメントを保護する
 - Azure Advanced Threat Protection
 - アプリケーションライフサイクル管理ソリューションのセキュリティに関する考慮事項を理解する
を受講した。

# Azure におけるセキュリティ、責任、信頼
## 共有ドキュメントを保護する
Microsoft Azure Information Protection (AIP とも呼ばれる) とは、組織がドキュメントと電子メールにラベルを適用して分類し、必要に応じてそれを保護するためのクラウドベースのソリューションのことである。
ラベルは、ルールと条件に基づいて自動的に適用するか、ユーザーが推奨設定を指定されている両方の組み合わせに基づいて手動で適用することができる。

## Azure Advanced Threat Protection
クラウドベースのセキュリティソリューションであり、組織を対象とする高度な脅威、侵害された ID、および悪意のあるインサイダーによるアクションの識別、検出、調査支援を行う。
### Azure ATP コンポーネント
#### Azure ATP ポータル
Azure ATP には独自のポータルがあり、それを使用して不審なアクティビティを監視して対応できる。
Azure ATP インスタンスを作成し、Azure ATP センサーから受信したデータを表示することができ、またポータルを使用して、ネットワーク環境内の脅威を監視、管理、および調査することも可能。
#### Azure ATP センサー
ドメイン コントローラーに直接インストールされているもの。
センサーでは、専用サーバーを必要とせずに、またポートのミラーリングを構成することなくドメインコントローラーのトラフィックが監視される。
#### Azure ATP クラウド サービス
Azure インフラストラクチャ上で実行され、現在、米国、ヨーロッパ、およびアジアでデプロイされている。

### Azure Advanced Threat Protection の購入
Azure ATP は、Enterprise Mobility + Security E5 スイート (EMS E5) の一部として、およびスタンドアロンライセンスとして使用可能。
ライセンスは、Enterprise Mobility + Security 料金オプションのページから直接取得するか、クラウドソリューション プロバイダー (CSP) ライセンスモデルを介して取得することができる。

## アプリケーションライフサイクル管理ソリューションのセキュリティに関する考慮事項を理解する
Microsoft セキュリティ開発ライフサイクル (SDL) では、開発プロセスのすべてのフェーズに、セキュリティとプライバシーの考慮事項が導入されている。
開発者が高度にセキュリティで保護されたソフトウェアを構築し、セキュリティコンプライアンス要件に対応し、開発コストを削減するのに役立つ。
### トレーニングの提供
開発者、サービスエンジニア、プログラムマネージャー、プロジェクトマネージャーは、セキュリティの基本を理解している必要である。
効果的なトレーニングは、セキュリティポリシー、SDL のプラクティス、標準、ソフトウェアセキュリティの要件を補完および強化し、データまたは新たに利用可能になった技術機能を通じてもたらされる分析情報によって導かれる。

### セキュリティ要件を定義する
使用する開発方法に関係なく、セキュリティ要件は、必要な機能の変更と脅威の状況の変化に対処するために、継続的に更新する必要がある。
主に、セキュリティ要件に影響を与える要因には以下が含まれる。

* 法的要件と業界要件
* 内部標準とコーディング方法
* 以前のインシデントのレビュー
* 既知の脅威

### メトリックとコンプライアンスレポートを定義する
組織では、許容される最低レベルのセキュリティ品質を定義し、その条件を満たす責任をエンジニアリングチームに課すことが不可欠。
主要業績評価指標 (KPI) を追跡し、セキュリティ タスクを確実に完了させるには、組織によって使用されるバグ追跡メカニズムや作業追跡メカニズム (Azure DevOps など) で、セキュリティの欠陥やセキュリティ作業項目にセキュリティと明確にラベルを付け、適切なセキュリティ重要度でマークできるようにする必要がある。

### 脅威モデリングを実行する
重要なセキュリティ リスクがある環境では、脅威モデリングを使用する必要がある。
脅威のシナリオに構造化されたアプローチを適用すると、チームがいっそう効率よく低コストで、セキュリティの脆弱性を識別し、それらの脅威からのリスクを特定して、セキュリティ機能の選択と適切な軽減策の確立を行うのに役立つ。

### 設計要件を確立する
SDL は、一般に、エンジニアがより安全な機能を実装するのに役立つ保証アクティビティと見なされ、セキュリティに関して機能が適切に設計されていることを意味する。
多くの場合、セキュリティ機能の選択または実装は非常に複雑であるため、設計や実装の選択によって脆弱性が生じる可能性があるため、それらが一貫して適用されそれらによって提供される保護が一貫して理解されていることが非常に重要である。

### 暗号化標準を定義して使用する
モバイルおよびクラウドコンピューティングの増加により、セキュリティが重要な情報および管理データや制御データを含むすべてのデータが、転送時や格納時に意図せずに公開または変更されないように確実に保護されることが重要。
通常、この保護を実現するには暗号化が使用されるが、暗号化のどの側面についても使用時に正しく選択しないと、重大な結果になる可能性がある。
そのため、暗号化の実装のすべての要素に関する詳細情報を提供する明確な暗号化標準を開発することがベター。

### サードパーティのコンポーネントの使用によるセキュリティリスクを管理する
使用するサードパーティ製コンポーネントを選択するときは、それらに含まれるセキュリティの脆弱性が、統合されたより大きいシステムのセキュリティに与える影響を、理解しておくことが重要。
これらのコンポーネントを正確に把握し、新しい脆弱性が発見されたときの対応を計画することは、このリスクを軽減するのに大きな効果がある。

# おまけ。
年越す瞬間まで起きていられず、今回は目覚めたら年明けちゃってました。
2020年、良い年にできるよう元気にヲタ活＆筋トレと、技術向上図っていこうと思い...Muscle☆
コピペで試せる！Pythonのnetworkxでかっこいいネットワーク図を描いてみよう

## 冬休みはかっこいいネットワーク図が描けるnetworkxでネットワーク図を描いてみよう

みなさまはいい冬休みを過ごしていますか？わが社は28から5日までお休みをいただき本当にネズミに感謝している日々です。

でも技術者はこういった時こそマック難民をして自己の技術を研鑽させるべきだと思います。

今日はnetworkxというネットワーク図が描けるライブラリを紹介します。

- 今回のワークの所要時間：10分程度
- 用意するもの
 - Python 3.x
 - jupyterhub(pandasとmatplotlibをインストールしておいてください)

## インストール

``` bash
(venv)$pip install networkx
```

## まずはデータをpandasでデータをロードします

``` python
import pandas as pd
df_links = pd.read_csv('https://microlearning.site/pydata/ch8/links.csv')
df_links.head(20)
```

以下のような表がロードされていることを確認してください。関係があるネットワーク同士は1になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/0052853c-c790-57d3-b8c9-1abd2df111de.png)

## いよいよネットワーク図を描画

ネットワーク図の描画は以下です。

``` python
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
NUM = len(df_links.index)
for i in range(1,NUM+1):
    node_no = df_links.columns[i].strip("Node")#「Node」の文字を除去
    G.add_node(str(node_no))

for i in range(NUM):
    for j in range(NUM):
        if df_links.iloc[i][j] == 1:
            G.add_edge(str(i),str(j))

nx.draw_networkx(G,nide_color="k",edge_color="k",font_color="w")
plt.show()
```
何をしているかざっくりと説明させていただくと、まずノードを追加して
表のノード同士が1になっている部分(関係している部分)を線で結んでいます。

すると、以下のようなネットワーク図が表示されます(毎回表示は異なります)
各ノードと関係が濃い番号が中心に来ています。(4や5など)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/35b70bbe-9dc6-812b-7e91-2e375decd6ee.png)

お疲れさまでした。実行するたびに形が異なります。試してみてください。

## 更新履歴

- 2020/1/1 新規作成
ReactのRedux

# はじめに
ReactのReduxに関するメモ。
[ReactのクラスコンポーネントとかJSXとかコンテキストとか調べてみた](https://qiita.com/hot_study_man/items/1c4da88e0b2814796fca)の続き

# 参考
[React.js&Next.js超入門](https://www.amazon.co.jp/React-js-Next-js%E8%B6%85%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798056928/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=react&qid=1577723599&sr=8-1)

# Redux
* **複数のコンポーネント、アプリケーション全体で使うような値をまとめるもの**
  - this.stateはコンポーネント単位で存在する
* 値や処理をアプリ内で統合し管理するための仕組みのライブラリ
* 値の保管は場所は一つだけ
  - アプリケーションごとに一つだけ
* 値は読み取り専用、書き換え不可
* 変更は単純な関数で用意

### インストール
```bash
npm install --save redux
npm isntall --save react-redux
npm isntall --save redux-devtools
```

### 仕組み
* ストア
  - 値を保管するステートと、値の操作処理であるレデューサーを内部に持っている
* プロバイダー
  - ストアを他のコンポーネントに受け渡すための仕組み
* レデューサー
  - ストアに保管されているステートを変更するための仕組み

Reduxの値の管理は、上記3つでできている

## ストアの作成
変数= createStore(レデューサー);

作成されたストアを変数に収めておき、それを画面表示のJSXでプロバイダーに渡して利用

## コンポーネントにストアを接続

```react

変数=connect(ステート)(コンポーネント);
```
これでthis.props.ストアの値とthis.props.dispatｃｈが使えるようになる

```react

変数=connect()(コンポーネント);
```
これはステートを使わずthis.props.dispathを使えるようにする

### providerでストアを受け渡す
```react

<Provider store={store}>
  <APP/>
</Provider>
```

# redux全体
index.jsでステート、レデューサーを定義して、renderでAppコンポーネントを利用。
Appコンポーネントの中で各コンポーネントを利用、ストアを使いたいコンポーネントだけプロバイダーでくくりその中でコンポーネントを利用する
Appコンポーネントで利用するコンポーネントの定義とコンポーネントとストアを結びつけることで、各コンポーネントから
dispatchからレデューサーを利用する

# データの永続化 Redux Persist
Reduxのストアのデータをブラウザのローカルストレージに保存する

```
npm install --save redux-persist
```
Raspberry pi初期設定（自分用）

#背景と概要
通常Raspberry Pi（以下RPi） をセットアップするとき、SDカードにイメージを焼き込んだあと、HDMIディスプレイとUSBキーボードを RPi に直接接続して色々と設定します。しかしいちいちディスプレイとかキーボードに繋ぐのめちゃくちゃ面倒くさいかつ自分の覚書きのためにこの記事を書きます

#環境
・Windows10
・raspberry pi 3 model B 
・有線LAN

#1．OSのイメージ作成
OSダウンロード
・https://www.raspberrypi.org/downloads/raspbian/

SDカードフォーマット
・https://www.sdcard.org/downloads/formatter/eula_windows/index.html

SDカードにOSイメージを書き込み
・https://www.balena.io/etcher/

#２．設定
最上位に"ssh"という名前の空フォルダを作成
（これでRPiを起動したときにsshの自動起動ができる）

RPiを有線LANに繋いで起動する

tera termから以下を打ち込んでssh接続

ホスト名　：raspberrypi.local
ユーザー名：pi
パスワード：raspberry

#３．Wi-fi設定
以下のコードを打ち込んで手順に従ってSSIDとパスワードを入れつ

```ruby:rasbian
$ sudo raspi-config
```

#４．固定ipアドレス設定
```
$ sudo nano /etc/dhcpcd.conf
```

以下のコードを末尾に追記

```
interface wlan0
static ip_address=192.168.1.221/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
```

あとはtera termでipアドレス=192.168.1.221としてsshでつなげばよろしい

#参考文献
https://qiita.com/eup42/items/58bf6c336d325eba3ee2
https://qiita.com/mym/items/468d2cdb30d756b6df24
http://www.fml.org/home/fukachan/ja/linux.share.network.debian.html
https://qiita.com/yuppejp/items/413b32d14d58c10e192c
https://physical-computing-lab.net/raspberry-pi/raspberry-pi-3-%E3%81%AE%E7%84%A1%E7%B7%9Alan%E3%81%AB%E5%9B%BA%E5%AE%9Aip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B.html
RuboCopはじめました


Railチュートリアルをカンニングしながらインスタクローンを作っているのですが、RuboCopを導入してみました

初期設定で色々と戸惑ってしまったので、対処方法を自分用にまとめます


##RuboCopとは
[Ruby Style Guide]に則ってコードを自動修正してくれたり、誤った書き方を指摘してくれるgemです

公式ドキュメント
https://docs.rubocop.org/en/stable/

GitHub
https://github.com/rubocop-hq/rubocop


[Ruby Style Guide]:https://rubystyle.guide/

##インストール方法

###直接インストール

```
$ gem install rubocop
```

###Gemfileからインストール
```ruby:Gemfile
gem 'rubocop', require: false
```

ドキュメントによると、RuboCopはアップデートによって過去のバージョンと互換性のない変化を起こすことがあるらしいので、不測のアップデートを避けたい方はこちらの方法でとのこと

```ruby:Gemfile
gem 'rubocop', '~> 0.78.0', require: false
```

##基本的な使用方法

以下のコマンドを実行するだけ。

```
$rubocop
```

このままだとどこが規約違反なのか指摘してくれるだけなので、自動で直して欲しい時は-aを付け加える

```
$rubocop -a
```
こうするとインデントなどの小さな規約違反を自動で直してくれます

自動で直してくれない部分は自分で直す必要あり

ただデフォルトの設定は少し厳しすぎるので、自分で設定を変更してみます

##設定を変える

設定を変える方法はルートディレクトリに.rubocop.ymlというファイルを作り、そこに設定を書き込んでいくだけでオーケーです

以下は自分が最初に行っておくべきと感じた設定です

```ruby:.rubocop.yml

LineLength:
  Max: 100
  
Documentation:
  Enabled: false
  
AsciiComments:
  Enabled: false
  
MixinUsage:
  Enabled: false
  
ClassAndModuleChildren:
  Enabled: false
```

Rails newした直後にrubocop -aを実行してもかなりの数の規約違反が出てきてびっくりすると思いますが、とりあえずこの設定にしておけばRails newの直後からrubocop先生に怒られることはないと思います

またどんな設定があるのかは、ググるよりもGitHubのソースコードを見た方が早いです

rubocop -aを実行して怒られた箇所をGitHubのソースコードから探してみましょう

##最後に

自分用なのでかなり雑に書いています。申し訳ないです。

また、おかしい部分がありましたらご指摘ください
EmacsやVimなどのCLI系のエディタを使っていた人がVSCodeに移行するときにおすすめのZen mode

私はこれまで5年ほどずメインエディタとしてEmacsを使っていたのですが、今後開発環境とクラウドとの連携、機械学習が用いられた開発環境の改善などの技術的な進化を考えると、Emacsを使い続けるのもリスクだな〜と考えてVSCodeも使えるように練習をし始めました。

ただ、なかなかEmacsで慣れ親しんだ、全てキーボードで操作する感覚と、VSCodeのGUIで操作する感覚(ショートカットもあるが)がうまく馴染まずに苦戦していたのですが、VSCodeに「Zen mode」というモードがあることを知って、使ってみると「お、移行できそう！！」と手応えをつかめたので紹介したいと思います。

# Zen modeとは
Zen modeとは、VSCodeがUI要素が最小限になり、コーディングに集中しやすい画面にできるモードです。
自分がVSCodeやIDE系のリッチなGUIエディタが苦手でEmacsなどのCLI系のエディタが好きな理由が、UI要素が多いと目が散らばるのと、コードを表示するエリアがその分小さくなって集中しづらいというのが大きな原因でした。

このZen Modeを使うとEmacsをCLIで使っているのと似たようにUI要素が少なくコード表示が最大限を使えるので僕にとっては移行する上でのハードルが大きく下がり、Emacsを使っているのと似た感覚でコードを書くことに集中しやすくなりました。

またZen Modeを使うことでショートカットキーを覚えることが矯正されるので、Emacsと同じようにキーボードだけで大半の操作を出来るようになります。

![](https://code.visualstudio.com/assets/docs/getstarted/tips-and-tricks/zen_mode.gif)

## ショートカットキー
「Command + K」 + 「Z」で Zen Mode を切り替えることができます。(macosの場合)

## Zen Modeでも行番号を表示する
デフォルトだとZen modeにすると行番号も非表示になります。
Zen Modeを使っていても編集画面に行番号はほしい場合は、Preference > Workbench > Zen Mode > Hide Line Numbersのチェックボックスを外すと、行番号が表示されます。

![スクリーンショット 2019-12-10 16.26.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26205/b9a5e91f-c174-3826-c7ec-7c6a09c02230.png)


# 参考URL
- [Zen mode](https://code.visualstudio.com/docs/getstarted/tips-and-tricks#_zen-mode)
2足歩行ロボットの製作1（Microbit、 サーボモータ使用）

Microbit、サーボモータを使た2足歩行ロボットを製作しました。

###2足歩行メカ部分
2足歩行のメカ部分は、下記の作り方を参考にしました。
1. [3Dプリンタ/金属加工不要、サーボ代込み5000円でつくる2軸2足歩行ロボット筐体](https://qiita.com/Google_Homer/items/bf269828fbdf3ce83a8e)
2. [小学生でも作れる2軸2足歩行ロボット筐体(サーボ代込み2500円)](https://qiita.com/Google_Homer/items/5d62f9966f1f9a9777e0)

参考にしたものに少し改良を加えています。
上足を固定した写真。（写真では下側になっています。）
![P_ulfix.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/97177fa4-805d-2ff8-613f-5fd83bfdf8ef.jpeg)
上足（腰の回転）の固定は、ブレットボードにM2のねじでホーン（回転軸を固定する部品）を固定しています。（十字ホーンの長い方の4つ目の孔をM2のドリルの歯で少し広げてM2ｘ8（10）+ナットで固定しています。


前からの写真。
![Front.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/24d8a3d1-bf50-9ee2-b1ff-4ef8037640f4.jpeg)

後ろからの写真。
![Back.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/1ede5f92-b317-4cfc-c98d-6bd5e5acbfeb.jpeg)
下足は前だけの支えだと不安定だったので、後ろからM3のねじで押さえつけています。（M3ｘ10、M3ナット2個/1足あたり）ねじを固定するプラスチック部品は、前から支えるものと同じもので、接着剤で下のボードのに固定しています。

###サーボモータボード

サーボモータを動かすボードは、DFROBOTのボードを用いました。
[Micro:bit Driver Expansion Board SKU:DFR0548](https://www.dfrobot.com/wiki/index.php/Micro:bit_Driver_Expansion_Board_SKU:DFR0548#More_Documents)
詳しくは、こちらの記事を参考にしてください（DCモータとサーボモータ両方制御できます）。
[Microbit:DC motor制御（DFROBOTボード）](https://qiita.com/Gyutan/items/08182be2eea552bbed64)
電源は、単三電池4本の6Vを使用しています。


###2足歩行ロボット用　初期角度設定プログラム

サーボモータをホーン（回転軸に固定する部品）を固定するにあたり、サーボモータをまず90度まで回転させます。（使用しているサーボモータが±90度ですので、90度の位置を仮の原点にします。）

組み立てると、微妙に角度のずれが生じ、ちゃんと直立した状態になっていません。下記のプログラムでその角度のずれを調べて、組みあがったものの原点とします。
![dfservo_carib.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/1440fcb1-e3ee-0758-796a-d017e9b7ed13.png)

####使い方
サーボモータをS1からS4に接続します。
S1、S2、S3、S4の順に調整していきます。
Aボタンを押すと角度が+の方向に回転します。
Bボタンを押すと角度が-の方向に回転します。
A+Bボタンで確定して、その角度を表示（2回表示）して、次のモータに移ります。

####プログラム概略説明

変数は3つあります。
ang:　角度の値
mp:サーボモータの番号
incr:サーボモータを変化させる角度の大きさ

最初だけでは、すべてのモータを基準となる角度90度に設定します。
Servo_select関数は、モータ番号によってサーボモータのIOポートが変わるので、それをまとめています。
オレンジ色のブロック（DFROBOTの拡張ライブラリー）の部分を書き換えると他のボードでも使うことができます。
A+Bボタンを押すでは、ボタンを押すたびにmpの数が増えますが、4が終わるとまた1に戻ります。そして、調整した値を2回表示します。
モータ番号と、回転方向（+と-で動く方向）、調整した値は紙にでも記録しておいてください。
私の場合、左下足：1（S1）、左上足（腰の部分）：2（S2）、右下足：3（S3）、右上足（腰の部分）：4（S4）としています。足や腰が平行や垂直になる角度は、それぞれ、83、81、94、96でした。製作によって変わるので、このプログラムを参考に調べてみてください。

2足歩行の歩行プログラムは次回以降に。
商業登記に基づく電子認証制度のルート証明書の更新頻度が3年に1回に削減

# 概要

[法務省のサイト](http://www.moj.go.jp/ONLINE/CERTIFICATION/REGISTRY/registry12.html)によると、従来1年に1回であった、商業登記に基づく電子認証制度のルート証明書の更新頻度が、2019年以降は3年に1回に削減されるとのことです。

これにより、サードパーティ製のソフトウェアを使わずAdobe AcrobatのみでPDFファイルに対して電子署名をする場合に、OCSPレスポンダの署名が毎年切り替わる影響で、毎年証明書を取得し直さざるを得なかった手間が緩和されると思われます。

なお、[e-Gov電子申請](https://www.e-gov.go.jp/)などでは、本記事に記載の方式（PDFファイル自体への署名埋め込み）とは異なる方式で電子署名が行われていますので、本記事の内容は当てはまりません。

# ルート証明書の更新

商業登記に基づく電子認証制度のルートCAは、東京法務局登記官（電子証明書上の`Common Name`は`Registrar of Tokyo Legal Affairs Bureau`）となり、[その証明書は法務省のサイトより入手可能](http://www.moj.go.jp/ONLINE/CERTIFICATION/REGISTRY/registry12-1.html)です。

ルート証明書は定期的に切り替わり、2019年末現在まで、以下のように変遷しています。


| 有効期間開始日 | 有効期間終了日 |
|:--|:--|
| 2000-10-10 | 2004-01-09 |
| 2001-10-10 | 2005-01-09 |
| 2002-10-10 | 2006-01-09 |
| 2003-10-10 | 2007-01-09 |
| 2004-10-10 | 2008-01-09 |
| 2005-10-10 | 2009-01-09 |
| 2006-10-10 | 2010-01-09 |
| 2007-10-10 | 2011-01-09 |
| 2008-10-10 | 2012-01-09 |
| 2009-10-10 | 2013-01-09 |
| 2010-10-10 | 2014-01-09 |
| 2011-10-10 | 2015-01-09 |
| 2012-10-10 | 2016-01-09 |
| 2013-10-10 | 2017-01-09 |
| 2014-10-10 | 2018-01-09 |
| 2014-11-29 | 2018-02-28 |
| 2015-11-29 | 2019-02-28 |
| 2016-11-29 | 2020-02-28 |
| 2017-11-29 | 2021-02-28 |
| 2018-11-29 | 2022-02-28 |
| 2019-11-29 | 2025-11-28 |

# OCSPレスポンダの署名とその切り替わりの影響

ルートCAが発行した証明書が失効していないかを問い合わせるための仕組みとして、商業登記に基づく電子認証制度では、失効した証明書の一覧を単純にダウンロードさせるCRL（証明書失効リスト）ではなく、OCSP（Online Certificate Status Protocol）を用いています。OCSPでは、OCSPレスポンダと呼ばれるサーバに問い合わせを行うことで、個別の証明書の有効性を検証できます。

商業登記に基づく電子認証制度のルートCAでは、ルート証明書の切り替わりに際してもOCSPレスポンダのエンドポイント（アドレス）が切り替わることはないようで、OCSPレスポンダの応答は、その時点で有効な最新のルート証明書により署名されています（ある時点で有効なルート証明書は複数あることにご注意ください）。すなわち、例えば2019年以前の数年間は、毎年日本時間11月29日午前0時にOCSPレスポンダの署名が切り替わっていました。

この結果、毎年11月29日より前に発行された電子証明書を用いて文書を署名しようとしたときに、OCSPレスポンダの応答の署名者が、対象文書を署名しようとしている証明書を発行したCAと異なるため、Adobe Acrobatのデフォルトセキュリティ機能では、失効確認に失敗してしまい署名ができない（正確には、署名時点の失効ステータスを文書に含めることができない）という問題がありました。

OCSPレスポンダの応答の署名が切り替わること自体は、公開鍵基盤の仕様としては問題なく、切り替わったルート証明書間の信頼を示すリンク証明書を用いて有効性検証を行えば良いのですが、現時点のAdobe Acrobatのデフォルトセキュリティ機能では、リンク証明書を用いた有効性検証には対応していないようです。この問題に関しては、[こちらのページにも参考情報があります](http://www.langedge.jp/blog/index.php?itemid=649)。

なお、[法務省のサイトに案内のあるサードパーティ製の有償ソフトウェア](http://www.moj.go.jp/MINJI/minji06_00031.html)では、OCSPレスポンダの署名が切り替わるタイミングを超えても、証明書の有効期間内であれば、署名可能になっています。


# まとめ

冒頭に記載の通り、2019年以降はルート証明書の更新頻度が3年に1回に削減されるとのことですので、Adobe Acrobatのデフォルトセキュリティ機能のみで電子署名を行う場合に、毎年11月29日に電子証明書の再発行を余儀なくされていた問題は緩和されると思われます。

なお、[商業登記に基づく電子認証制度による電子署名をAdobe Acrobat Readerのみで検証する方法は、このページ](https://yodoware.co.jp/ja/signature/)に記載があります。また、[実際にAdobe Acrobatのデフォルトセキュリティ機能で署名された文書の例は、このページの法的文書（公告）](https://yodoware.co.jp/ja/aboutus/)で確認できます。
オブジェクト指向は iPhone アプリ開発で、どのように役立っているか

##はじめに
先日、
[BASIC から来た手続き型おじさんが、「手続き型」「関数型」「オブジェクト指向」について考える。](https://qiita.com/BMJr/items/7297e9a156a7187d130b)
というタイトルで投稿しました。
この中で、
> swift で iPhone アプリを開発する時は、オブジェクト指向を特に意識しなくても存分にオブジェクト指向の恩恵を受けています。

と述べました。
本稿では私が実際に App Store に公開しているアプリで解説します。

##肝硬変重症度Child分類
これは消化器内科・外科医向けのアプリ*で肝硬変重症度 Child 分類が簡単に算出できます。
2010年に公開して以来、4万人以上の方々にダウンロードして頂きました。
総ビリルビンやアルブミンなどの値を選択すると Child 分類と点数が表示されます。
以下がスクリーンショットとソースコードです。
![ChildSCRN.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193431/d01b2c55-be07-fdb0-7429-53d9291bffec.gif)

```swift
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet var bilirubin:UISegmentedControl!
    @IBOutlet var albumin:UISegmentedControl!
    @IBOutlet var pt:UISegmentedControl!
    @IBOutlet var fukusui:UISegmentedControl!
    @IBOutlet var nosho:UISegmentedControl!
    @IBOutlet var childIndex:UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func selectorChanged(){
        let b = bilirubin.selectedSegmentIndex + 1
        let a = albumin.selectedSegmentIndex + 1
        let p = pt.selectedSegmentIndex + 1
        let f = fukusui.selectedSegmentIndex + 1
        let n = nosho.selectedSegmentIndex + 1
        let childPoint = b + a + p + f + n
        var childGrade = "A"
        switch childPoint {
        case 5 ... 6:
            childGrade = "A"
        case 7 ... 9:
            childGrade = "B"
        case 10 ... 15:
            childGrade = "C"
        default:
            break
        }
        childIndex.text = "Child \(childGrade)  \(childPoint)点"
    }
}
```
わずか30行足らずのコードです。
bilirubin, albumin, pt, fukusui, nosho などは UISegmentedControl クラスのインスタンスで childIndex は UILabel クラスのインスタンスです。
我々開発者は UISegmentedControl クラスや UILabel クラスの内部ロジックを知らなくても使うことができ（隠蔽）、 UISegmentedControl クラスや UILabel クラスの内部を書き換えることはありません（カプセル化）。

##おわりに
クラス化された UI 部品（オブジェクト）を組み合わせることで、私のようなアマ・プログラマーでも iPhone アプリを作ることができるのはオブジェクト指向の恩恵だと思います。

*医師向けアプリです。
[肝硬変重症度Child分類・消化器癌進行度分類](https://apps.apple.com/jp/app/id375548945)
Vue.js+Flaskの環境構築備忘録〜Anaconda3を添えて〜

## はじめに
私が愛用しているFlaskでVueを使いたくなったので環境構築手順をメモしておきます。
自分用の走り書きです。

## 登場人物
- Vue.js（Vue CLI）
- Flask
- Anaconda3

## 手順
### conda仮想環境の作成
Anaconda3で必要なライブラリをインストールした仮想環境を作る。
僕は大概、conda環境の中身にscriptsという開発フォルダを作成しています。
なので、その中にflaskフォルダとvueフォルダを作成します。

### flask環境構築

```python
from flask import Flask, render_template, request, jsonify, make_response, send_file
app = Flask(__name__, static_folder='../vue/dist/static', template_folder='../vue/dist')

@app.route('/')
def index():
	return render_template('index.html')

if __name__ == "__main__":
    app.run()
```

template_folderとstatic_folderでvueのビルドフォルダを指定しておく。



### vueアプリケーション作成とビルド設定
vueフォルダにアプリケーションを作成します。
僕はvue uiでサクッと作成します。
vueフォルダ直下にvue.config.jsという設定ファイルを作成し、以下のとおりにします。

```javascript
module.exports = {
    assetsDir: 'static',
  };
```

.jsファイルやらを全てdist/staticフォルダに保存するという設定です。

##完成
vueでビルド後にflaskサーバを起動すれば、vueアプリケーションが読み込まれます。
history | grep XXX と!履歴番号を駆使して過去に実行したコマンドを再実行する

#はじめに
ターミナル上で過去実行したコマンドの検索はどの様に行なっていますか？
ctrl+r 派でしょうか。それともhistory | grep XXX 派でしょうか。

筆者の個人的な意見ですが、
ctrl+rは結果が一行しか出ないので見辛い、かつ、ctrl+rで目的の履歴に一致するまで遡るのがめんどくさい。かといってhistory | grep XXXXだと出力結果からコピペするのがメンドくさいです。

# そこでhistory | grep XXX と !(感嘆符)履歴番号を使う
筆者はsshしたホスト名を結構な頻度で忘れます。今回もsshrc[^1]で過去のコマンド検索して実行してみます。

```
$ history | grep sshrc
  194  vim .sshrc
  197  . .sshrc
  200  vim .bashrc[[ -f ~/.sshrc ]]
  201  [[ -f ~/.sshrc ]]
  202  [ -f ~/.sshrc ]
  203  test -f ~/.sshrc
  204  test  ~/.sshrc
  209  [ -f ~/.sshrc ]; echo $?
  210  [[ -f ~/.sshrc ]]; echo $?
  214  . .sshrc
  242  sshrc uni-dev
  243  sshrc uni-pra
  361  history | sshrc
  362  history | grep sshrc
  364  sshrc bot-event
  372  vim .sshrc
  373  cd  .sshrc
  378  sshrc
  379  history | sshrc
  380  history | grep sshr
  383  sshrc bot-event
  394  vim .sshrc
```
```
$!383
!508
sshrc bot-event

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
/etc/update-motd.d//30-banner:


       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
Last login: Wed Jan 1 13:35:36 2020 from kd027095113068.p
```
無事にsshできました。簡単ですね。

# おわりに
history | grep sshrcしたけど、このホスト名はどのサーバだっけ...？となりそうで筆者は怖いです。ホスト名はわかりやすくしようね！

[^1]: sshrcの概要：https://qiita.com/ikuwow/items/ba4ca57fd67c06fd1b19
【#PowerApps Tip's】LoadingSpinner

新年あけましておめでとうございます。2020年もボチボチとユルユルとPower Apps を中心にPower Platform なコトをネタにしていこうかと考えておる次第です。というコトで、今後ともよろしくお願いいたします。

さて、新年1発目のネタは Screen にある「LoadingSpinner」プロパティです。

# LoadingSpinner について
画面遷移時に、画面のデータ、ないしコントロールが揃うまでローディングのグルグルを表示するアレです。たぶん。

なぜ”たぶん”なのか？

実は、LoadingSpinner プロパティに関しては公式情報が一切無いプロパティなのです（2020年1月1日現在）。

いろいろと検証してみた結果のまとめなので、誤っていたら申し訳ありません。個人的な印象ですと、遷移先の画面に設定されているコントロール、ないしデータの読み込みが完了するまで、ローディングのグルグルを表示する仕組みで、それ以上でもそれ以下でも無さそうです。

## 設定する箇所
ローディングを表示したい画面（Screen）を選択し、LoadingSpinner プロパティを選択して下記のパラメータを指定します。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/76cf7a00-49e6-8ffb-ab24-f0ff743f6627.png)


■パラメータ
　LoadingSpinner.Controls
　LoadingSpinner.Data
　LoadingSpinner.None（デフォルト値）

デバッグ表示で確認すると、値は上から、0、1、2 です。

なお、このプロパティは「画面遷移時」にしか発動しないようです。なので、動作を確認するためには、他の画面からの移動（Navigate）する必要があります。
パラメータの名称から想像すると”Controls”は遷移先の画面コントロールが全てロードされるまで？で、”Data”の場合はデータソースが全て読み込まれるまで？と思います。が、前述通り明確な公式資料がないため真相は不明です。そして、どっちを選んでも同じぐらいのローディングになります（※経験則です）。

# LoadingSpinner.None
わざわざ説明する必要はないかもしれませんが、デフォルト値のLoadingSpinner.None を指定した場合の動作です。
![None.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/b208eb5b-a604-2d24-179c-dc58def807ad.gif)


# LoadingSpinner.Data（ないし、Control）
LoadingSpinner.Data を指定した場合の動作がこちらです。

![Data.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/1adc36d9-b797-b6f6-2ead-feeb923a2df9.gif)


描画に時間がかかるように、遷移先の画面には SharePoint Online の List をデータソースにしたギャラリー(データ数 1024件)と、テーブルコントロールが２つ無理やり置いてあります。なお、参照しているデータソースは全て同じものです。

なお、LoadingSpinner.Control でも同じぐらいのローディング表示でした。前述どおり個人的な感覚ですが、Data・Control どちらを選択してもあまり効果が変わらない場合が多いですね。

# LoadingSpinnerColor について
前述の LoadingSpinner.Data 動画に同梱してあるのでお気づきの方もお見えになるかと思います。ローディング時のグルグル色を変更することが、2019年末ぐらいに可能になりました。

RGBA、ないしカラー（Red、Blueなど）が指定可能です。

# まとめ
画面遷移する際、A →[遷移]→ B みたいな流れだと仮定しましょう。Bの画面に置いたコントロールが多かったり、読み込むデータソースが膨大だったりした場合、B画面の描画が遅くなるコトが多々あります。画面描画が遅くなると、コントロールの準備が全て整う前に操作できてしまって、意図しない結果になることがあります。

このLoadingSpinnerプロパティを使うと、その意図しない結果を回避できる可能性があります。自前でローディング画面を用意しても良いのですが、プロパティに１つ値を設定すれば解決する可能性もあります。そんな場合に、思い出してみてください。


それでは、皆さま。2020年も素晴らしい Power Platform Life を！
Dagger/MissingBindingエラー

以下のようなエラーが出た

```
エラー: [Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] jp.co.xxxxx.yyyy.data.repository.ZzzRepository cannot be provided without an @Provides-annotated method.
public abstract interface AppComponent extends dagger.android.AndroidInjector<jp.co.xxxxx.yyyy.App>
　・
　・
　・
```

## 結論
対象repositryのBindsができていなかった。。。

```
@Module(includes = [DataSourceModule::class])
interface RepositoryModule {
    @Binds
    fun bindZzzRepository(repository: ZzzDataRepository): ZzzRepository
}
```

新たな画面を追加する際にrepositoryの追加も行う場合に、moduleに対しても色々と設定追加してやらないといけないのが漏れていた。Daggerの概念をちゃんと理解しつつ設定周りをちゃんと確認しないとですね。。
クロムブックで Ubuntu 20.10 を使う

こちらで行ったのと同じ方法で Ubuntu 20.10 をインストールします。

[クロムブックで Arch Linux を使う](https://qiita.com/ekzemplaro/items/f7737b410b6ec72bba7f)

```bash
vsh termina
lxc launch ubuntu:20.10
```

インストール直後に、次のようにログインして、root のパスワードを設定します。

```bash
lxc exec square-sturgeon -- /bin/bash
```

次からは、

```bash
lxc console square-sturgeon
```

実行した時の様子

```text
(termina) chronos@localhost ~ $ lxc console square-sturgeon
To detach from the console, press: <ctrl>+a q

square-sturgeon login: root
Password: 
run-parts: /etc/update-motd.d/98-fsck-at-reboot exited with return code 2

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

root@square-sturgeon:~#
```
眺めて覚えるGo言語 その8 PythonからGO言語を呼ぶ1(引数文字列)

# pythonからGo サブルーチンへの引数　文字列
### byte列をポインターで渡す。

```pcgo1.py
from ctypes import *
lib = cdll.LoadLibrary("./golib.so")
a=lib.fun1(c_char_p(b"hello world"))
```

```golib.go
package main

import "C"
import "fmt"
//export fun1
func fun1(a *C.char) int {
    fmt.Println(C.GoString(a))
    return 0
}

func main() {}

コンパイルと実行
>go build -o golib.so -buildmode=c-shared golib.go
>python pcgo1.py
hello world
```
 - c_char_p(b"hello world")は、バイト列ポインター扱い
 - C.GoString(a)は、受け取ったバイト列ポインターをGO stringへ

#文字列の受け渡し
###基本的に文字列の受け渡しは、バイト列で行う。

```py2go.py
from ctypes import *
#パラメータの準備
class go_string(Structure):
    _fields_ = [("p", c_char_p),("n", c_int)]
#GO言語用string変換
def GoString(s):
    u=s.encode('utf-8')
    return go_string(c_char_p(u), len(u))
lib = cdll.LoadLibrary("./golib.so")
lib.fun1.restype=c_char_p
a=lib.fun1(c_char_p("こんにちは".encode('utf-8')))
lib.fun2.restype=c_char_p
b=lib.fun2(GoString("こんにちは"))
print("a=",a.decode('utf-8'))
print("b=",b.decode('utf-8'))
```
- encode/decodeは、それぞれバイト列変換です。

```golib.go
package main
import "C"
import "fmt"
//export fun1
func fun1(a *C.char)*C.char{
    fmt.Println("fun1",C.GoString(a)+"　日本")
    return C.CString(C.GoString(a)+" 日本")
}
//export fun2
func fun2( a string)*C.char{
    fmt.Println("fun2",a+" 日本")
    return C.CString(a+" 日本")
}
func main() {}

コンパイルと実行結果

>go build -o golib.so -buildmode=c-shared golib.go
>python py2go.py
fun1 こんにちは　日本
fun2 こんにちは 日本
a= こんにちは 日本
b= こんにちは 日本
```
 - fun1は、C言語ポインターで受け取りC言語ポインターで返す。
 - fun2は、Go言語stringで受け取りC言語ポインターで返す。
2019年度下期 React Nativeでアプリ作る②

### ■ はじめに

前回に続き、React Nativeでアプリを作る。
前回：https://qiita.com/satosingo5/items/bf1a3e6bbcb4ecabe127

今回やること
・エラーの解消
・テストアプリの作成


### ■ エラーを解消させる
一晩の内に妖精さんが何とかしてくれた可能性にかけ、何も対応せずexpoを起動してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526880/b85f5bb5-cf64-a560-144c-c0e7a4d4a887.png)

？？？？？？？？？？？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526880/6151f5b5-e26b-f946-fce4-5ed94a3ecc1f.png)

なぜかうまくいった。

と思ったけど、Node.jsの12.14.0をアンインストールして、12.4.0を導入しなおしたのを忘れていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526880/1b6c5e5f-8c9e-dbe3-3964-e60da96e731f.png)


ブラウザのコンソールも正常に起動。表示されたQRはスマホから読み込むと、上記で起動したプロジェクトの動作確認ができる。（後述）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526880/f9a79957-1450-4362-1853-3bad8834a874.png)

Nood.jsのバージョン下げたらエラーが解消されうまくいった。
とりあえず解決したので次へ。

### ■Hello,Worldを進める
次はスマホ側の操作。
下記アプリをインストールする。
![Screenshot_20200101-211511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526880/6a72eeb6-a386-b775-cd6c-398ab4489633.png)


アプリを起動。
![Screenshot_20200101-213552.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526880/08e39e4f-1009-c40e-34cf-cb094c2e6765.png)

ScanQRCodeをタップし、PCに表示されたQRを読み込む。
![Screenshot_20200101-213806.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526880/5b29287f-3392-318b-5459-5a23afddaf24.png)

その後、PC側との接続が完了すると、以下のような画面が表示される。
![Screenshot_20200101-213834.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526880/65a5c2a2-5418-84ce-a986-7d5414df20a4.png)

内容は、プロジェクトのソースが置いてあるフォルダのApp.jsの内容が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526880/c087d622-80b3-9a35-2b7a-f64993eb2f22.png)

文言をHello,world!に書き換え、上書き保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526880/af1c3577-2352-1b0a-2b1b-8dd83475e452.png)

すると、リアルタイムでスマホ側の画面に反映される。便利。
![Screenshot_20200101-221410.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526880/479a6623-cec3-7ae3-95d6-3c30dc6500b9.png)

テストアプリなどという、ふわっとしたものがなんなのか定義しかねていたが、上記のHello,World!をテストアプリとする。
これにより、最初に書いた今回やることを達成したことになる。予定通り。素晴らしい。

今回はここまで。

### ■ まとめ
今回やったこと
・エラー解消
・Hello,world
上記はあくまで、PCからスマホに変更内容を送ってデバッグしているような状態にすぎないため、次回は固めた状態のものをスマホに突っ込んで動かしてみたい。

次回やること
・固めてスマホに突っ込む

以上

次回：https://qiita.com/satosingo5/items/c9b7aee11f1fe7a00b27
今更だがフレッツ光→NURO光に移行したのであれこれをメモしておく

# 何をしたのか
文字通り、自宅のインターネット回線を10年ほど契約していたフレッツ光からNURO光に移行した。同時にフレッツテレビとひかり電話も利用していたので、それぞれアンテナ受信、NURO光でんわに移行した。

# 背景
ものすごく単純な話しで、ピークタイム（平日夕方〜夜間、休日も同じような時間帯）の平均通信速度が一桁Mbpsくらいまで落ちてきたから。それとフレッツテレビもNHK、TBSあたりで月1回くらいの頻度でブロックノイズや映像・音声の途切れが発生していて、光ファイバーなのになんでやねんと思っていたりしたいので、ついでに直ればなおいいなくらいの感じで。（割と気軽）

なお、ここでちゃんと調査していなかったので後でいろいろ面倒くさいことになった。（後述）

# 我が家の現状
これは後述に絡むのだが、我が家は戸建てで、道路から奥に引っ込んだいわゆる旗竿敷地。電線や電話線含め、既存のフレッツ光の回線はスッキリポール®でまとめて受けて地中を通り、1F屋外の壁面にある作業用のボックスを経由して宅内まで引き込んでいる。
宅内では2Fのキッチン奥のパントリーに全てまとめて出していて、まとめてネット®で受けている。そこに電話機（親機）、OTU、WiFiルーター、警備の機械などネットワークが必要な機器はまとめて置いてある感じ。ただ基本無線LAN前提で宅内有線LAN配線まではしていない。TVはリビング、1Fの部屋、浴室の合計3台あるが、風呂場はチューナーの制限で地デジのみ。すべて先程のパントリー奥のブースター経由で同軸ケーブルで配線されている。

フレッツ光の利用中はここにOTUがあり、OTUからLANケーブルで無線LANルーターに配線→インターネット接続。同じくOTUから同軸ケーブルでブースターに接続し、宅内の同軸ケーブル配線でTVを見ている感じ。なお、すっきりポールからは同軸ケーブルも配線されており、その終端も同じブースターまで出てきているが、これは今は使っていない。（後ほどこれが活躍することになる）

# 経緯
普通にNURO光の申し込みサイトから申し込んだ。
1. NURO光の公式サイトから設置申し込み。完全に移行したいので電話とひかりテレビも合わせて申し込む。3万円キャッシュバックキャンペーン中だった。
2. よく書かれている通りNURO光の工事は2段階で行われる。宅内工事（屋外から室内へのファイバーの配線と終端装置の設置）→屋外工事（NTTの電柱から自宅までのファイバーの配線）がそれ。それぞれ別の工事日程を予約する必要があるのでまずは宅内工事を予約。
3. サイトで希望日を指定できるので3週間ほどで工事の人がやってきた。さっそく工事するために既存の設備状況を確認したところで問題発生。ひかりテレビ for NUROの仕様をちゃんと把握していなかった。ひかりテレビはSTB必須で、そこからHDMIケーブルでしか宅内配線できない。リビングのTVまではまだなんとか行けないこともないが、浴室のTVや1FのTVは対応できず。ということで一旦NURO導入自体を諦める。
4. 作戦を練り直す。いまのTV環境を変えずにインターネット接続回線だけNUROにする方法がないかと思ったが、残念ながらTVがボトルネックになることが明確に。仕方がないのでTVは地デジ、BSともにアンテナ工事することにした。（回線変更だけのはずが大事に）
5. 比較サイトから評判の良さそうなアンテナ工事会社（大手）を選びそこに申し込み。また2週間程度で工事を予約。
6. アンテナ工事することに切り替えたのでNURO光の工事も再予約。それぞれ2週間待ち程度で工事できることに。
7. アンテナ工事当日、やってきた技師が言うには、機材不足ですっきりポールのアンテナ設置ができないとのこと。先に言ってよ（聞いてよ）って感じだったのだがそれなら仕方ないので一旦工事はキャンセル。
8. その間にNURO光の開通工事は終わり、無事インターネット接続はNURO光にきりかえ。NURO光の終端装置はWiFiルーター機能付きなので既存のATermを引退させ、無線LAN設定を書き換え。
8. アンテナの方は後日改めて今度は地元の電気屋さんに出向き見てもらうことにした。結果多少料金はかかるが問題なく工事できそうなことが確認できたので、そこで工事実施。（ここまでNUROの申し込みからはすでに2ヶ月経過）
9. テレビも問題なくアンテナに切り替え完了。
10. しばらく運用して問題なければ、各種サービスに登録している電話番号を変更してからフレッツ光を解約して完了予定

# 雑感
- ひかりTV for NUROはセットトップボックスが必須で、そこからHDMIケーブルでTVまで配線する方式。今回これが1番の問題になった。TVがOTUから離れたところにあるとHDMIケーブルの宅内配線が発生する。一人暮らしのワンルーム等では問題ないかもしれないが、少なくとも戸建てでは配線が難しい。というか正直無理。昔のケーブルテレビみたいな方式だけど今これで申し込んでる人いるのだろうか・・・
- NURO光に期待してたほど速度は出ていないが、フレッツ光がピークタイムに激重になるような症状は出なくなった。我が家は速度に関してはあまり条件（環境）が良くない見たいだが、100+Mbpsは安定してい出ているのでまぁいいかという感じ（3Mbpsとかに比べれば天国）。ただしこれも利用者が増えればまた落ちてくるのかもしれない。イタチごっこだな・・・
- フレッツひかり電話→NUROひかり電話の移行の場合、フレッツひかりで新規に発番した電話番号はMNP出来ない。つまり電話番号が変わった。ただ家電話に関して言うとほぼ完全に利用しない状況になっているので、特に問題なかった。
- 奥様によるとなぜだかアンテナに移行したことでTV画質が向上したらしい。フレッツTVはパススルー方式で電波をそのまま流してるはずなのでそんなはずは・・・と思いつつ、たしかに言われてみると解像度上がってる気がしないでもない・・・、なんでだろう。まぁ気のせいかもな。
npmコマンド【メモ】

|コマンド           |機能               |
|:----------------:|:-----------------:|
|npm install ～       |インストール        |
|npm uninstall ～    |アンインストール     |
|npm list          |一覧表示            |
|npm search  ～      |検索               |
|npm init          |ファイルの作成      |
|npm run     ～      |スクリプトの実行     |
|npm start         |startスクリプトの実行|
|npm help          |短いヘルプ          |
|npm help -l       |詳しいヘルプ        |
|npm help ～       |詳細ドキュメント|
【Unity】iosデバッグ時のbuild設定 ios実機/Simulator

Build Setting

ios実機でデバッグする時
<img width="588" alt="iphone_debug.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258078/d20a29a0-d59d-08f6-01a4-cc51c15db756.png">

X-code Simulatorでデバッグする時
<img width="586" alt="simulator_debug.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258078/9f5b4cb2-2f36-f526-3401-488f52bb2724.png">
【PHP】PHPの型宣言は弱い型付け

#型宣言とは
次の例のように、関数に引数を与えるような場合などに引数の型に**制約**を与えることができます。
正しくない種類の型が渡された場合、`Fatal error`が発生します。

```php
<?php
function includeTax(int $price, bool $take_out = true) {
	if ($take_out) {
		return $price * 1.08;
	} else {
		return $price * 1.1;
	}
}

includeTax(100, false); // 100
includeTax('税抜100円', false); // Fatal error: Uncaught TypeError: Argument 1 passed to includeTax() must be of the type int, string given
```

上記の関数`inculdeTax`の引数`$price`は`int`型を指定しているため、正しい型である`100`を渡すことに成功しましたが、`string`型である`税抜100円`を渡した時にエラーを吐いています。

型宣言として使用有効な型は、以下の通りです。
<img width="873" alt="スクリーンショット 2020-01-01 20.59.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496565/2add3027-7865-e9f5-4396-c115734c6033.png">

>引用 [PHPマニュアル > 言語リファレンス > 関数 > 型宣言](https://www.php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration.strict)

#PHPの型宣言は厳格ではない
しかし、スカラー型[^1]の型宣言の場合にはには落とし穴があります。
[^1]: 論理値 (boolean)整数 (integer)浮動小数点数 (float, double)文字列 (string)の4種類。
スカラー型の型宣言は弱い型付けなので、一致しない型が引数と渡されたとして一致させることができる場合[暗黙の型変換](https://www.php.net/manual/ja/language.types.type-juggling.php)がされます。

具体的には以下のような例のばあいです。

```php
<?php
function includeTax(int $price, bool $take_out = true) {
	// $priceは(int)100に変換される。
	if ($take_out) {
		return $price * 1.08;
	} else {
		return $price * 1.1;
	}
}

// string型で渡す。
includeTax('100', false); // 100
// float型で渡す。
includeTax(100.5, false); // 100
```

どちらも、`int`型に変換できる形だったので、関数に渡した時に`int`型に黙って変換されて処理が行われました。
特に、後者の`float`型で渡したときには、開発者は`110.55`が返ってくることを期待しましたが、別の結果が帰ってきたことに困惑するかもしれません。

この挙動は、返り値の型宣言やプロパティ型指定[^2]でも同様です。
[^2]: プロパティ型指定は7.4からの新機能。

#弱い型付けを無効にするには
厳格な型付けを望みたい場合、ファイルの先頭で`declare(strict_types = 1)`を宣言します。

```php
<?php
declare(strict_types = 1);

function includeTax(int $price, bool $take_out = true) {
	if ($take_out) {
		return $price * 1.08;
	} else {
		return $price * 1.1;
	}
}

includeTax('100', false); // Uncaught TypeError: Argument 1 passed to includeTax() must be of the type int, string given
includeTax(100.5, false); // Uncaught TypeError: Argument 1 passed to includeTax() must be of the type int, string given
```

しかし、この厳格な型付けは全体には適応できません。厳格な型付けを望みたい個々のファイルごとに宣言する必要があります。

#参考文献
[PHPマニュアル](https://www.php.net/manual/ja/index.php)
[はじめてのPHP](amazon.co.jp/初めてのPHP-David-Sklar/dp/4873117933)
[【導入決定！】PHP7で実装されるスカラー型宣言とは？
](http://tech.respect-pal.jp/php7_scalar_type_hinting/)
SwiftUI: ListとIdentifiableについて

## はじめに
今回はListとIdentifiableプロトコルを実装した構造体を利用してUITableViewみたいなものを簡単に作りたいと思います! UIKitよりSwiftUIの方がかなりシンプルにかけるので、その違いを意識してみるといいかもしれません笑
※勉強中のため、正しい説明になっていないかもしれません。予めご了承いただければと思います、、、

## 環境
- macOS Catalina(10.15.2)
- xcode(11.3)
- Swift5.1
- SwiftUI

## こんな感じです
|List<img width="535" alt="スクリーンショット 2020-01-01 20.18.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/523914/491f9f12-6244-2f67-8c04-7f3aec2dd0e1.png">
|---|

```swift:ContentView.swift

import SwiftUI

struct Hyoka: Identifiable {
    var id = UUID()
    var name: String
}

struct ContentView: View {

    var body: some View {
        let hyokas = [Hyoka(name: "氷菓"),
                      Hyoka(name: "愚者のエンドロール"),
                      Hyoka(name: "クドリャフカの順番"),
                      Hyoka(name: "遠回りする雛"),
                      Hyoka(name: "ふたりの距離の概算"),
                      Hyoka(name: "いまさら翼といわれても")]
        
        return List(hyokas) { hyoka in
            Text(hyoka.name)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```

##解説
今回のポイントはHyoka構造体にIdentifiableプロトコルを実装していると言う点です。Identifiableプロトコルの中身は、

```swift
public protocol Identifiable {

    /// A type representing the stable identity of the entity associated with `self`.
    associatedtype ID : Hashable

    /// The stable identity of the entity associated with `self`.
    var id: Self.ID { get }
}
```
となっており、Hyoka構造体はidをプロパティとして定義する必要があります。idの中身は[UUID構造体](https://developer.apple.com/documentation/foundation/uuid)
を利用しており一意なInt型の値が入っています。(自分でidを入れても構わないです。)

このようにすればListができるのですが、**なぜそもそも一意のidを付与しなければならないのか??**についてもう少し説明を加えます。
その答えはずばり、**SwiftUI側がそのViewで利用されているデータがどれなのかを特定しておかないと、データが更新されたときにどのViewを再構築すればいいのかわからなくなってしまうからです。**今回の場合、SwiftUI側がTextビューそれぞれのデータを区別したいので予めidを割り振る必要があります。


##参考
- [SwiftUI公式ドキュメント](https://developer.apple.com/tutorials/swiftui/tutorials)
- 書籍 [SwiftUI徹底入門](https://www.sbcr.jp/product/4815604066/)
SORACOM でWio LTEを買ってみた

#SORACOM でWio LTEを買ってみた

[Grove IoT スターターキット for SORACOM](https://soracom.jp/products/kit/grovestarter_kit_lte/) を [SORACOM ユーザーコンソール](https://console.soracom.io/)から購入しました。
2017年に発売されたボードです。

公式チュートリアル「[LTE モデム搭載プロトタイプ向けデバイス Wio LTE をセットアップする](
https://dev.soracom.io/jp/start/lte_hw_wio-lte/)」
をやってみます。

分り難かった部分を初心者向けに補足していきます。
が、ほぼ問題なく完了できてしまいました。

OS：Windows10 バージョン1809
ボード：Wio LTE Cat.1 v1.3b 03/30/2018

#基礎知識: Wio LTE の準備
### SIM登録
[SORACOM ユーザーコンソール](https://console.soracom.io/)からSIM登録を行います。
スターターキットに付属するクーポンは右上のアカウントを選択するとメニューに表示される「クーポン登録」から登録します。

### アンテナ取付
U.FLコネクタがはまらず苦戦しました。
通常は軽い力でパチンとはまりますが、頻繁に付け外しを行うと緩くなりそうです。
※チュートリアルで一番苦戦したところです...

#基礎知識: Wio LTE の “通常モード” と “DFU モード”

ドライバがインストールされていないので接続しても「STMicroelectronics Virtual COM Port」は表示されません。
焦らずステップ１へ進みましょう。

BOOTボタン＋RSTボタンでDFU モードへ移行し、RSTボタンで通常モードへ戻ることだけ覚えておきましょう。

#ステップ 1: Wio LTE の開発環境を準備する
### Arduino のインストール
2019/12/31 のArduino IDEは1.8.10でした。
Microsoft Store は1.8.9だったので、本家サイトからInstallerをダウンロードしました。

SeeedJP STM32 Boards のバージョンは1.3.0でした。
インストールには1分程度かかります。

### WinUSB ドライバのインストール

Zadig 2.4 でした。
操作感が若干違いましたが「STM32 BOOTLOADER」が表示されました。

### TeraTerm のインストール

シリアル通信をモニター出来れば良いので、インストール済みだったPuTTYを使用しました。

# ステップ 2: Wio LTE で開発してみる (LED点灯)

スケッチライブラリをインクルードしていないと、スケッチ例が表示されません。

# ステップ 3: Wio LTE で開発してみる (デバイス稼働時間を SORACOM Harvest へ送信)

SORACOM Harvest の費用は「書き込みリクエスト: 1日 2000リクエストまで、1SIMあたり 1日5円」です。

スケッチを書き込み後にRST ボタンを押して通常モードにしましたが通信部分でエラーが発生してしまいました。
再度、RSTボタンを押下したところ、正常にデータが送信され始めました。

PuTTYでもSerialのCOM4を指定して出力を確認することができました。

## 以降のステップ

センサーデータをSORACOM Funnel を使ってAWS IoT Core へ送信したいと思います。
django アプリケーション毎に データベースを分ける

settings.py

```
INSTALLED_APPS = [
    ...
    'app1.apps.App1Config',
    'app2.apps.App2Config',
]


DATABASES = {
    'default': {
        ....
    },
    'db2': {
        ....
    },
}
DATABASE_ROUTERS = ['config.db_router.DbRouter']
```

# modelに追加
※重要
ここのapp_labelをmodel_routerで識別する
```
class User(models.Model):
	class Meta:
		app_label = 'apiv2'
```


# ファイル追加
config/db_router.py 

```
class DbRouter:
	def db_for_read(self, model, **hints):

		if model._meta.app_label == 'apiv1':
			return 'default'
		if model._meta.app_label == 'apiv2':
			return 'db2'
		return None

	def db_for_write(self, model, **hints):
		if model._meta.app_label == 'apiv1':
			return 'default'
		if model._meta.app_label == 'apiv2':
			return 'db2'
		return None

	def allow_relation(self, obj1, obj2, **hints):
		return True

	def allow_migrate(self, db, app_label, model=None, **hints):
		if app_label == 'auth' or app_label == 'contenttypes' or app_label == 'sessions' or app_label == 'admin':
			return db == 'default'
		if app_label == 'apiv1':
			return db == 'default'
		if app_label == 'apiv2':
			return db == 'db2'
		return None
```


# migrate
CORS_ORIGIN_ALLOW_ALL  
CORS_ORIGIN_WHITELIST  
が邪魔するので一旦コメントアウト  

```
docker-compose run back ./manage.py makemigrations
docker-compose run back ./manage.py migrate --database=db2  
```
Htmlspecialcharsでいたずら（XSS）を防いでみた

#前回のあらすじ
・if文を使ってアンケート内容に不備があったら、注意文を表示させたり進むボタンが出ないようにさせたりしたぞ
#今日やったこと
・$変数=htmlspecialchars(変数);
と入力したら、アンケート内にHTMLタグとか仕込んでみても（これをクロスサイトスクリプティングと言うらしい）文字列として処理されるようになった！
（今回の教科書『いきなりはじめるPHP　ワクワク・ドキドキの入門教室』)
#感想
とにかく、入力情報の無毒化はセキュリティ対策で必要な処理なんだなーと思った

#次回の目標
データベースにアンケート情報を保管できるようにしよう！
【axios】HTTPレスポンスのheadersから情報を抜き出す書き方

## はじめに
HTTPレスポンスから**headers情報**を抜き出したい場合に使える書き方です。

## 環境
```yaml
OS: macOS Catalina 10.15.1
axios: 0.19.0
```
## 前提

例えば、以下情報が欲しいときを例にします。
- `access-token`
- `client`
- `uid`

![スクリーンショット 2020-01-01 20.37.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483292/320450c2-8593-f7bc-5b27-b1d196b0e532.png)
※画像はRails+gem **devise_token_auth**で作成したAPIに**Postman**を使用して、POSTリクエストを投げた後のものです。

## 結論

```javascript
任意の関数名: function() {
        axios
          .post('任意のURL')
          .then(response => {
            let client = response.headers['client'];
            let token = response.headers['access-token'];
            let uid = response.headers['uid'];
  })
}
```
もしくは

```javascript
let client = response.headers.client;
let token = response.headers.access-token;
let uid = response.headers.uid;
```

どっちかいうと上の**角括弧**を使ったほうがパッと見て判断しやすいかもしれません。

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:
【Unity】DoTweenを使ってUIを上下ループさせて目立たせる

## コード

```C#:UIPointer.cs
using UnityEngine;
using DG.Tweening;
using DG.Tweening.Core;
using DG.Tweening.Plugins.Options;

public class UIPointer : MonoBehaviour
{
    [SerializeField] private float _durationSeconds = 0.2f;

    private float _initY = 0;
    private float _endY = 0;
    [SerializeField] private float _moveY = 3f;

    private TweenerCore<Vector3, Vector3, VectorOptions> _tweener;

    public void InitDisplay(Vector3 position)
    {
        // 指定した位置に移動する
        transform.position = position;

        // 初期化
        _initY = transform.position.y;
        _endY = _initY - _moveY;

        // 表示する
        gameObject.SetActive(true);

        _tweener = transform
            .DOMoveY(_endY, duration: _durationSeconds)
            .SetEase(Ease.InCubic)
            .SetLoops(-1, LoopType.Yoyo)
            .Play();
    }

    private void OnDisable()
    {
        _tweener.Kill();
    }

    [ContextMenu("TestDisplay")]
    void TestDisplay()
    {
        InitDisplay(Vector3.zero);
    }
}

```

## エディタ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237014/4fc8fadf-ac60-6764-047b-9039c508f81b.png)

## デモ
<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">ようやく動きました。ありがとうございます！ <a href="https://t.co/vuSCWNEBgE">pic.twitter.com/vuSCWNEBgE</a></p>&mdash; アズマゴロー@放置ゲーハクスラ開発中 (@azumagoro) <a href="https://twitter.com/azumagoro/status/1212331982736150528?ref_src=twsrc%5Etfw">January 1, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## 参考
[[Unity] DOTweenを使ってUI要素を点滅させる](https://qiita.com/lycoris102/items/fe148d2c6803742c6f4d)


## 余談
地味にコピペですぐ使えるコードが見つからなかったので記事にしました。
Windows batのforをbreakする

# 概要
タイトルそのままbatファイルでのforを途中で切り上げる方法
実際にはbreakとは言えないけども

# コード
~~~bat:main.bat
for /l %%i in (0,1,10) do (
  echo %%i
)&if %%i==5 goto :th
:th
~~~
~~~bat:output
0
1
2
3
4
5
~~~
`%%i`の値が5になったらgotoでforの外に抜け出す
`/l`以外に`/f`でも可能なのは確認済み
抜け出したあとに()が来ても問題ない模様

# 注意点
~~~bat:bug.bat
for /l %%i in (0,0,1) do (
  命令
)&if "何らかのbreak条件" goto :th
:th
~~~
上記のようにforを(do)whileのように扱うと~~次元の狭間~~ループから帰ってこれなくなる模様
また、

~~~bat:slow.bat
for /l %%i in (0,1,100000000) do (
  命令
)&if %%i==5 goto :th
:th
~~~
のようにforの処理回数が多くなるとループを抜けるのが遅くなる
内部的にはgoto条件を満たした後、for中の命令をスキップして回しているっぽい？

# 参考
[setlocal～endlocalの外に変数をたくさん持ち出す](https://p--q.blogspot.com/2014/02/setlocalendlocal.html?m=1)
Happy new year 2020!

2020年も、#CiscoSE #DevNet #DevNetExpress #Catalyst #CiscoIOS 共々、どうぞよろしくお願い致します！

# Guestshell

```cisco
Cat9300-1#sh version | i 16.12
Cisco IOS XE Software, Version 16.12.01
Cisco IOS Software [Gibraltar], Catalyst L3 Switch Software (CAT9K_IOSXE), Version 16.12.1, RELEASE SOFTWARE (fc4)
BOOTLDR: System Bootstrap, Version 16.12.1r, RELEASE SOFTWARE (P)
*    1 41    C9300-24P          16.12.1           CAT9K_IOSXE           INSTALL
Cat9300-1#
Cat9300-1#guestshell 
[guestshell@guestshell ~]$ ls | grep print2020
print2020.py
[guestshell@guestshell ~]$ pwd
/home/guestshell
[guestshell@guestshell ~]$ 
```

# コード

```python:print2020.py
import sys

from termcolor import cprint
from pyfiglet import figlet_format

cprint(figlet_format('Happy New Year 2020!'), 'white', 'on_magenta')
cprint(figlet_format('#CiscoSE #DevNet'), 'white', 'on_blue')
```

# 実行例

```
Cat9300-1#guestshell run python print2020.py
 _   _                           _   _                __   __              
| | | | __ _ _ __  _ __  _   _  | \ | | _____      __ \ \ / /__  __ _ _ __ 
| |_| |/ _` | '_ \| '_ \| | | | |  \| |/ _ \ \ /\ / /  \ V / _ \/ _` | '__|
|  _  | (_| | |_) | |_) | |_| | | |\  |  __/\ V  V /    | |  __/ (_| | |   
|_| |_|\__,_| .__/| .__/ \__, | |_| \_|\___| \_/\_/     |_|\___|\__,_|_|   
            |_|   |_|    |___/                                             
 ____   ___ ____   ___  _ 
|___ \ / _ \___ \ / _ \| |
  __) | | | |__) | | | | |
 / __/| |_| / __/| |_| |_|
|_____|\___/_____|\___/(_)
                          

   _  _    ____ _              ____  _____ 
 _| || |_ / ___(_)___  ___ ___/ ___|| ____|
|_  ..  _| |   | / __|/ __/ _ \___ \|  _|  
|_      _| |___| \__ \ (_| (_) |__) | |___ 
  |_||_|  \____|_|___/\___\___/____/|_____|
                                           
   _  _   ____             _   _      _   
 _| || |_|  _ \  _____   _| \ | | ___| |_ 
|_  ..  _| | | |/ _ \ \ / /  \| |/ _ \ __|
|_      _| |_| |  __/\ V /| |\  |  __/ |_ 
  |_||_| |____/ \___| \_/ |_| \_|\___|\__|
                                          


Cat9300-1#
```

# 実行例（キャプチャ）
<img width="884" alt="SS 2020-01-01 20.34.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157325/2e81b5ae-4e07-24f2-bec1-bda84569a8d5.png">
【お役立ちリンク】RailsでPrawnを使ってPDF生成の出力する

## 

| Left align       |       Right align |
|:-----------------|------------------:|
|[Ruby - PrawnでPDF作成！](https://www.mk-mode.com/blog/2011/08/11/11002006/#)|中央揃え|
|[Rails prawnを使ってPDFを作成する](https://qiita.com/ayies128/items/7262b771fdae5b7f0098)|cellの結合|
|[海老で PDF を釣る](https://blog.emattsan.org/entry/20150412/1428802789)|捺印欄|
|[Prawn Documentation](http://prawnpdf.org/docs/0.11.1/index.html)|公式ドキュメント|
|[by example](http://prawnpdf.org/manual.pdf)|サンプル集|
|[Table](https://prawnpdf.org/prawn-table-manual.pdf)|Table|
|[Prawn PDF table mixed formats](https://stackoverflow.com/questions/12355503/prawn-pdf-table-mixed-formats)|セル内フォーマット|
DeNA 20 新卒 Advent Calendar 2019 4週目振り返り

4週目が終わりました🎉
「なぜ急に内定者カレンダーを始めたのか」とかの経緯や、エモいことは25日の記事で書きました。
ので、この記事では4週目の振り返りにフォーカスします。

4週目も無事1日も遅れることなく投稿できました。
本当によかった...。（社名を背負っているので落とさないかのプレッシャーがすごい）
みんな本当にありがとうございました。
本当にギリギリだった日がありました。
結果として、1ヶ月間1日も送れずに投稿できて良かったです。
それでは振り返っていきます🏃‍♂️
（記事をご覧になったら是非「いいね👍」をお願いします。）

# 22日目: [GraphQLでタスク管理アプリを作る -フロントエンド編- [React+Apollo Client+Typescript]](https://qiita.com/Climber22/items/4269ad07350aae257328)
@Climber22 の記事です。

GraphQLとReactでのアプリ開発の解説記事です。
アプリの画面、ディレクトリ構成、依存関係の設定、GraphQLとの連携まで丁寧に書いてくれています。
無限スクロールの実装まで、考慮してくれているのも嬉しいです。

21日の記事のフロント側の実装となっているので是非合わせてご覧ください🙌

21日の記事と共にトレンド入りしました🎉

<img src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F172187%2Fce6379be-2f02-fa7a-9b37-cff6bacf6d4a.gif?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=5df40b3f7aa474813a09ca65aa2b4d0c">

# 23日目: [AWSを使ってサーバーレスにRestAPIを作ってみた。](https://qiita.com/coil_msp123/items/b1751dbe74ada7fdd5a1)
@coil_msp123 の記事です。

サーバレスアーキテクチャで掲示板を作る記事です。
AWS、DynamoDBとモダンな開発なのが嬉しいです。
サーバレス、AWS、DynamoDBの説明から実際のGoでのコードの解説まで、丁寧に網羅してくれています。

APIは公開されているので、クライアントを実装すれば掲示板が作れます👍

![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F53020%2F0a2cc03b-aa9f-82ef-5862-325b3e25d9da.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=c51604e8d39f48902a4f49e8e8e98612)

# 24日目: [全自動タピオカインスタ映えロボットを作った話](https://qiita.com/wataryooou/items/6de747abc7d27c8f594e)
@wataryooou の記事です。

タピオカが1番輝ける写真を自動で撮影する過程の解説記事です。
「タピオカをゆでる」という工程が存在するように、ソフトウェアの領域で収まっていない記事ですw
このカレンダー中で1番ぶっ飛んでいる記事です。

とにかく見て欲しい！という記事です。

![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F104635%2F7f909ca6-820e-a825-e783-22308f4666d6.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=e8aea62f00ce76b0d52ba0b893544274)

# 25日目: [なぜDeNA 20 新卒 Advent Calendar 2019を企画したのか【＋専用アプリの解説】](https://qiita.com/naro143/items/827059d52527efb4f978)
@naro143 の記事です。

今回の「なぜ企画したのか？」を戦略的な視点で説明しています。
「来年でこの企画は完成する」というのを見ていただきたいです。

また、今回の企画の専用アプリの開発のきっかけ、実装解説もあります。
内定者Slackの画像もあり、雰囲気が伝わる内容となっています。

ニッチな記事ながらトレンド入りをしました🎉

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222499/6772a6c1-3e25-caaf-2176-411c8a6dad8e.gif" height=500>

# 来年も楽しみにお待ちください！
[カレンダーはこちら](https://qiita.com/advent-calendar/2019/dena-20-shinsostu)
1ヶ月、本当にありがとうございました🎉

- [DeNA 20 新卒 Advent Calendar 2019 1週目振り返り](https://qiita.com/naro143/items/7d4c067e32040dabfe43)
- [DeNA 20 新卒 Advent Calendar 2019 2週目振り返り](https://qiita.com/naro143/items/2a73cbb29e7c371bf771)
- [DeNA 20 新卒 Advent Calendar 2019 3週目振り返り](https://qiita.com/naro143/items/be5887cd25088a32fd65)
- [DeNA 20 新卒 Advent Calendar 2019 4週目振り返り]()