OmniAICreator/Qiita-1.07M huggingface dataset:
AWS認定ソリューションアーキテクトアソシエイトを受験した時の話

## この記事の概要
2019/04/29に
**AWS認定ソリューションアーキテクトアソシエイト**
(AWS Certified Solutions Architect - Associate (SAA))
を受験したので、その時の記録

## 試験の概要
![aws_c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140013/b1cdc5f8-54c3-7fff-ae3e-9499f136eb5c.png)

アソシエイトレベル(下から2番目)のアーキテクト向け試験です。

「この試験に合格すると、AWS のテクノロジーを使用して**安全で堅牢なアプリケーションを構築およびデプロイする**ための知識を効果的に証明できます。
可用性、優れたコスト効率、耐障害性を備え、スケーラブルな AWS上での分散システムの設計に関して、少なくとも**1年の実務経験のある方**が対象です。」
AWS公式より引用：[引用元](https://aws.amazon.com/jp/certification/?nav=tc&loc=3)

**◼︎ 試験要項**
問題数　　：65問
試験時間　：130分
受験料　　：¥15,000(税別)
合格ライン：100~1000点中720点(約69%)
受験資格　：なし

**◼︎ 出題範囲**

| 分野 | 出題割合 |
|:--|:--:|
| 分野 1: 回復性の高いアーキテクチャを設計する | 34% |
| 分野 2: パフォーマンスに優れたアーキテクチャを定義する | 24% |
| 分野 3: セキュアなアプリケーションおよびアーキテクチャを規定する | 26% |
| 分野 4: コスト最適化アーキテクチャを設計する | 10% |
| 分野 5: オペレーショナルエクセレンスを備えたアーキテクチャを定義する | 6% |

**2019/08時点の最新バージョン(Ver.1.5)**のものです。
バージョンアップで範囲等は変更されるので、受験時は公式で確認してください。
[AWS 認定ソリューションアーキテクト – アソシエイト | AWS](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)

## 勉強開始前の状態
AWSで動いているアプリ開発の業務を1年以上しているけど、インフラじゃなくアプリ開発の方の担当なので、どちらかというとSDKを使ったコードを書くのがメイン。
EC2とかVPCとかの**インフラ系のサービスはほぼ使い方がわからない状態**。
よく触るのは、DynamoDB, S3, Lambdaとかそのへん。

## 勉強に使ったもの

**1. 対策本①**
[合格対策 AWS認定ソリューションアーキテクト - アソシエイト](https://amzn.to/2TlmQn2)
試験要項など全体的に情報が古く、ページ数的にも少し薄いのでこれだけだと不安
追加で問題集などの活用がおすすめ。

**2. 対策本②**
[徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書](https://amzn.to/31A8a6f)
比較的新しめの発行で、内容もサービス別ではなく目的別に書かれているため、何のためにそのサービスを使うかがわかりやすい。

**3. Web問題集**
[AWS WEB問題集で学習しよう – 赤本ではなく黒本の問題集から学習する方向](https://aws.koiwaclub.com/)
無料でもそれなりの問題数でおすすめ。

**4. AWS公式模擬試験**

**5. AWSアカウント**

1~4の順で勉強、
対策本①と②はどちらもKindle版で通勤電車の中で勉強、**①を読み終わった後**内容が少し古く不安だったので、**②を追加で購入**しました。
③のWeb問題集はフリープランと有料プランがあり、対策本を読み終わった後、**フリープランの問題集**だけ利用。
最後に実力を確認する意味も兼ねて、**模試を受験**。受験料¥2,000とお手頃なので、何度か受験して練習問題代わりにするのもありかも。
公式の模試は本番同様スコアと分野別の正解率のみしか確認できないため、後で見直して答え合わせをするために**画面キャプチャ**で動画に残しておくことをおすすめします。
※問題の公開はもちろん禁止されています。

AWSアカウントは勉強した内容をイメージしやすくするために、無料枠の範囲内でちょこちょこ利用。

## 勉強時間
トータルで**30時間**ぐらい？一応AWS自体触ってはいたので、わりとのんびり勉強。
知識不足を補うため**読書+練習問題**がメイン、座学だけだとイメージしづらいので、触れたことがないサービスは、公式のチュートリアルなどを見ながら一度触れてみる時間も少し作ると、一気に理解が深まった。
[公式チュートリアル](https://aws.amazon.com/jp/getting-started/)

ソリューションアーキテクトはAWS認定の中でおそらく一番受験者が多いので、対策本なども比較的多く勉強しやすい方かと思います。

## 受験後
結果として、スコアは**849で合格**。可もなく不可もなく。

正直、ネットなんかで受験前にやったこと〜っていう記事で「BlackBelt読んで触りまくった」とか書いてる人が多いですが、試験の内容的に**「アーキテクチャ設計時はこういう考え方をするべき」**みたいな問題も多いので、触るのはあくまでイメージを深めてより理解するためで、座学と半々ぐらいがちょうどいいのかなという感想。

**EC2, ELB, VPC**なんかのインフラ周りの基本サービスは出題が多いので、EC2,ELBやらで冗長構成の構築とかやってみた方が、楽になるかと思います。

次回は、アプリエンジニアとしてはとっておきたいってことで、**デベロッパーアソシエイト**を受験予定です。
ちなみに、AWS認定試験は合格するとその他の試験に利用できる**模擬試験の無料バウチャー**と**本番試験の50%OFFバウチャー**がもらえるので、**次回は半額**です。

↓合格者特典のバウチャーの使い方は結構解りづらいので、こちらを参考に
[AWSの認定試験に合格すると貰える特典を有効活用しよう](http://blog.serverworks.co.jp/tech/2019/06/13/certification-benefits)

## 2019/8/19追記
デベロッパーアソシエイトも受験しました。
:point_down: AWS認定デベロッパーアソシエイトを受験した時の話
https://qiita.com/aminosan000/items/89bc76f77626314f3182
FlutterでネイティブのViewをそのまま表示できるPlatformViewを使う方法


FlutterのPlatformViewという `ネイティブのViewをFlutterのWidgetのように表示できる` というものです。

自分のプロジェクトでは画像の加工をよくやるので、結構使いそうです。
メモとして残します。

今回はiOSだけ紹介しますが、Androidも基本的には変わりません。
Androidでやる場合はこちら → https://medium.com/flutter-community/flutter-platformview-how-to-create-flutter-widgets-from-native-views-366e378115b6

## `info.plist` を編集する

下記を `info.plist` を追加しましょう。

```xml
<key>io.flutter.embedded_views_preview</key>
<true/>
```

## Flutter側を編集する

Flutter側はこれだけです。

```dart
 UiKitView( viewType: "ramdom_noise",),
```

## iOS側

iOS側はAppDelegate.swiftを使います。

```swift
import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?
        ) -> Bool {
        
        
        let viewFactory = FluffViewFactory()
        registrar(forPlugin: "kitty").register(viewFactory, withId: "ramdom_noise")
        
        GeneratedPluginRegistrant.register(with: self)
        
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
}

public class FluffViewFactory: NSObject, FlutterPlatformViewFactory {
    public func create(
        withFrame frame: CGRect,
        viewIdentifier viewId: Int64,
        arguments args: Any?
        ) -> FlutterPlatformView {
        return FluffView(frame, viewId: viewId, args: args)
    }
}

public class FluffView : NSObject, FlutterPlatformView {
    let frame: CGRect
    let viewId: Int64
    
    init(_ frame: CGRect, viewId: Int64, args: Any?) {
        self.frame = frame
        self.viewId = viewId
    }
    
    
    public func view() -> UIView {
        return UISlider(frame: frame)
    }    
}
```

これで画面に Sliderが表示されます。


## 参考

https://medium.com/@phoomparin/how-to-use-native-uis-in-flutter-with-swift-platform-view-8b4dc7f833d8
作成したホームページをGitpagesで公開してみた

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<@y_mishima_miraidenshi>です。
未来電子のプログラミングコースの学習として、自己PRホームページを作成しました。
その際、作成したホームページを公開するまでの手順を忘れないために記録しておこうと思います。プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。


#Gitpagesでの公開手順

1.Githubのアカウント登録

Gitpagesで公開するにはGithubのアカウントが必要になります。
まずはアカウントを取得します。

2.WEBページの作成

ローカル環境(自分のPC)で公開するホームページを作成します。

3.新しいレポジトリを作成

自分のGithubのマイページにて、新しいレポジトリを作成します。
画面右上のNew repositoryから作成できます。
レポジトリ名は自由に指定できます。
<img width="944" alt="レポジトリ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449719/c7a528d3-84d3-d8f8-f59e-fdd3302d9e88.png">


4.レポジトリをクローンする

作成したレポジトリをローカルにクローンします。
ターミナルにて以下のコードによってクローンし、そこへディレクトリを移動します。
$ git clone git@github.com:username/repositoryname.git

usernameには自分Githubアカウントの名前を、repositorynameには先ほど作成したレポジトリの名前を入れます。

5.ファイルのコピー

クローンしたファイルに作成したホームページの中身をコピペします。

6.addしてcommitしてpush!

以下のコードを入力して、ファイルをpushします。

$ git add .
$ git commit -m “commit”
$ git push origin master

7.ソースの設定

作成したレポジトリにてSettinngを開きます。
<img width="945" alt="ソース.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449719/55973a24-c760-afeb-6478-229db511b340.png">

下の方にあるGithub PagesのSource欄にて、None→master branchに変更します。
変更後しばらく経つと、ホームページが公開されるURLが表示されます。
<img width="577" alt="URL.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449719/2f7a7e54-ed5b-d73f-c78c-42e0c9df4296.png">



#まとめ

以上、ホームページをGitpagesで公開する手順でした。
今後も成果物を公開する機会を増やせればいいなと思います。
統計的仮説検定2：有意水準とp値とは結局何なのか？

前回は統計的仮設検定とは何なのかということについて勉強しました。

$\qquad$$\qquad$リンク：[統計的仮説検定1： 検定とはなんぞや](https://qiita.com/greatonbi/items/901cecbb1cc56012b3a9)

今回はp値とは結局なんなのかということについて勉強したので忘れないうちに書いていきます。

<br>

## 有意水準

神のみぞ知る真実は**帰無仮説が正しい**にも関わらず、検定で帰無仮説を棄却してしまうことを第1種の過誤といい、

神のみぞ知る真実は**帰無仮説が間違っている**のにも関わらず、検定で帰無仮説を採択してしまうことのことを第2種の過誤というのでした。


&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<img width="400" alt="図1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296113/d40df1cb-e483-be1e-1fd3-5b0d33489a35.png">


そして、良い検定とはこれら2つの過誤を犯す確率がともに小さい検定のことをいうのでした。

しかし、与えられた標本の下で、これら両方の確率を小さくするような検定は一般にはしません[1]。

そこで第1種の過誤の確率が $α$ 以下になる検定のうち、第2種の過誤の確率が最小になる検定を選ぶ方法を考えます。

つまり、標本 $X$ , 検定統計量 $T(X)$ , 棄却域を $C$ とした時、ある $α(0≤α≤1)$ をあらかじめ決めておき、

$\qquad　P_\theta\bigl\\{T(X)\in C \ |\ \theta\in\Theta_0\bigr\\}\,≤α$　( 第1種の過誤の確率が $α$ 以下 )

の下で、

$\qquad　P_\theta\bigl\\{T\(X\)\in C^c\ |\\theta\in\Theta_1\bigr\\}$ 　　　( 第2種の過誤の確率 )

（※$C^c$ は $C$ の補集合）

を最小にする方法を考えます。

このあらかじめ決めた $α$ のことを**有意水準**といいます。

要は第1種の過誤について許容できる最大の確率のことですね。
<br>


## p値
**与えられたデータに対し**、帰無仮説を棄却できる最小の有意水準のことを $p$ 値といいます。



定義自体はいたってシンプルですね。

<br>

#### ■例1
例えば、片側検定を考えるとします。

帰無仮説を $H_0$ 、検定統計量を $T(X)$ とし、 $t$ を実際の観測値から求めた $T$ の値とすると $p$ 値は次のように求められます。

$\qquad$ $p$ 値 $=P_\theta\bigl\\{T(X) \geq t\ |\  H_0 \bigr\\}$

つまり $p$ 値とは「帰無仮説 $H_0$ の下(これがかなり重要)で、検定統計量(確率変数) $T$ が、実際の観測値から計算された検定統計量の値(実現値) $t$ よりも大きくなる確率」のことです。



<br>

#### ■例2
例えば、

```R:
t.test(a, b, var.equal=TRUE)

        Two Sample t-test

data:  a and b
t = 1.8429, df = 18, p-value = 0.08187
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.410388 21.559806
sample estimates:
mean of x mean of y 
 52.35852  42.28381 
```

こんな感じの結果が得られたとします。

$\qquad$ p-value = 0.08187

と書いてありますね。これが $p$値です。これは有意水準が $α = 0.08187$ よりも大きい検定では帰無仮説が棄却され、有意水準が $α = 0.08187$ よりも小さい検定では帰無仮説が採択されるということになります。


## 注意①
有意水準や $p$ 値の扱いで気を付けなければいけないのは、有意水準はデータを見る前に決めておくべきものであるという点です。

先に検定を行って(検定は先に採択と棄却に関するルールを決めておく手順を含むので、これは検定とは呼びませんがここでは他に呼び方が思いつかないので検定と呼んでしまっています。)、 $p$ 値が $0.012$ だったから有意水準 $α=0.05$で採択だ！というのはインチキということです。

みなさんインチキをしないように気をつけましょうね。


## ★参考★
[1]野田,宮岡：数理統計学の基礎(1992)
[2]間瀬,神保,鎌倉,金藤：工学のためのデータサイエンス入門(2004)
VimmerのためのCommon Lisp環境構築（Neovim + vlime編）

# はじめに

この記事は[Vimmerな人たちのためのCommonLisp環境構築（slimv編）](https://qiita.com/kedama17/items/93ae7ccd1839f4bbb567)のvlime編です。
今回はNeovim+vlimeな環境をLinux上で構築してみます。

**Windowsでの環境構築方法を追記しました**


# 前提とする環境

* OS : Ubuntu 18.04 64bit

# インストール手順

## Gitのインストール

```sh
sudo apt install git
```

## Lisp処理系のインストール

```sh
sudo apt install sbcl
```

## Neovimのインストール

```sh
sudo apt install neovim
```

**Windowsの場合**
ここからバイナリをダウンロードします。
https://github.com/neovim/neovim/releases/tag/v0.4.4

## vim-plugとvlimeのインストール

今回はプラグインマネージャとしてvim-plugを使ってみます。
個人的にはインストールの簡単さとシンプルさがイイです。

[インストール手順](https://github.com/junegunn/vim-plug#unix-1)にしたがってインストールします。

```sh
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```

設定ファイルにvim-plugとvlimeを利用するための設定を追加します。

```
:e ~/.config/nvim/init.vim
```

以下を追記します。

```vimscript
call plug#begin('~/.vim/plugged')
" vlime
Plug 'l04m33/vlime', {'rtp' : 'vim/'}
" Paredit ※必須ではないけどおススメ、括弧の対応とってくれたりする
" Plug 'vim-scripts/paredit.vim'
call plug#end()
```

Neovimを再起動して以下を実行することでvlimeがインストールされます。

```
:PlugInstall
```

**Windowsの場合**

スクリプトをここからダウンロードして、`%LOCALAPPDATA%\nvim\autoload\plug.vim`に置きます。
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

設定ファイルにvim-plugとvlimeを利用するための設定を追加します。
Windowsの場合は設定ファイルは`%LOCALAPPDATA%\nvim\init.vim`に作成します。

以下を追記します。

```vimscript
call plug#begin('~/.vim/plugged')
" vlime
Plug 'l04m33/vlime', {'rtp' : 'vim/'}
" Paredit ※必須ではないけどおススメ、括弧の対応とってくれたりする
" Plug 'vim-scripts/paredit.vim'
call plug#end()
```

Neovimを再起動して以下を実行することでvlimeがインストールされます。

```
:PlugInstall
```

# vlimeを使う

vlimeではslimvと異なり、サーバを別途立ち上げてそこにNeovimから接続しに行きます。  
Neovimの外でサーバを立ち上げる操作が必要です。

サーバを立ち上げます。

```sh
cd ~/.vim/plugged/vlime/lisp
sbcl --load start-vlime.lisp
```

**追記2020/9/25:
Windows版では事前に立ち上げなくても`\\rr`したときに自動で立ち上がりました
Linux版は試していないのでわかりません**

こんなかんじの表示がでたらOK

```
*  <INFO> [16:01:45] vlime-usocket - Server created: (#(127 0 0 1) 7002)
```

Neovimを立ち上げて適当な.lispファイルを開きます。

```
:e ~/test.lisp
```

`\rr`でREPLに接続できます。

適当にS式を書いて。。。

```lisp
(defun hello (name)
  (format t "Hello ~A!" name))

(hello "kedama")
```

`\\oe`でカーソル下のS式をコンパイルします。

```sh
--
; compiling (DEFUN HELLO ...)--
```

`\\se`でカーソル下のS式を評価します。

```sh
Hello kedama!
NIL
```

## 基本的な使い方まとめ

* `\\rr` : REPLに接続する
* `\\ss` : カーソル下のS式またはアトムを評価する
* `\\se` : カーソル下のS式を評価する
* `\\sa` : カーソル下のアトムを評価する
* `\\oe` : カーソル下のフォームををコンパイルする
* `\\rs` : サーバを停止する。

詳細は```:help vlime```を参照してください。
TypeScriptの宣言空間 namespace / type / value のメモ

# 宣言空間
namespace / type / valueがあり、それぞれ宣言空間が異なるので、同じ変数名で定義してもエラーにならない

```typescript
// 競合しない型・値の宣言
const Test = {} // OK
interface Test {} // OK
namespace Test {} // OK
```

## value宣言空間

```typescript
const val1 = 'test'
// let val1 = 'guest' ・・同じvalue宣言空間なのでエラーになる
```

## type宣言空間
・type alias or interfaceを使う
・interface -> open endedに準拠しているため「型拡張（オーバーロード）」可能

```typescript
// 同じ名前でもコンパイルエラーにならない
interface Peter {
    name: string
}
interface Peter {
    age: number
}
interface Peter {
    weight: number
}
```

・type -> open endedに準拠してないため型拡張は出来ない

```typescript
type Pan = { // コンパイルエラー
    name: string
}
type Pan = { // コンパイルエラー
    age: number
}
```


## namespace宣言空間

```typescript
// namespaceの中でinterfaceを定義してexportする
namespace Test1 {
    export interface Props {
        name: string
    }
}

// Tes1.PropsとすることでNamespace内の型を使える 
const properties: Test1.Props = {
    name: 'PropA'
}
```
JavaScript ES6 【forEach/map/filter/find/every/some/reduce】

## ES6を勉強したので自分のためにメモする
UdemyでES6を結構しっかり学んだけど、関数系がごっちゃになりがちなので自分用にメモします。
全部便利そうなので今後しっかり使っていきたい！

## forEach
オブジェクトに繰り返し処理を行いたいときに使用する。

```js

let images = [
  { height: 10, width: 20 },
  { height: 20, width: 30 },
  { height: 30, width: 40 },
];

let areas = [];
images.forEach(function(image) {
  areas.push(image.height*image.width);
});

areas;

----- result ------
[200,600,1200]

// アロー関数使用バージョン
images.forEach(image => areas.push(image.height*image.width));

```

## map
オブジェクトから特定のキーオブジェクトを抜き出したいときに使用する。

```js
let colors = [
  { jp: '赤', eng: 'red' },
  { jp: '青', eng: 'blue' },
  { jp: '黄', eng: 'yellow' },
];

let engColor = colors.map(function(color) {
	return color.eng;
});

engColor;

----- result ------
["red","blue","yellow"]

// アロー関数使用バージョン
let engColor = colors.map(color => color.eng);
```

## filter
条件に合致するものだけ抜き出したいときに使用する。

```js
let includeCaffeine = [
  { name: 'コーヒー', caffeine: true },
  { name: '麦茶', caffeine: false },
  { name: '緑茶', caffeine: true },
];

includeCaffeine.filter(function(drink) {
  return drink.caffeine;
});

----- result ------
[{"name":"コーヒー","caffeine":true},{"name":"緑茶","caffeine":true}]

// アロー関数使用バージョン
includeCaffeine.filter(drink => drink.caffeine);
```

## find
条件に合致する一番最初の要素を見つけたいときに使う。

```js
let dogsOkCafe = [
  { name: 'CafeA', dogsOK: false },
  { name: 'CafeB', dogsOK: true },
  { name: 'CafeC', dogsOK: true },
];

dogsOkCafe.find(function(cafe) {
	return cafe.dogsOK;
});

----- result ------
{"name":"CafeB","dogsOK":true}
// ↑最初のひとつだけなので、CafeCははいらない

// アロー関数使用バージョン
dogsOkCafe.find(cafe => cafe.dogsOK);
```

## every
すべてのオブジェクトが条件に合致しているかどうか判定するときに使用する

```js
let places = [
  { name: '北海道', visited: true },
  { name: '沖縄', visited: true },
  { name: '群馬', visited: true },
];

places.every(function(place) {
  return place.visited;
});

----- result ------
True

// アロー関数使用バージョン
places.every(place => place.visited);
```

## some
ひとつでも条件に合致しているものがあるか判定するときに使用する

```js
let places = [
  { name: '北海道', visited: true },
  { name: '沖縄', visited: false },
  { name: '群馬', visited: false },
];

places.some(function(place) {
  return place.visited;
});

----- result ------
True

// アロー関数使用バージョン
places.some(place => place.visited);
```

## reduce 
オブジェクトを違う型にしたりするときに使用する

```js
var fruits = [
  { type: 'Apple' },
  { type: 'Strawberry' },
  { type: 'Strawberry' },
  { type: 'Strawberry' },
  { type: 'Apple' }
];

fruits.reduce(function(prev, fruit) {
    if (fruit.type === 'Apple') { prev.apple += 1; return prev; }
    if (fruit.type === 'Strawberry') { prev.strawberry += 1; return prev; }
}, { apple: 0, strawberry: 0 });

----- result ------
{"apple":2,"strawberry":3}

// アロー関数使用バージョン
fruits.reduce((prev, fruit) => {
    if (fruit.type === 'Apple') { prev.apple += 1; return prev; }
    if (fruit.type === 'Strawberry') { prev.strawberry += 1; return prev; }
}, { apple: 0, strawberry: 0 });
```
第１回 Setup PYNQ-Z1

##はじめに
　おうちでもFPGAをいじってみようと思いたち、お手軽価格で遊べるZYNQ評価ボードとしてPYNQ-Z1をいじってみることにました。このメモは機種選定から起動するまでの備忘録です。setupは本家の記事をはじめ、たくさんQiitaに記事があるので、ここには作業のポイントだけを書きます。（そのほうがいいでしょ）
　メインPCを修理にだしたので回路いじりはちょっと先になりそうです。

第１回 [Setup PYNQ-Z1](https://qiita.com/0x20FE/items/9b5e8e7a51ac0d9eabbc)
第２回 [はじめてのJupyter](https://qiita.com/0x20FE/items/7fa2fa59c930c571f197)
第３回 [pythonとPYNQ PL資源へのアクセス](2019-08-15_FPGA_PYNQ_Python_zynq_2fbcf08ba9d29b2452be.md)
第４回 [PYNQ OVERLAY](2019-08-15_FPGA_PYNQ_Python_zynq_36755b7e5b60cfbfec87.md)
第５回 [PYNQのOverlayを作ってみた](https://qiita.com/0x20FE/private/81098851f8c8010ca2c8)
第６回 [カスタムIPを作ってPYNQ overlayに組み込む](2019-08-22_FPGA_PYNQ_zynq_ece9f0cc0340763dde61.md)
第７回 [PYNQのHDMI出力overlayを作る](2019-08-24_FPGA_PYNQ_zynq_820e68d300dd978ad21c.md)
番外編　[python ジャンプスタート](https://qiita.com/0x20FE/items/6f8b6d893b9c5c197c5b)



##ボード選び
いまさらALTERAにいけないのでXILINXの評価ボードを探す。KINTEX-7くらいがよいのだが、お手頃価格のものがない。ZynQで探すとZYBO,ZedBoard,PYNQなど良さそう。FPGAはどれもほぼ同じだが、お値段でみるとPYNQ１択。おもちゃにするならpython付きも楽しそう。

Digilent,digikey,amazon,秋月などで扱いあり。思い立ったが吉日、店舗在庫を確認し秋葉原に突撃。

##用意するもの
- PC
- micro USBケーブル
- micro SDカード SDHC 8GB以上

　bootイメージをダウンロードしmicro SDに焼く。USB linuxと同じ要領。

##起動（SD起動、USB電源の場合）
スライドスイッチにbootイメージの読み込み方法と給電方法を設定し、電源を投入します。

- JP4/BootジャンパーをSD側(上側）にセット
- JP5/PowerジャンパーをUSB側(下側）にセット
- SDカードを挿入
- J14/PROG-UART micro USBで電源を供給
- イーサネットケーブルでLANに接続

   IPアドレスは192.168.2.99,もしくはDHCP (自動設定)

##起動の確認
しばらくするとLEDが４つ点灯します。
DHCP運用する場合は、最初にシリアル接続してifconfigするか、手当たり次第にpingを打ってIPアドレスを確認してから、SSHやブウラザでネット接続し、動作を確認します。

|種別|アプリ|コマンド、URLなど|確認事項|
|:--|:--|:--|:--|
|シリアル|screen|screen /dev/tty.usbxxx 115200 |ifconfigでIPアドレスを確認<br>ctr-a kの後yesで切断|
|コンソール|SSH |ssh xilinx@{IPaddress}|ログインできることなど|
|Jupyter|Jupyter|ブラウザ http://{IPaddress}|おたのしみ|
|ファイル|samba|smb://{IPaddress}/xilinx (mac/linux)|ファイルアクセス|

##まとめ
セットアップは簡単でした。
手間がかかるのは、イメージをダウンロードしてSDに焼くことと、DHCPであたったアドレスを探すところ。
間違えやすいのは、スイッチの設定と、sshでのユーザ名(xilinx)の指定です。

次はjupyter!

##参考
本家 PYNQ getting started guide [PYNQ-Z1 Setup Guide](https://pynq.readthedocs.io/en/latest/getting_started/pynq_z1_setup.html)
@sachioksg [PYNQ-Z1を始めます2](https://qiita.com/sachioksg/items/218dc622388250434088)
AtCoder Beginner Contest 137 C（アナグラム判定問題）

##問題文
文字列aに含まれる文字を何らかの順序で並べることで得られる文字列をaのアナグラムと呼びます。
例えば、”greenbin”は"beginner"のアナグラムです。このように、同じ文字が複数回現れる時はその文字をちょうどその回数だけ使わなければなりません。

N個の文字列s1,s2,...,sNが与えられます。それぞれの文字列は長さが10で英小文字からなり、またこれらの文字列は全て異なります。アナグラムであるようなものの個数を求めてください。

##入力例１
3
acornistnt
peanutbomb
constraint

##出力例１
１


 

```c
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main(){
    ll n; cin >> n;
    map<string,ll> m;
    //mapとは、連想配列を扱うためのライブラリの一つのこと。
    //map<キー型, 値型> 変数名;
    
    for(ll i=0;i<n;i++){
        string s;
        cin >> s;
        sort(s.begin(),s.end());
        m[s]++;
    }
     
    ll ans=0;
    for(auto p:m){
        ll x=p.second;
        ans+=x*(x-1)/2;
    }
    //for(auto p:m)は、変数mの配列の中からアルファベットが小さい順に参照している。
    //map<キー型, 値型> 変数名;
    //p.firstでキーを、p.secondで値を参照できる。
    
    cout << ans << endl;
    return 0;
}
```
**auto型**とは、コンパイル時に自動で型を予測し、適切な型に変換してくれる優れもの!
**for文の書き方**はfor(auto i : a) cout << i << endl;のようにも書ける！

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

int main(){
    
    int a[3] = {1, 2, 3};
    for(int i = 0; i < 3; ++i) cout << a[i] << endl;
    for(auto i : a) cout << i << endl;
}
```
```c
//出力結果
1
2
3
1
2
3
```

#まとめ
**map**とは、連想配列を扱うためのライブラリの一つのこと。
**連想配列**とは、好きな名前を添字にできる配列のこと  (0,1,2を添え字にしなくてもいい)
**map<キー型, 値型> 変数名;**

https://atcoder.jp/contests/apg4b/tasks/APG4b_z
GoのGCなどで見かける3色マーキング

これは[あくあたん工房お盆休みアドベントカレンダー](https://esa-pages.io/p/sharing/8538/posts/412/4aade2441d96f3cabc6f.html)2日目の記事です．
本当はGoでDeepLearningする記事を書きたかったのですが，ギリギリまで粘ってもバグが取り切れずとても悲しいので，GoのGC[^gc]に関係する話をちょっと書きます．

先日mattnさんが[Go ランタイムのデバッグをサポートする環境変数](https://qiita.com/mattn/items/e613c1f8575580f98194)という記事を公開されました．
最近趣味でGCを勉強し始めた身としては，runtimeのコードを読む際にとてもためになる記事で大変ありがたいです．

## Concurrent GC
昔話にはなりますが，Goは1.5にて並行GCを導入しました[^go1.5note]．それまでは停止形GC(Mark&SweepGC)を採用しており，ヒープのサイズによってはMarkフェーズのたびに秒単位でプログラムが止まるということがあったらしいです[^go1.5-mem-keynote][^cncrrnt-sweep].
この頃Goを触っていた方はどのように対処されていたのでしょうか．気になります．

### 3色マーキング
Goは並行GCということもあり，3色マーキング(Tri-color Marking)という言葉をよく見かけます．
これは実際にオブジェクトを3色に塗っているわけではなく，マーク処理における3種類のオブジェクトの状態に便宜上つぎのように色を付けて呼んでいます．

- 白: マークされていないオブジェクト
- 灰色: 探索候補に入っているオブジェクト
- 黒: 探索済みのオブジェクト

白と黒は従来のMark&SweepGCと同様，オブジェクトのヘッダ(Goでは別に確保したbitmap)にフラグを建てることで表現します．
では灰色の「探索候補」とは何でしょう？

並行GCではマークフェーズとミューテータによるオブジェクトの操作が交互に行われるため，前回のマークフェーズにどこまで探索したのかを記録しておかなければなりません．
そこで，Goではルートから直接オブジェクトをマークしていくのではなく，一度探索対象のオブジェクトをキューに詰めるという作業を挟みます．このときオブジェクトは灰色の状態になります．
そして，キューからオブジェクトを取り出し，マークをした(黒に塗った)あと，そのオブジェクトがさらに参照しているオブジェクトをキューに詰めます．

しかし，ミューテータによって参照関係が変えられたり，新しいオブジェクトが追加されたりした場合はどうなるでしょうか．

![スクリーンショット 2019-08-11 15.29.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231883/e394260b-33ec-d497-c03f-11cd3b2735f5.png)

コレクタはミューテータによって参照構造が書き換わったとしてもルートから辿れるオブジェクトすべてを黒にしなければなりません．
このような事故を防ぐために，ミューテータ自身も新しくオブジェクトを確保した場合はすぐに黒に塗ったり，参照関係を変更したときは灰色オブジェクトから到達可能な状況になくなるかどうかを判断してそのオブジェクトをキューに詰めたりと，コレクタが次のマークフェーズで生存オブジェクトを見失わないようにします(WriteBarrier)[^writebarrier]．

このようにしてコレクタは見落としの無いようにオブジェクトをマークしていき，キューが空になるか，一定回のマークフェーズの後，ガッとすべてをマークしてスイープ側に処理を譲ります．

### 最後に
Goのruntimeは一部アセンブリもありますがほとんどがGoで書かれていたり，コメントがしっかり書いてあったりして，比較的読みやすいように思えたのですが，そもそも概念が難しいのでなかなか理解が進みません．
間違いがある場合はぜひご指摘よろしくお願い致します．


### 参考文献
- 「ガベージコレクションのアルゴリズムと実装」
- 「ガベージコレクション 自動メモリ管理を構成する理論と実装」
- https://deeeet.com/writing/2016/05/08/gogc-2016/
- https://engineering.linecorp.com/ja/blog/go-gc/
- https://github.com/golang/go/blob/4e15604ada/src/runtime/mgc.go


[^gc]: Garbage Collection
[^go1.5note]: https://golang.org/doc/go1.5
[^go1.5-mem-keynote]: https://talks.golang.org/2015/go-gc.pdf
[^cncrrnt-sweep]: Sweepフェーズはこのときすでに非同期で実行されていました
[^writebarrier]: https://github.com/golang/go/blob/db16de920370892b0241d3fa0617dddff2417a4d/src/runtime/mbarrier.go
C++ Builder 10.2 Tokyo > TDateTime > 文字列からの日付変換 > 不正な文字列の確認 > try, catchではなくTryStrToDate()を使う

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3 
Windows 10 v1903 
```

### 概要

日付文字列からTDate(TDateTime)型を作る際のエラーについて。

### デバッガエラー

下記の実装の場合、日付文字列が妥当か分かるが、デバッガ動作時にエラーが発生する。

```cpp
bool __fastcall TForm1::checkValidDate()
{
	TDateTime res;
	try {
		res = VarToDateTime(L"2019/06/31");
	} catch (...) {
		return false;
	}
	return true;
}
```

### 情報

- [How to check if string is a valid DateTime Format string in Delphi](https://stackoverflow.com/questions/1846446/how-to-check-if-string-is-a-valid-datetime-format-string-in-delphi)

TryStrToDate()関数があるようだ

### 変更後

```cpp
bool __fastcall TForm1::XXX()
{
	TDateTime adt;
	return TryStrToDate(L"2019/06/31", adt);
}
```

こちらの実装に変更後、デバッガエラーは出なくなった。
rmagickインストール時に確認すべきこと

今回インストールするにあたり、エラー解決に時間を要しましたので、
以下にまとめておきます。


## 対応する環境

```prettyprinted
Mac OS X 10.12.6
ruby 2.4.1p111
imagemagick@6 6.9.9-10
rmagick 2.16.0
```


## よく見かけるエラー

`gem install`, `bundle install` 時のエラー。

```prettyprinted
Installing rmagick 2.16.0 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
    :
Can't install RMagick 2.16.0. Can't find MagickWand.h.
```


`bundle doctor` のエラー。

```prettyprinted
% bundle doctor
The Gemfile's dependencies are satisfied
The following gems are missing OS dependencies:
 * rmagick: /usr/local/opt/imagemagick/lib/libMagickCore-6.Q16.3.dylib
 * rmagick: /usr/local/opt/imagemagick/lib/libMagickWand-6.Q16.3.dylib
```




## ImageMagick をインストールする

**現行の `rmagick v2.16.0` の対応するバージョンは `ImageMagick v6` までです。
`ImageMagick v7` には対応していません。**


### imagemagick 6 をインストールする

brew で ImageMagick v6 系を再インストールします。

```prettyprinted
% brew uninstall --force imagemagick@6
% brew install imagemagick@6
```

パスが追加されていなければ追加します。

```:~/.zshrc
export PATH="/usr/local/opt/imagemagick@6/bin:$PATH"
```


### 動作を確認する

`convert` コマンドで動作を確認します。

```prettyprinted
% convert --version
Version: ImageMagick 6.9.9-10 Q16 x86_64 2017-08-28 http://www.imagemagick.org
Copyright: © 1999-2017 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC Modules
Delegates (built-in): bzlib freetype jng jpeg ltdl lzma png tiff xml zlib
```




## rmagick をインストールする


### rmagick を uninstall する

rmagick を uninstall します。

```prettyprinted
% bundle exec gem uninstall rmagick
Successfully uninstalled rmagick-2.16.0
```


### PKG_CONFIG_PATH を調べる

```prettyprinted
% brew info imagemagick@6
    :
If you need to have this software first in your PATH run:
  echo 'export PATH="/usr/local/opt/imagemagick@6/bin:$PATH"' >> ~/.zshrc

For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/imagemagick@6/lib
    CPPFLAGS: -I/usr/local/opt/imagemagick@6/include
For pkg-config to find this software you may need to set:
    PKG_CONFIG_PATH: /usr/local/opt/imagemagick@6/lib/pkgconfig
```


### rmagick を bundle install する

`gem 'rmagick'` を `bundle install` します。

```prettyprinted
% PKG_CONFIG_PATH=/usr/local/opt/imagemagick@6/lib/pkgconfig bundle install --path vendor/bundle
```


確認します。

```prettyprinted
% bundle doctor
The Gemfile's dependencies are satisfied
No issues found with the installed bundle
```




## 補遺

> * [Now RMagick 2.15.4 can't be built with ImageMagick 7.0.x · Issue #256 · rmagick/rmagick](https://github.com/rmagick/rmagick/issues/256)
【初心者】Amazon EFS を使ってみる

# 目的
- Amazon EFS について、向学のために実機で動作確認を行う。

# Amazon EFS とは（自分の理解）
- linuxサーバ(EC2インスタンスもしくオンプレサーバ)に対してNFSを提供するサービス。

# やったこと
- EC2インスタンス(Amazon Linux 2) にEFSのファイルシステムをマウントして利用する。

# 構成図

![nfs04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/2cee9619-02ef-7416-6174-a6fd957ae971.png)


# 動作確認
### EFS ファイルシステムの作成
- VPC、Subnetを指定して EFS ファイルシステムを作成する（各種設定値はデフォルト）。

### EC2(Amazon Linux 2)でEFSファイルシステムをマウント
-  [AWS公式ドキュメント：EFS ファイルシステムをマウントする](https://docs.aws.amazon.com/ja_jp/efs/latest/ug/mounting-fs.html) の手順に従い、amazon-efs-utils パッケージをインストールする。

- mount コマンドを実行する。

```
[ec2-user@ip-10-0-1-248 mnt]$ sudo mount -t efs fs-12345678:/ /mnt/efs
Failed to resolve "fs-12345678.efs.ap-northeast-1.amazonaws.com" - check that your file system ID is correct.
```

- 名前解決に失敗しているようなため、[AWS公式ドキュメント：VPCでのDNS の使用](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-dns.html) を参考に、該当のVPCの「DNS解決」「DNSホスト名」を両方とも有効に変更する。

![nfs02-a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/cac1e45c-bc56-6acd-2f1f-9017dfd3a115.png)


- 再度mountコマンドを実行し、/mnt/efs ディレクトリとして使用可能なことを確認する（一番下の行に追加されていることを確認）。

```
[ec2-user@ip-10-0-1-248 mnt]$ df
Filesystem                                            1K-blocks    Used        Available Use% Mounted on
devtmpfs                                                 485712       0           485712   0% /dev
tmpfs                                                    503664       0           503664   0% /dev/shm
tmpfs                                                    503664     396           503268   1% /run
tmpfs                                                    503664       0           503664   0% /sys/fs/cgroup
/dev/xvda1                                              8376300 1347096          7029204  17% /
tmpfs                                                    100736       0           100736   0% /run/user/1000
fs-12345678.efs.ap-northeast-1.amazonaws.com:/ 9007199254739968       0 9007199254739968   0% /mnt/efs
```

- マウントしたディレクトリに1GBのファイルを作成する。


```
[ec2-user@ip-10-0-1-248 efs]$ sudo dd if=/dev/zero of=1Gfile01 bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 9.0702 s, 116 MB/s
[ec2-user@ip-10-0-1-248 efs]$ ls -l
total 1024000
-rw-r--r-- 1 root root 1048576000 Aug  6 16:01 1Gfile01
```

- EFS の画面でも、容量が認識されていることを確認する。

![nfs03-a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/4a8761ad-7274-25d0-aa33-e7565c2c05b6.png)


# 所感
- 簡単に容量可変、かつスループットも自動拡張されるNFSが作れるということで、自分でNFSサーバ立てるよりかなり楽と感じた。

# 参考記事
-　[【基礎から学ぶ】VPCのDNSについてまとめてみた](http://blog.serverworks.co.jp/tech/2017/04/03/vpc-dns-matome/)
-　[Linux で任意のサイズのファイルを作る](https://qiita.com/toshihirock/items/6cb99a85d86f524bc153)
ngrokとかserveoとか使ってWebView(LIFFとか)開発でキャッシュしないローカルサーバ構築

LIFFのサンプル動かしたりお試ししてるときにWebViewがキャッシュしちゃって、ファーめんどくさい！！ってなるときのTips

準備：NodeJSが入ってる環境で  npm install -g http-server をたたく

1. 実行したいディレクトリに移動して http-server -c 0 とたたく
2. ngrokとかserveoとかで8080を公開する

http-serverにはいくつかパラメータがあるんですが、-c 0 にすると０秒キャッシュになります。これでResponse Headerに cache-control: max-age=0 が入るようになってキャッシュされにくくなります。
ただ、キャッシュ制限されてない状態で初回にアクセスしたりするとずっとキャッシュしてしまったり、なぜか設定してもキャッシュするときはするんで、Androidだとアプリ設定からストレージのキャッシュを削除するとかそういう方法も覚えておいたほうがいろいろ楽でもある。
Composer の "scripts" 単位で Timeout の無効化が設定できるようになって便利

2019年8月3日に、Composer1.9がリリースされていて、その中で `Composer\Config::disableProcessTimeout` ヘルパが便利そうであった。

## Composer のコマンドの実行タイムアウトは通常 300秒

Composer では、通常コマンドのタイムアウトが300秒に設定されている。
このため、`scripts` に、開発用サーバ起動コマンドなどを設定しようものなら、5分で強制終了されてしまう。

`scripts` によるスクリプトの定義は、以下などを参照されたし

- [PHPのComposerでコマンドを定義したら開発がすごく便利でした](https://qiita.com/yousan/items/94d035a838297b4afb8f)


```json:composer.json
{
    "scripts": {
        "server": "php -S localhost:8080 -t public/"
    }
}
```

```
$ composer server
> php -S localhost:8080 -t public/
```

-> 5分後、サーバが勝手に止まります。悲しい。

## タイムアウト無効化・変更する技 (1.8以前)

以下の設定を0秒にすることで、無効化できます。下に行くほど優先度が高い (設定が上書きされる) です。

- composer 設定の、`process-timeout` を設定する。
    - `composer config process-timeout 0` にとすることで、composer.json にタイムアウトが無効化される設定が書き出される。ただし、当該プロジェクト全体で適用されてしまうので、都合が悪い場合があるし、ドキュメント等でその方法を示す必要がある。
- `COMPOSER_PROCESS_TIMEOUT` 環境変数を設定する。
    - `COMPOSER_PROCESS_TIMEOUT=0 composer server` で起動することで、当該コマンドに限りタイムアウト設定を無効化できる。ドキュメント等でその方法を示す必要がある。
- `run-script` で `--timeout` オプションを設定する。
    - `composer run-script --timeout 0 server` で起動することで、当該コマンドに限りタイムアウト設定を無効化することができる。ドキュメント等でその方法を示す必要がある。

と、すべてドキュメント等に記載しないとワークしない方法の数々です。スクリプトの共有を楽にするはずが、これではよくありません。


## `Composer\Config::disableProcessTimeout` ヘルパによる無効化

そこで、登場したヘルパはスクリプトとして記載することで、そのスクリプトに限りタイムアウト設定を無効化することができるスグレモノです。
このヘルパは、上記の設定等中で最優先されます。

```json:composer.json
{
    "scripts": {
        "server": [
            "Composer\\Config::disableProcessTimeout",
            "php -S localhost:8080 -t public/"
        ]
    }
}
```

```
$ composer server
> Composer\Config::disableProcessTimeout
> php -S localhost:8080 -t public/
```

→ タイムアウトしなーい。

もちろん、Composer1.8以前だと以下のようなエラーが出るので、このエラーが出る場合は `compser self-update` を忘れずに。 (1敗)

```
Method Composer\Config::disableProcessTimeout is not callable, can not call server script
```

## 参考資料

- https://github.com/composer/composer/releases/tag/1.9.0 
- https://getcomposer.org/doc/articles/scripts.md
Laravel 認証で$requestは合っているのに認証されなかった理由

#Laravel5.7の認証で$requestの値は合っているのにLoginができなかった理由


マルチ認証でAdminのデータをseederファイルに書いてDBに入れた。

その時に`'password' => 'password`とそのままにしていたので値は合っているのにloginができなかった。

`'password' => Hash::make('password')`
Hash化しないといけないようでした:dancers:
もし同じように悩んでる人の手伝いになればウレシスです:relaxed:




```
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;

class BrandsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('brands')->insert([
            [
                'created_at' => date('Y-m-d H:i:s'),
                'brand_name' => 'Apuweiser-riche',
                'brand_name_kana' =>'アプワイザーリッシェ' ,
                'category' => 'feminine',
                'password' => Hash::make('password'),
            ],
```
Wifi打刻の話

ググると結構他の会社さんもやってたりするのですが、今働いている会社でもやってみたいなーと思ったので初期段階の半年前ぐらいから導入してみましたというお話。

## Wifi打刻とは

個人のスマホなどが会社の Wifi に接続されたことを検知して打刻として記録します。打刻忘れで注意したり修正・承認したりとかそういうことに使う非生産的な時間と精神の消耗を抑えられるのが良いです（そもそも忘れんなというのはごもっともなんですが…）。

基本的な仕組みは、 ARP と呼ばれるプロトコルを利用して Wifi に繋がっている Mac アドレスを取得し、事前登録した名簿と突合させます。 

## 実装

ARP をスキャンする部分とそれを集計して表示する部分に分かれて 2 人で本業の片手間に作りました。

### ARP Scan

TCP/IP と比べるとそれほど有名ではないですが、ルーターが直接繋がった機器と通信するためにいつもお世話になっているプロトコルです ([RFC 826](https://www.ietf.org/rfc/rfc826.txt))。「この IP 誰？」「ワイやで (MAC アドレスを返す)」という感じです。

シェルスクリプトで作ったりすると簡単ですが、人数によっては細かい調整が必要かなとか Windows でも動かしたいとかあると思い Go で Daemon として実装しました。 [github.com/google/gopacket](https://github.com/google/gopacket) を利用して、 Scan 結果を Web API に投げます。

コマンドで実装する方法と比べて良いのは、 ARP を常に Read したままにできることと Write の頻度を調整できるあたりです。

`examples/arpscan` の `readARP` を継続したまま、適当な頻度で `writeARP` を呼び出します。このとき、おそらく `writeARP` の頻度が高すぎると、スマホ側の応答回数も増えて電池の消費やネットワークの品質に関わってくるはずです。ある程度調整した結果、皆が出社してくる辺りだけ 10 秒間隔にして、それ以外は 1 分ごとにしました。

ただ、 [/16より大きいネットワークは制限されている](https://github.com/google/gopacket/blob/8f77079ccf2ce88002ad88a5d5fe541ad20f765e/examples/arpscan/arpscan.go#L79)ので、ここだけは組織が大きくなってきたときにちょっと注意が必要です。そもそもそんなサブネットに皆が直接つなぐ運用するのかという話ではありますが。

### UI/Chat bot

こちらはもう一人別の方の成果なのですが、 Firebase を GSuite のドメインで絞って (参考：[[Firestore] Google認証で特定のドメインのユーザーだけアクセスを許可する](https://qiita.com/avosalmon/items/87f2671bea14245bff65)) 作っています。

スキャン結果がアップロードされるとすぐに画面が更新されるので、確認するともう打刻されてる！って感じがとても気持ち良いです。

Chat bot は Scan されなかった通知や直行・直帰などで関わってきます。こちらも内輪ネタを軽く含みつつ親しみやすいように作られていて快適です。

## 運用

共有の端末にスキャンする Daemon を仕込んで動かしています。

### 複数拠点対応

ローミングできるように SSID や暗号化方式等を合わせて Wifi を組むことで、普段とは別な拠点に出社した場合でも自動で Wifi に繋がって打刻までされるという状況が出来上がりました。

Daemon の配置も Go で作るとバイナリを配置するだけなので楽です。 また、（結局はやらなかったのですが） [Npcap](https://nmap.org/npcap/) を使えばライセンスの制限内なら Windows 機でもいけるようです。

### サポート

導入の段階では何度か人事・労務の方々と調整して疑問を解消したり小さい改善をしたりしてしていました。特に Mac アドレスの表示方法は iPhone, Android 両方の画像を用意するのが良いと思います。また、システムに関わる質問等は Slack で勤怠関連のチャンネルと混ざると苦しいので、 Wifi 打刻システム専用のチャンネルに分ける方が良いです（といっても最近は 1 ヶ月に 1 件あるか無いかぐらいですが）。

### 発生したトラブル

50 人程度を超えたあたりでルーターの限界が来るようになって、スキャンしている端末の方が Wifi から切断されるようになってしまいました。早めに来た方に Wifi を繋ぎ直してもらって回避しつつ、結局はネットワークの増強で解決したのですが、本当はスキャンする側で一旦 SQLite とかで保存して繋がったら同期するとかがスマートなんだと思います。

## 他社さんの事例

* [メルカリの便利な社内システム大公開｜anzu日記](https://mercan.mercari.com/articles/2017-01-17-133000/)
* [Wi-Fi打刻作ったお話](https://note.mu/gupuru/n/nf9bd960f82fe)
* [wifi打刻システムをつくった話]( https://tech.raksul.com/2018/09/14/wifi%E6%89%93%E5%88%BB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%9F%E8%A9%B1/)
* [勤怠打刻をmacアドレス検知方式に変えた話](https://qiita.com/nsmyuzin/items/367670986cb5d08b1e80)

## まとめ

[好評いただいているようで何よりです](https://www.wantedly.com/companies/bitkey/post_articles/179615)。

> ビットキーでは独自の打刻方法を導入しているんですけど、これはあるエンジニアが構想含め0から作っているものなんです。今では日々の勤怠において欠かせないものになっています。こういった開発は事業にダイレクトに影響する訳ではないですしもちろん売上に貢献するということもないですが、会社として時間を投資することを認めているし重んじているんです。テクノロジードリブンな文化がエンジニアとしては素直に嬉しいですし面白いですね。

* 打刻そのものの手間はもちろん、打刻忘れから発生する色々な消耗が減ります
* Go で ARP を扱うと、結構細かい調整までできます
* ローミングと合わせて構築すると、拠点が増えても快適です
* ルーターの負荷にはお気をつけください
* 人事・労務の方とも連携しましょう
【IAM(AWS)】権限制限付きユーザーの作成方法

先日AWSのS3を使う上で、セキュリティ対策を行わなければいけないということで、
その手順をまとめましたが、

IAMというサービスとS3の登録方法と言ったところも深掘りしていかないとなかなか辻褄の合いにくい箇所もあっただろうということで、今日はIAMについて書きます。

下記記事と連携して当記事をご覧ください。

[AWS利用上のセキュリティを確保する方法](https://qiita.com/AK4747471/items/f8b5e2e6005d1d22670e)


<h2>IAMとは</h2>
AWS Identity and Access Management (IAM) は、AWS リソースへのアクセスを安全にコンソールするためのウェブサービスです。

要は、できることを制限した擬似アカウントを作れるということみたいです。

このアカウントを他人と共有して使うこともできるみたいですよ。

今回はS3機能だけが使えるIAMユーザーを作成したいと思います。

<h2>権限を制限したユーザーを作成する</h2>

ログインしているユーザーの権限は一番強いものはrootになります。AWS上の、どんな操作も可能であるため、もしこのアカウントを不正利用されたら、高額な請求が来てしまう可能性もあります。


代わりに、使える権限を制限したユーザーをIAMを利用して作成します。


AWSにログインしたら、サービスからIAMを開きます。


遷移先のページで下記をクリックします。

<img width="777" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434850/3479e31f-842b-905c-fba2-3d44b3046fc8.png">

左上のユーザーを追加を選択。
<img width="423" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434850/8de42957-6a8b-8b76-8e3f-ffe891735ef1.png">


ここで作成するユーザー名を登録します。
<img width="1011" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434850/95440fac-edb1-635a-3340-1debf5a07ff2.png">


次はアクセス権限の設定です。
「AmazonS3FullAccess」を選択してください。

<img width="985" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434850/0180a563-6a20-c97e-d2fc-7b18358b65b8.png">


選択したら、「次のステップ：タグ」をクリックします。
<img width="1017" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434850/ab1df853-1786-7ae4-7cf2-1cd69e1b0124.png">


ここでは何もせずに、「次のステップ：確認」を押します。
<img width="1039" alt="7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434850/2be666a8-7ad6-4f9d-854f-5f144db2b508.png">


この画面まできたら、ユーザーの作成をクリックします。

<img width="1033" alt="8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434850/661392a2-f7c2-5ae7-1ca3-93f7abda6914.png">


<h3>※忘れずに認証情報をダウンロードしてください</h3>

<img width="569" alt="9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434850/429d45be-54d9-3da3-3949-f3826e61bf7a.png">


<h2>IAMユーザーにパスワードを持たせる</h2>

IAMのメニューから作成したIAMユーザーをクリックします。
遷移したページで「管理」をクリックします。
<img width="736" alt="10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434850/6089299f-fee2-9870-ca24-92b09484bcb6.png">


そのまま下の画像のように「有効化」「自動生成パスワード」をクリックします。
<img width="625" alt="11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434850/96cca08c-d63d-b18a-a743-506c4b5cb83e.png">


ここでもおなじように認証情報をダウンロードしておきます。
<img width="614" alt="12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434850/50e2882d-b68f-056a-bbe6-685194e9821e.png">



<h2>作成したIAMユーザーにログインする</h2>

今作成した、制限つきユーザーでログインしてみます。

IAMのトップページの以下のリンクをコピーし、URL欄に貼り付けて遷移します
<img width="803" alt="13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434850/4e59787a-e8f4-8178-2226-8df2e02ef133.png">


下記画面に遷移するので、ユーザー名とパスワード、それぞれダウンロードした認証情報を入力してサインインすることができます。

<img width="1011" alt="14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434850/3759569d-98d5-fe45-048d-b489df4c2c74.png">

hogehogefugafuga書き疲れた。
Windows10のUTF8化(ベータ機能)試した結果をさくっと

# その後の追記（WSL2など)

記事を書いてから１年半。あいかわらず、Windows環境ではUTF-8を使っているのですが、特に問題なく使えています。Steamゲームも山程やりましたし、modも入れまくりましたが問題ありませんでした。

が！2020年「WSL2」というWindows上でLinuxをほぼカンペキに動かす仕組みが現れ、Windowsユーザーが簡単にWindowsでLinuxを動かすことができるようになりました。

なので、Windows上のウェブ系の開発まわりで文字コードに困った方がいましたら、いまだβ版の機能使って人柱になるよりは、さくっとWSL2インストールしてWindowsからLinux扱ったほうが有益かと思います。軽いし簡単だしOS間の垣根すら感じさせないのでとてもおすすめです。

技術の進歩にありがたやありがたやです。



# Windows10のUTF8化(ベータ機能)試した結果をさくっと

Windows環境で、日本語文字コードShift_JISに悩まされた人は多いんではないでしょうか？
それとも最近はそうでもないのでしょうか！
**WindowsでShift_JISと決別できる機能が実装されていた** 、と知り、2ヶ月ほど試してみました。

まだベータ版みたいなので、ひとまず現状を共有しておきます。
結果としては、一部アプリケーションが文字化けするなどの現象は起きていますが、特に大きな不都合は感じていません。

## 設定方法
→コントロールパネル
→地域
→地域ウィンドウの管理タブ
→システムロケールの変更
→「ベータ：ワールドワイド言語サポートでUnicode UTF-8を使用」にチェックを入れる
→再起動

↓導入方法はこちらの説明が親切でした！
[Windows10 – システムロケールをUnicode UTF-8に変更する方法・言語設定 \| Howpon[ハウポン]](https://howpon.com/247)

## 使用結果
- 環境
    - Windows10 Pro
    - バージョン 1903

ちなみに、Windowsの使用用途としては、普段づかいです。業務には使用していません。
どちらかというと毎日ハードに酷使している方だと思われます…。

- 問題あったもの
  - [棒読みちゃん](https://chi.usamimi.info/Program/Application/BouyomiChan/)
        - 各ツールと連携して、音声読み上げしてくれるツール。
        - 悲しいことに、日本語の単語の入力を受け取ると、謎の言語を自動読み上げするようになりました。
  - [♪超録 - パソコン長時間録音機](http://pino.to/choroku/)
        - 連続録音ツール。分割やタグ付けが簡単にできます。
        - 録音ツールUIが文字化けします…。なんとか入力タグ名などアルファベットで入れることで回避して使えてはいます。


- 問題なかったもの
  - 某MMOオンラインゲーム
  - Steamゲーム各種
  - Discord
  - VisualStudioCode
  - BoostNote
  - Notepad++
  - MobaXterm
  - Mumble


## まとめ

そういえば、かつて昔…Windowsアプリケーション開発をC++でやってたときは、サーバーから受け取ったUTF8の文字列をSJISに変換してクライアントに表示。とかしてたような…。
もしかしたら古いVisualC++あたりで作られた現役アプリケーションは
文字化けしちゃうかもしれないですねっ。

最近のアプリケーションは、Windowsストアアプリやウェブベースのものが多く、おそらく文字コードがUTF8かUTF16だと思われますので、問題無いものが多そうです。

ちなみに、最近メモ帳の既定文字コードもUTF8になったようで！ガツガツ脱SJISなのでしょうか！

- [メモ帳の文字コード既定値がUTF-8に、Windows 10「May 2019 Update」 \| 日経 xTECH（クロステック）](https://tech.nikkeibp.co.jp/atcl/nxt/column/18/00723/042300004/?P=1)

※ あくまでも、個人的に使用した結果で、あれこれ検証したわけではありません。
※ 間違いなどありましたら申し訳ありません。ご指摘いただけますと幸いです。


## 導入にいたったいきさつ…
Windows10環境でAnaconda経由でJupyterNotebook使って、GitBash入れて、JupyterからLinuxコマンド呼び出して、日本語系のファイル見ようとしたときに、ファイル形式をSJISにしようがUTF8にしようが、その他あれこれ試しても、うまくいかなかったので試しました。
あっさり、問題は解決しました。便利！
他にも対処方法はありそうですが、ひとまずよしとします！
Map<String, Object>でSELECT文の結果を受け取る

　タイトルを見て「そういうことができる」と分かればそれで解決する話だと思いますが一応書いておくと、DOMAでエンティティクラスを用意しなくても、SELECT文の結果を`Map<String, Object>`で受け取ることができます。

```ArticleDao.java
package com.qiita.kakeiakihiko;

import java.util.List;
import java.util.Map;

import org.seasar.doma.Dao;
import org.seasar.doma.Select;
import org.seasar.doma.boot.ConfigAutowireable;
import org.seasar.doma.jdbc.SelectOptions;

@ConfigAutowireable
@Dao
public interface ArticleDao {
	// 1件取得
	@Select
	Map<String, Object> getItem(Long id);

	// 複数件取得
	@Select
	List<Map<String, Object>> getItems(SelectOptions options);
}
```
CISSP 単語集

# CISSP 受験にあたり単語をまとめました
下記問題集から単語を網羅しています:

* [The (ISC)2 CISSP Official Practice Tests 第一版、第二版](https://www.amazon.co.jp/CISSP-Official-ISC-Practice-Tests/product-reviews/1119252288)
* [CISSP Practice Questions Exam Cram (4th Edition)](https://www.amazon.co.jp/CISSP-Exam-Cram-Michael-Gregg/dp/078975553X)
* [CCCure](https://www.cccure.education/) （2019/6 月時点で CISSP に属するすべての問題）

全部で 1600 語あまりあります。説明は google 先生で適当に翻訳したりしていますけど、リンク元を可能な限りつけて追いかけられるようにしています。一度は参照元をみるとよいでしょう。

* [Domain 1 (Security and Risk Management) 16%](https://quizlet.com/jp/253726744/domain-1-security-and-risk-management-16-flash-cards/)
* [Domain 2 (Asset Security) 10%](https://quizlet.com/jp/253462824/domain-2-asset-security-10-flash-cards/)
* [Domain 3 (Security Engineering) 12%](
https://quizlet.com/jp/253473292/domain-3-security-engineering-12-flash-cards/)
* [Domain 4 (Communication and Network Security) 12%](https://quizlet.com/jp/253475453/domain-4-communication-and-network-security-12-flash-cards/)
* [Domain 5 (Identity and Access Management) 13%](https://quizlet.com/jp/255689261/domain-5-identity-and-access-management-13-flash-cards/)
* [Domain 6 (Security Assessment and Testing) 11%](https://quizlet.com/jp/255693428/domain-6-security-assessment-and-testing-11-flash-cards/)
* [Domain 7 (Security Operations) 16%](https://quizlet.com/jp/256298383/domain-7-security-operations-16-flash-cards/)
* [Domain 8 (Software Development Security) 10%](https://quizlet.com/jp/256298696/domain-8-software-development-security-10-flash-cards/)

ググっても見つからなかった単語は、問題集自身の回答から引用しています。 CCCure のドメインはかなり適当なので、この単語集もドメインわけは適当さが残っています。あんま気にしないように。

* QID は、The (ISC)2 CISSP Official Practice Tests 第二版の問題 ID https://testbanks.wiley.com/WPDACE/Login
* CCCure とあるのは https://www.cccure.education/ （有料）からです。
幸せな休日コーディングを続ける10+1通りの方法

## はじめに

以下、個人的なメモです。
エンジニアたるもの楽しくモノづくりに励む休日もあって然るべきだろう。

趣味で行う休日コーディングは、人に迷惑をかけない限り何もかもが自由である。
学習に重きを置いてもよいし、へんてこでもとにかく完遂を目指してもよい。
**やるからには、楽しく行こう。**

だのに…

* 気が散って全然進まなかったり
* 環境構築で躓いて楽しい作業に到達できずに投げたり
* 設計書なんて書いていないのでカオスなコードに自暴自棄になったり

なんてことも多いのでは。
ここでは、どうすれば良いのだろう、と考えて実践してみたことをメモしておく。
筆者個人の戒めと性格に基づいており、また、目新しさも無いが誰かの参考になれば幸甚である。

## 方法

1. 今日で8割を終わらせようとする
    * 基本的な考え方は中島聡さんの受け売り
    * 趣味のモノづくりは、線形に進みにくい
    * 「今日は環境構築だけでOK」というやり方では、環境だけが残りモノは一向にできない
        * そして、次週には存在を忘れている…
    * 最低限の機能の簡単な設計ができたら、ガーッとやってしまおう
2. TODOを書き出す
    * 作業のネストが深くなって旅に出てしまいたくなったとき
    * 8割の完成を目標としたとき、あと何をすればよいか
    * ある程度構築が進むと新しいアイディアや問題点が相当数見えてきているはず
        * とりあえず書き出すとTODO同士の関連性や優先度が見えてくる
        * なんだか終わりそうじゃん！となる
3. リリース時のインフラ周りを妄想する
    * 完成イメージでやる気がアップする
    * おおよそは杞憂と取らぬ狸の皮算用の混沌で心が満ちる
4. シャワーを浴びる
    * ハマったり、行き詰まったりしたとき
    * 思わぬ解決策が降ってくることが多い
    * 休日は起き抜け→だらだらコーディング開始が常なのでリフレッシュ大事
    * しかし、ガス代はかかる
5. 姿勢を変える
    * せっかく家なのでベッドやソファに寝転んだり、床にうつ伏せたりしながらでも誰にも叱られないが、うっかり10時間その体勢のままとかザラにある
    * 昨夜、それで腰が固まって、一度立ったあと座ることも寝ることも歩くこともできなくなった
    * あなたの身体はスケーリングできない、物理的に負荷分散しよう
6. リファクタリングする
    * 未知の領域を学習しながら、なんとなくで構築を進めていると…
    * いつのまにかめっちゃ大きいコンポーネントが成長しつつあったり、どこかで書いたロジックや定義をまた打ってたりする
    * 一度、綺麗にリファクタリングしよう
    * どんどん整理されていくコードを見ると、気持ちよくて良い子になった気分になる
    * 趣味とはいえ、近い未来の自分を楽にする作業なので決して無駄ではない
    * プログラマとしての美学を追求できるので、自己の満足感が得られる
7. 全体的なデザインを整える
    * 内部的な部分でハマったときとか
    * 後回しになっていたレイアウトなどを一通り整えて気分転換しよう
    * 簡単に視覚的な進捗、完成イメージに近いものを得られるので気分があがる
    * ただし、細かいアイコンデザインやカラー、挙動は後にしよう
    * 慣れないデザインでイライラするくらいなら、それも後にしよう
8. 音楽を止める
    * これは人によるが、個人的には音楽とコーディングは同居不可
    * code / chord どちらを追ってるのか分からなくなる
    * かといって静けさも居心地が悪いので、旅番組やニュースを流しておく
9. とりあえず既製のものを埋めておく
    * 本質的な機能でなく作り込みも必要ないなら、適当なものを放り込んでおこう
    * 例えば、ページングや通知、モーダルなど誰が作っても同じになるものに関しては車輪の再発明はいらないと思う
        * 学習目的、カスタマイズ性が問われるといった場合はこの限りではない
10. 違和感を楽しむ
    * まだ触ったことのないプログラミング言語、環境、フレームワークにトライする多い
    * 仕事で触っていたり、既に習得済みのものとの違いを相互に確認しながら違和感を楽しもう
        * この処理はこう書けるのか！イケてる！
        * いやいや、これは冗長すぎるでしょ…敢えて○○っぽくこう書いてみよう
    * 得られるものは成長だ

## おわりに

これはどんな趣味にも共通するが、
休日のモノづくりなんて、やらなくても誰にも文句は言われない。
この贅沢な時間を使って、楽しさ×成長を最大化するにはどうしたらよいか、
今後も改善を繰り返していきたい。また、みなさんの経験談もお聞きしたい。

この年になってくると、多感な時期に比べて集中力も落ちてきているように感じたので、
いろいろと忘れないうちに10+1通りの方法をメモしておこうと思い、投稿してみた。

ああ、そうだそうだ。

`11. Qiita に記事をアウトプットしてみる`

以上。
【Ruby】 自己学習メモ　まとめ

### 前置き
転職活動をキッカケに始めた新しい言語の勉強が思いのほか楽しくなってきたので、Rubyにも手をつけることにしました。
最終目標としては、「Rubyで何かシステムを作り、一般公開する」ですが、Qiitaへの投稿内容としては、勉強したコトのまとめです。

このエントリは、今後投稿していく自己学習メモや、それに関する情報へのリンク集、その他Tips集のような内容としたいと思います。

### 開発環境
端末：MacBook Pro(macOS 10.14.5)
Macの場合は初期段階ですでにRuby導入済のため、「ソースを書いて、ターミナルで実行してみる」というレベルであれば追加でなにかインストールや設定を行う必要はなし。

### Hello World
ターミナルでの実行方法、および稼動確認をかねて、ごく基本的なソースの書き方を確認。

#### インストール済みのRubyバージョン確認
```terminal
$ ruby -v
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
```

#### ファイルの実行
Rubyソースファイルの拡張子は"rb"
"Hello World"を表示するごく簡単なソースを書きます。

```ruby:HelloWorld.rb
message = "Hello World!"
puts message
```

ファイルを指定して実行するには、rubyコマンドの後に、ファイル名を指定するだけ。
実行結果は以下の通り。

```terminal
$ ruby HelloWorld.rb
Hello World!
```

`puts`は改行ありの標準出力。
`print`は改行なしの標準出力。

よって、以下のようなソースでも上記と同様の出力結果となる。

```ruby:HelloWorld2.rb
message = "Hello"
print message

message = " World!"
puts message
```

```terminal
$ ruby HelloWorld2.rb
Hello World!
```

### 学習メモ　リンク
これから追加していきます。

### 関連リンク集
これから追加していきます。



時間の都合上、いったんここまで。
改めて随時加筆修正予定。
［Java / Swift］Java Interface と Swift Protocol の比較

### この記事で書くこと
Java `interface` と Swift `Protocol` の比較

### この記事を書いた理由
・ 基本情技術者試験対策
・ Java と Swift で似ている箇所の比較

### コード例（Java interface）
```java:main.java
public class Main {
    
    interface sampleInterface{
        String sampleFunction(String a, String b);
    }
    
    
    public static void main(String[] args) throws Exception {
    
    /* クラスに interface を実装する時は、implements と書く */    
    class A implements sampleInterface{
        public String sampleFunction(String a, String b){
            return "「" + a + "」と「" + b + "」はclassAに定義されたsampleFunctionの引数";
        }
    }
    
    class B implements sampleInterface{
        public String sampleFunction(String a, String b){
            return "「" + a + "」と「" + b + "」はclassBに定義されたsampleFunctionの引数";
        }
    }
    
    A a = new A();
    B b = new B();
    
    System.out.println(a.sampleFunction("c","d"));
    System.out.println(b.sampleFunction("e","f"));

    }
}
```

### 出力結果（Java）
```
「c」と「d」はclassAに定義されたsampleFunctionの引数
「e」と「f」はclassBに定義されたsampleFunctionの引数
```


### コード例（Swift Protocol）
```swift:sample.swift
// プロトコル
protocol SampleProtocol{
    func sampleFunction(_ a:String, _ b:String) -> String
}

// class A
class A:SampleProtocol{
    func sampleFunction(_ a:String, _ b:String) -> String{
        return "「\(a)」と「\(b)」はclassAに定義されたsampleFunctionの引数"
    }
}


// class B
class B:SampleProtocol{
    func sampleFunction(_ a:String, _ b:String) -> String{
        return "「\(a)」と「\(b)」はclassBに定義されたsampleFunctionの引数"
    }
}


var a = A()
var b = B()

print(a.sampleFunction("c","d"))
print(b.sampleFunction("e","f"))
```

### 出力結果（swift）
```
「c」と「d」はclassAに定義されたsampleFunctionの引数
「e」と「f」はclassBに定義されたsampleFunctionの引数
```
LaTeX文書にコーヒーの染みをつける

コーヒーにお世話になっている方は多いでしょう．人間にとってコーヒーは欠かせないものです(適当)．
ネットの海をのんびり泳いでいたところ，[LaTeX Coffee Stains](http://hanno-rein.de/archives/349)というものを見つけました．
その名の通り，コーヒーの染みを付けられるらしい．

## やってみよう
僕は普段からVisual Studio CodeでLaTeX Workshopを使っています．これ便利ですよね．

まず先ほどのサイトから圧縮ファイルをダウンロードし，それを解凍して中にあるstyファイルを今から作るtexファイルと同じディレクトリに置いておきます．ダウンロードするのは最新のものでいいでしょう．

必要なパッケージは以下の通りです．

```tex
    \usepackage{tikz}
    \usetikzlibrary{arrows,shapes}
    \usepackage[utf8]{inputenc}
    \usepackage{pxfonts}
    \usepackage{pxpgfmark}
    \usepackage{coffee4}
```

documentclassについてはなんかいい感じでどうぞ．

それでは染みをつけていきましょう．LaTeX Coffee Stainsを使ってできる染みの種類は4つです．それぞれ以下のように書くことで描画できます．

```tex
\cofeAm{alpha}{scale}{angle}{xoff}{yoff}
\cofeBm{alpha}{scale}{angle}{xoff}{yoff}
\cofeCm{alpha}{scale}{angle}{xoff}{yoff}
\cofeDm{alpha}{scale}{angle}{xoff}{yoff}
```

alphaは透明度を0~1の間で指定できます．
scaleは大きさで，デフォルトが1になります．
angleは回転角で0~360°．
xoff，yoffで位置を調整できます．単位をcmと書いてやらないといけないっぽい．

ちなみにcofeAmはこんな風になります．

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372370/2acafe77-30d2-61e6-b0f6-a8502441b2a5.png" width=50%>

たぶんこれでいけるはず．「書き方ミスってないのになんかエラー出た!」というような場合があれば，おそらくパッケージの問題だと思われるので調べてみてください．

では最後に，製作者様の言葉をお借りして終わりにします．

**Coffee will save the world.**

---
参考サイト
[http://s-shimotori.hatenablog.com/entry/2015/08/10/164440](http://s-shimotori.hatenablog.com/entry/2015/08/10/164440)