OmniAICreator/Qiita-1.07M huggingface dataset:
ERC20とは

#ERCとは#
ERCはEIP（Ethereum Improvement Proposal）の1種です。EIPとはEthereumのシステム改善提案のことを意味します。
EIPは以下のリポジトリでまとめられており、プルリクエストを送ることで提案を行うことができます。
https://github.com/ethereum/EIPs

一方でERCはEthereum Request for Commentの略でEthereumのアプリケーションレベルのスタンダードや規則を規定する提案書を指します。コントラクトに関わる提案はここに含まれます。

#ERC20について#
ERC20以下にEIPとして取り込まれています。
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
ERC20はEthereunmのトークンのinterfaceの標準を定めたものです。
多くのトークンに共通する標準的なインターフェースを定めることで、ウォレットやDEXなど、Ethereum上でトークンが共通して利用できるようにすることを目指しています。
ERC20に準拠したトークンを作成する際には以下のメソッドを記述する必要があります。

```
トークンの供給量を返す
function totalSupply() view returns (uint256 totalSupply)
あるアドレスの残高を返す
function balanceOf(address _owner) view returns (uint256 balance)
あるアドレスに指定した量を送金
function transfer(address _to, uint256 _value) returns (bool success)
あるアドレスから別のaddressに指定した量を送金
function transferFrom(address _from, address _to, uint256 _value) returns (bool success)
_spenderがアカウントから_valueの量まで複数回引き出すことを許可します。 
function approve(address _spender, uint256 _value) returns (bool success)
_spenderが_ownerから引き出せる量を返します.
function allowance(address _owner, address _spender) view returns (uint256 remaining)
```

Eventとして以下の２つを実装

```
event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)
```

オプショナルで以下の3つのメソッドもあります。

```
function name() view returns (string name)
function symbol() view returns (string symbol)
function decimals() view returns (uint8 decimals)
```
Python3とBeautifulSoup使って図書館で借りた本をスクレイピング

# はじめに
図書館で借りた本のログを取りたいなと思い、貸出中の本のリストを取得するプログラムを書いてみた。今まで借りた本が見れないので、どうにかログを残したいと思ってる。

# やったこと
ログインして決め打ちで書名を取得する。HTMLを確認しながら、地道にがんばった。
`authenticity_token`は毎回変わるみたいなので、取得してPOSTする。
マジックナンバーはHTMLを見たら意図がわかると思う。


```python:scrape.py
from bs4 import BeautifulSoup
import requests

payload = {
    'utf8': '✓',
    'user[login]': 'xxx',
    'user[passwd]': 'yyy',
    'act_login': 'ログイン',
    'nextAction': 'mypage_display',
    'prevAction': '',
    'prevParams': '',
    'kobeid': '',
    'pvolid': '',
    'type': '',
    'shozo_kyk': ''
}

s = requests.Session()
r = s.get('https://www.lib.city.kobe.jp/opac/opacs/mypage_display')
soup = BeautifulSoup(r.text)
auth_token = soup.find(attrs={'name': 'authenticity_token'}).get('value')
# print(auth_token)                                                                  
payload['authenticity_token'] = auth_token

res = s.post('https://www.lib.city.kobe.jp/opac/opacs/login', data=payload)
res.raise_for_status()
# print(res.text)                                                                    

r = s.get('https://www.lib.city.kobe.jp/opac/opacs/lending_display')
soup = BeautifulSoup(r.text)
booklist = soup.find('div', class_= 'table_wrapper lending').find_all('tr')
print(len(booklist)-1)

for book in booklist[1:]:
    book_name = book.find_all('td')[2].get_text()
    print(book_name)
```

結果はこんな感じ。ほぼ絵本。ちなみに落合陽一氏の本も子育てのこと考えて借りてみたけど、なかなか頭に入ってこなかった。

```
超AI時代の生存戦略 : 「2040年代」シンギュラリティに備える34のリスト///落合陽一著/大和書房
なにしてあそぶ?///パット=ハッチンスさく/偕成社
にじのピラミッド/アンパンマンプチシアター//やなせたかし作・絵/フレーベル館
これなあに : 英語つき/日本のえほん//星灯社絵/学研プラス
よんでみよう///ごとうゆうか著/岩崎書店
こんくんのおんがくはっぴょうかい : つんつくむらのおはなし/講談社の創作絵本//たしろち/講談社
おまつりのねがいごと : つんつくむらのおはなし/講談社の創作絵本//たしろちさと作/講談
```


# おわりに
HTMLの知識もPythonの知識もBeautifulSoupの知識も中途半端だったけど、検索しながらやったら、まあまあなんとかなった。
このあと、ブクログとかスプレッドシートに入力するプログラムを書きたい。

# 参考
## ログイン

[【Python3】ログイン機能付サイトでスクレイピング【requests】【BeautifulSoup】 - Qiita](https://qiita.com/shunyooo/items/36af8bcb501baf8c7014)
[Pythonでのウェブサイトへのログイン - Qiita](https://qiita.com/morinokami/items/46b76b365f030be83418)

## いろいろ取得
[PythonとBeautiful Soupでスクレイピング - Qiita](https://qiita.com/itkr/items/513318a9b5b92bd56185)
[Beautiful Soupを使ってスクレイピング - Qiita](https://qiita.com/rusarusa/items/d7f014ba80d6fe7a3e07)
[python3でwebスクレイピング(Beautiful Soup) - Qiita](https://qiita.com/matsu0228/items/edf7dbba9b0b0246ef8f)
[Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/)
[[Python] 何度も調べてしまうリスト操作をまとめてみた - YoheiM .NET](https://www.yoheim.net/blog.php?q=20150801)
PMがAdoebeXDの中級者をだっするための

Adobe　XD　チートシートを作成しましたので紹介し増します。

もとSE、PM向けチートシート
https://docs.google.com/spreadsheets/d/1xapKeexZ_oH2xIIjAS0PYYDmOZrS8Qt7jmNlJMXVteM/edit?usp=sharing


デザイナーではない人むけに絞っています。

・Ctrl +C　とかPとかVは問題なし
・Adobe製品はよくわからない
・アイコンは自分で作らずにビジュアルでいなー任せ

な方にぴったりとなっております。

ぜひ、参考にしていただければと
use-package でモード名を全消し or 短縮する

`use-package`の`:diminish`キーワードを使って、モード名を短縮する方法が見当たらなかったのでメモっときます。

# 全消し
これは[ここ](https://github.com/jwiegley/use-package#diminishing-and-delighting-minor-modes)とかに載っている通り、モード名の変数を書けばOK。

```el
(use-package counsel-gtags
  :diminish counsel-gtags-mode
    :
)
```

# 短縮

全消しじゃなくて短縮したい場合は、ドットペア(association list)で渡すといいようです。

```el
(use-package counsel-gtags
  :diminish '(counsel-gtags-mode . "Gtags")
    :
)
```

という具合に `(モード名 . 短縮名の文字列)`と書きます。

この例ではモード名の表示が`CounselGtags`から`Gtags`に短縮されます。[^1]

`use-package`のREADME.mdには`:delight`キーワードの例も載っていますが、今の MELPA stable にはまだないので、しばらくこの方法で行きたいと思います。


[^1]: `ivy`は短くていいのですが、`Counsel`って長いのでちょっとウザい感じです。いっそ、`ivy`に統一してほしいところ。
hetemlでphpバッチをcronで定期実行させる際の注意点

# 事前準備
##phpの1行目に下記を記述
usersXXXの場合
PHP5.6 の場合 「#!/usr/local/php/5.6/bin/php」
PHP7.0 の場合 「#!/usr/local/php/7.0/bin/php」
PHP7.1 の場合 「#!/usr/local/php/7.1/bin/php」

ftpXXXの場合
PHP5.3 の場合 「#!/usr/local/bin/php53」
PHP5.4 の場合 「#!/usr/local/bin/php54」
PHP5.6 の場合 「#!/usr/local/bin/php56」
PHP7.0 の場合 「#!/usr/local/bin/php70」
PHP7.1 の場合 「#!/usr/local/bin/php71」

シェルスクリプトの場合 「#!/bin/sh」

## 実行ファイルの改行コードはLFで保存

## ASCIIモードでFTPアップロード

## パーミッションを「700」に設定


# コントロールパネルで設定する際

phpであれば通常phpのパスを頭につけて実行ファイルを次に記述するが、
コントロールパネルから設定するのであれば実行ファイルのみでおｋ。

パスは/web/～でおｋ、それ以前のパスは自動で挿入される。
HomeBrew から nodebrew と Node.js をインストールする

セットアップ方法を忘れていたのでメモ。
Homebrew はインストール済みの前提で。

# 手順
1. Homebrewからnodebrewをbrewコマンドでインストールする

    ```
    $ brew install nodebrew
    ```
2. 次のコマンドを実行する

    ```
    $ /usr/local/opt/nodebrew/bin/nodebrew setup_dirs
    ```
3. `nodebrew setup`コマンドを実行する

    ```
    $ nodebrew setup
    ```

4. `.bashrc` ファイルにパスを記述する

    ```
    $ echo "export PATH=\$HOME/.nodebrew/current/bin:\$PATH" >> ~/.bashrc
    ```

5. 有効化する

    ```
    $ source ~/.bashrc
    ```
Rubyでテトリス風ゲーム

Rubyで作ったテトリス風のゲームです。

https://github.com/kenrota/falling-blocks-ruby

![fallingblocks.gif](https://qiita-image-store.s3.amazonaws.com/0/54161/7eac1af0-3009-b0b8-1684-5f147ad2fca3.gif)

キー操作

- ↑：　回転
- ↓：　下
- ←：　左
- →：　右
StanとRでベイズ統計モデリング(アヒル本)をPythonにしてみる - 10.1 パラメータの識別可能性

[実行環境](https://qiita.com/shngt/items/ce6f2c3ef348cd80f432)

### インポート

```python
import numpy as np
from scipy import stats
import pandas as pd
import statsmodels.api as sm
import pystan
import matplotlib.pyplot as plt
from matplotlib.figure import figaspect
%matplotlib inline
```

### データ読み込み

```python
category = pd.read_csv('./data/data-category.txt')
usagitokame = pd.read_csv('./data/data-usagitokame.txt')
```

# 10.1 パラメータの識別可能性
## 10.1.3 ラベルスイッチング

```python
np.random.seed(123)

N = 200
a = 0.3
d1 = np.random.normal(loc=0, scale=2, size=N)
d2 = np.random.normal(loc=-4, scale=1, size=N)
d3 = np.random.uniform(size=N) <= a
Y = d1*d3 + d2*(1-d3)
X = np.linspace(Y.min(), Y.max(), 100)

plt.figure(figsize=figaspect(3/4))
ax = plt.axes()
ax.hist(Y, facecolor='w', edgecolor='k', density=True)
ax.plot(X, a*stats.norm.pdf(X, loc=0, scale=2), c='k', linestyle='dashed')
ax.plot(X, (1-a)*stats.norm.pdf(X, loc=-4, scale=1), c='k', linestyle='dashed')
ax.plot(X, a*stats.norm.pdf(X, loc=0, scale=2) + (1-a)*stats.norm.pdf(X, loc=-4, scale=1), c='k', alpha=0.4, linestyle='solid', linewidth=3)
plt.setp(ax, xlabel='y', ylabel='density')
plt.show()
```
![fig10-1.png](https://qiita-image-store.s3.amazonaws.com/0/103085/c721942d-cd3e-e51a-41fd-f5916f6d9335.png)

## 10.1.4 多項ロジスティック回帰

```python
X = sm.add_constant(category.iloc[:, :-1])
X['Age'] /= 100
X['Income'] /= 1000
data = dict(
    N=category.index.size,
    D=X.columns.size,
    K=category['Y'].max(),
    X=X,
    Y=category['Y']
)
fit = pystan.stan('./stan/model10-2.stan', data=data, seed=1234)
```

## 10.1.5 ウサギとカメ

```python
np.random.seed(123)

G = 30
mu_pf = (0, 1.5)
pf = np.random.normal(loc=mu_pf, scale=1, size=(G, 2))
d = pd.DataFrame(np.argsort(pf, axis=1)+1, columns=('Loser', 'Winner'))
tbl = pd.crosstab([], d['Winner'])
tbl
```

```python
data = dict(
    N=usagitokame.columns.size,
    G=usagitokame.index.size,
    LW=usagitokame
)
fit = pystan.stan('./stan/model10-3.stan', data=data, seed=1234)
```
Link集

#python
- [python言語リファレンス](https://docs.python.jp/3.4/reference/index.html)

#機械学習
- [機械学習アルゴリズム](https://paiza.hatenablog.com/entry/2018/07/27/%E5%88%9D%E5%BF%83%E8%80%85%E3%81%A7%E3%82%82%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%82%92%E5%AD%A6)
Windows環境にフリーのC開発環境を構築した際のメモ

#やりたいこと

- Cの実験（サンプルプログラム作成）をしたいので、仕事場以外の自宅でC開発環境を構築する
- Visual Studioはちょっと重たいので、以外のフリーの開発環境を構築したい。

#環境

Windows7 Home 32bit
CPU:2.53G
Memory:4G

#GCCコンパイラをどうやってインストールするか
- MinGW-w64を使用してGCCをインストールします。
- なぜ、MinGW-w64を利用してGCCをインストールするかというとWindows開発用のAPIを含んでインストールしてくれるので便利な為

#MinGW-w64のインストーラをDLして実行する
- 32bitOSなので、MinGWでも事足りるが、使ったことが無いMinGW-w64を使用した。
- MinGWをインストールする
	- 以下の.サイトの右上に有る「Downloads」ボタンをクリック
		- http://mingw-w64.org/doku.php
![MinGW-64_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/235774/21a1c00b-166b-611d-f1bc-0abf390d01e3.png)
	- リンク先からMingW-W64-buildsのパッケージを選択する
![MinGW-64_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/235774/cae071c6-de74-d4e4-163c-10e4a37be869.png)
	- 2018/8/19時点の直リンクは以下である（URLが変わる可能性が有るので、参考までに）
		- http://mingw-w64.org/doku.php/download/mingw-builds
	- mingw-w64-install.exe がダウンロードされるので、実行。
	- 画面①　　　　　　　　　　　　　　
![MinGW-64_3.PNG](https://qiita-image-store.s3.amazonaws.com/0/235774/ba3ddbac-71f8-eeb4-90cd-02a6f47e0030.png)
		- [Next]ボタンをクリック
	- 画面②
![MinGW-64_4.PNG](https://qiita-image-store.s3.amazonaws.com/0/235774/2c9aa6b2-f6ad-b017-623f-fbbba752a062.png)

		- Version：インストールしたいGCCのバージョンを指定する。
		- Architecture：i686（32bit）を選択する。64bitOS環境の場合はx86_64を選択する。ちなみに、当環境は32bitOSの為、i686しかドロップダウンリストから選択できなかった。
		- Thread : スレッドの規格。 posix/win32 を選択する。今回は、posixを選択した。
			- posix：POSIXスレッド。Unix、Linux、Windowsをサポートしている。
			- win32：WIN32スレッドのみをサポートしている。
		- Exception:例外処理の方法。今回は、sjljを選択。
			- dwarf： 32bitバイナリのみサポート
			- sjlj：C++標準ライブラリを使用した例外処理
			- seh：Windows特化の構造化例外処理
				- ＜参考＞
				- http://d.hatena.ne.jp/a4lg/20110111/1294720293
				- https://gcc.gnu.org/wiki/WindowsGCCImprovements
		- Build revision：GCCビルドリビジョン番号。ドロップダウンリストから最新リビジョン番号を選択
	- 画面③
![MinGW-64_5.PNG](https://qiita-image-store.s3.amazonaws.com/0/235774/5bef2f2c-b270-10db-e07c-9f66a2698893.png)
		- [Next]ボタンをクリック
	- 画面④　インストーラ処理実行中
![MinGW-64_6.PNG](https://qiita-image-store.s3.amazonaws.com/0/235774/7bfa5094-d935-9025-17eb-c52329bf0cd1.png)
	- 画面⑤　ステータスバー満了
![MinGW-64_7.PNG](https://qiita-image-store.s3.amazonaws.com/0/235774/e2991a80-17c1-9602-e741-371efd0c9676.png)
		- [Next]ボタンをクリック
	- 画面⑥　完了画面
![MinGW-64_8.PNG](https://qiita-image-store.s3.amazonaws.com/0/235774/55644abc-1862-b811-594d-2756c8f7365a.png)

#MinGW-w64インストール後

- コマンドプロンプトで以下、試したが、予想通り、「gccなんて知らんわ」と怒られる。パスを通していないから、当たり前ですね。

```
gcc -v
'gcc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

- 気を取り直して、上記インストール時のディレクトリ下に有るバッチファイル「mingw-w64.bat」を実行

```
C:\Users\xxxxx>"C:\Program Files\mingw-w64\i686-8.1.0-posix-sjlj-rt_v6-rev0\mingw-w64.bat"
```

- では、改めて、gcc -v　を試してみる

```
C:\>gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=C:/Program\ Files/mingw-w64/i686-8.1.0-posix-sjlj-rt_v6-rev0/mingw32/bin/../libexec/gcc/i6
86-w64-mingw32/8.1.0/lto-wrapper.exe
Target: i686-w64-mingw32
（中略）
gcc version 8.1.0 (i686-posix-sjlj-rev0, Built by MinGW-W64 project)
```

- 無事にインストール出来ているようです。
gitの使い方

###gitのインストール
---
webからする
開いて
いろいろする

###git bashを使う
---
ユーザーとかの設定

git init
gitを作る

git add urls.py
追加する

git commit urls.py --message 1
コミットする

git reset url.py --hard id名
コミットに戻す

git log 
確認

rm -rf .git
git削除

git branch bra_1
ブランチ作成

git checkout bra_1
ブランチ移動で内容変更

git diff --stat
変更したファイルを表示

git add -u
変更ファイルのみadd

git commit . --message 2
コミットする
VSCodeでJavaの入力待ち（Scanner）を使う話

# はじめに

こいつをVSCodeで解いてみようと思ったのがことの発端。

- [A: はじめてのあっとこーだー（Welcome to AtCoder） - practice contest | AtCoder](https://practice.contest.atcoder.jp/tasks/practice_1)

> 問題文
高橋君はデータの加工が行いたいです。
整数 a,b,cと、文字列 s が与えられます。
整数 a+b+c と、文字列 s を並べて表示しなさい。

# VSCodeでJavaを実行（デバッグ）
VSCodeでJavaを実行（デバッグ）するためには`Debugger for Java`という拡張機能が必要。

- [Debugger for Java - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-debug)

なんだけど、まあその辺の話は面倒なので割愛。ググれば出てくるので如何様にも。

通常は`F5`でデバッグを開始してくれるが、そのときに必要なのが`launch.json`という設定ファイル。
デフォルトではこんな感じの設定になってるはず。

```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "java",
            "name": "Debug (Launch)",
            "request": "launch",
            "cwd": "${workspaceFolder}",
            "console": "internalConsole",
            "stopOnEntry": false,
            "mainClass": "",
            "args": ""
        }
    ]
}
```

が、この状態で実行するとVSCode下部の「デバッグコンソール」というところに出力される。
![スクリーンショット (9).png](https://qiita-image-store.s3.amazonaws.com/0/127332/44724022-31f2-0bac-7610-f03646a6f5a4.png)

これだと出力は確認できるが、前述のAtCoderの解答例のような`Scanner`での入力を受け付けることができない。

```java
import java.util.*;
public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		// 整数の入力
		int a = sc.nextInt();
		// スペース区切りの整数の入力
		int b = sc.nextInt();
		int c = sc.nextInt();
		// 文字列の入力
		String s = sc.next();
		// 出力
		System.out.println((a+b+c) + " " + s);
	}
}
```

# launch.jsonの書き換え

結論から言うと、必要なのは`launch.json`の`"console": "internalConsole"`の書き換え。
こいつを`"console": "integratedTerminal"`に書き換えた上で実行すると、出力先が「デバッグコンソール」から「ターミナル」に変わり、以下のように入力待ちとなる。
![スクリーンショット ().png](https://qiita-image-store.s3.amazonaws.com/0/127332/d28158b4-47fb-ad17-1a97-531f61d18519.png)
この状態でターミナルに任意の入力をすると、`Scanner`に読み込まれる。
![スクリーンショット ()2.png](https://qiita-image-store.s3.amazonaws.com/0/127332/940fc833-1ea9-687d-8ab0-9de83347ff98.png)

# まとめ
しかしこの問題、`main`関数の引数として入力が与えられるもんだと思ったけど違うのね。
ニホンゴムズカシネー
Linux—ファイル権限を確認する  ( stat -c %a ) ( stat -f %OLp )

GNU版とBSD版でかなり stat の使い勝手が違う様子。

## GNUの例

```
$ stat -c '%a' example.sh
755
```

## BSDの例

```
$ stat -f %OLp example.sh
755
```

[FreeBSD find the chmod numerical value for a file or directory - nixCraft](https://www.cyberciti.biz/faq/freebsd-get-the-chmod-numerical-value-for-a-file/)

## Macの場合

GNU の stat を入れてaliasを貼っておいても良い。

```
brew install gnu-stat
```

```
alias stat=gstat
```

## Ref

- [GNU Coreutils: stat invocation](https://www.gnu.org/software/coreutils/manual/html_node/stat-invocation.html)
- [FreeBSD Man — stat(1)](https://www.freebsd.org/cgi/man.cgi?query=stat&sektion=1&manpath=freebsd-release-ports)

## Links

- [Qiitaに記事を書く動機は「ググりにくい記事を、ググりやすく」するためでOK - Qiita](https://qiita.com/YumaInaura/items/e83df9a45836f7b2929b)
- [Gist](https://gist.github.com/YumaInaura/125e61e17c50cfe2d328d528901be442)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
QiitaのURLとREST

## /edit

Qiitaで編集用のURLはこんな感じ。
(記事投稿後に「編集する」を選んだ場合)

https://qiita.com/drafts/5a0bd4f6c51c39e4c3ac/edit

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/5630711e-fe31-2961-03a6-1c6221244fa1.png)


## /

ここから `/edit` を削ったら、元の記事に飛べると思うじゃろう

https://qiita.com/drafts/5a0bd4f6c51c39e4c3ac

ところが‥

こうじゃ


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f95733d7-aa20-648f-5e7c-433d9adc0e14.png)


**下書きの一覧 + 右側にリソースの記事が表示される**

というモードに飛ばされてしまった

よく見るとURL中に `draft` って付いているのが分かる。

## 記事本体のURLは？

改めてURLを確認する。リソース本体のURLは‥

https://qiita.com/YumaInaura/items/a4c3c5a4418207575108

- ユーザー名が付く
- `items/` という階層が含まれる


## 結論

推測で元記事のURLをたどるのは難しい。
(QiitaのURL構造を覚えていなければ)

## Github Gistの場合


綺麗にURLとリソースが対応している。

### /edit

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7ea6e5ae-60bd-e142-8cb4-ae1fa1946d93.png)

例: https://gist.github.com/YumaInaura/1a8e97850c3f7bfe1d8351bd98af4e04/edit


### /

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/23d5fe1a-9a31-180c-9679-5b9bf64db859.png)

例: 
https://gist.github.com/YumaInaura/1a8e97850c3f7bfe1d8351bd98af4e04

## Mediumの場合

### New Story

New story のURLはユーザーを問わずに一意。

https://medium.com/new-story

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7a63d8ae-ed03-49f5-f9f0-2ab17a1a046f.png)

### Edit

1文字でも書くとリソースのURLが動的に割り振られる
(編集中にURLが変わる)

https://medium.com/p/bdeb52f1a664/edit

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/dcf6437f-238d-845f-2981-db187701bc51.png)

### Show

リソース本体のURLにはユーザー名や、記事タイトルから抽出した文字列が付与される。

https://medium.com/@YumaInaura/rest-bdeb52f1a664

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0ff6de42-7260-4f9e-9014-1e6c20878239.png)


### Edit

新規投稿後に編集を続けると、editのURLが最初と変わっていないのが分かる。

https://medium.com/p/bdeb52f1a664/edit

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/1834d4bb-eb9c-81ea-6044-cfa0e7b6baca.png)



### Redirect

編集用URLから `/edit` を削ると、リソース本体のURLにリダイレクトされる。

https://medium.com/p/bdeb52f1a664
↓
https://medium.com/@YumaInaura/rest-bdeb52f1a664

#### 結論

とっても綺麗。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Javaのシフト演算は論理シフトや算術シフトとは別物？

情報系資格の教本を何気なく見ていて、ビットシフトの項目でふと気になった・・・Javaのビットシフト・・・なんか変じゃない・・・？

# Javaのシフト演算子
|演算子|意味|
|:-:|:-:|
|<<|符号無し左シフト|
|>>|符号付き右シフト|
|>>>|符号無し右シフト|

なぜ```>>>```の記号を左右反転した```<<<```が存在しないのか・・・
なぜ```<<```が符号無しシフトなのに、記号を左右反転した```>>```が符号付きシフトなのか・・・

# シフト演算の種類

### 論理シフト
・空いたビットは<font color="red">0</font>を入れる

||2進数|Javaの演算子|
|:--|--:|:-:|
|もとの値|1010 1010 1010 1010|-|
|←1論理シフト|0101 0101 0101 010<font color="red">0</font>|<<|
|→1論理シフト|<font color="red">0</font>101 0101 0101 0101|>>>|

### 算術シフト
・<font color="blue">最上位ビット（符号ビット）</font>は固定
・左シフトの場合、空いたビットは<font color="red">0</font>を入れる
・右シフトの場合、空いたビットは<font color="red">最上位ビットと同値</font>を入れる

||2進数|Javaの演算子|
|:--|--:|:-:|
|もとの値|<font color="blue">**1**</font>010 1010 1010 1010|-|
|←1算術シフト|<font color="blue">**1**</font>101 0101 0101 010<font color="red">0</font>|-|
|→1算術シフト|<font color="blue">**1**</font><font color="red">1</font> 010101 0101 0101|>>|

# 左算術シフトが無いのはそもそもプロセッサのせい？

[こんな記事](https://teratail.com/questions/115929)を見つけた

>これはJavaに限った話ではなく、より一般的に「2の補数表現を採用している（＝つまり殆どの）プロセッサー」の機械語の命令セットの仕様でも同様だと思います。（むしろそこに仕様の本質があると思います）
>
>引用元：[Javaのシフト演算子で、<<<がない理由](https://teratail.com/questions/115929)

どうやら（```<<<```に対応する？）左算術シフトが無いのは、プロセッサ自体が左算術シフトに対応していないかららしい。（詳しくは引用元で解説されています）
要は左算術シフトは余分な処理が必要になるということのようだ。
<font color="#ccc">（らしい とか ようだ とか曖昧なのは完璧には理解していないから）</font>

# 論理シフト、算術シフトで語るのが間違い？
これも先程の記事から引用

>シフトは「ビット列を負号無し整数値としてとらえた際に2のべき乗で乗算したり除算したりすることと同義」という特徴があります。「2の補数表現」の場合は上記を簡単に「負号あり整数」に拡張することができます。
>
>引用元：[Javaのシフト演算子で、<<<がない理由](https://teratail.com/questions/115929)

試しに計算してみる

||10進数|2進数|備考|
|:--|:-:|:-:|:--|
|value|-1431655766|1010 1010 1010 1010 1010 1010 1010 1010|valueはint型整数|
|value * 2|1431655764|010 1010 1010 1010 1010 1010 1010 10100|正しい解は-2863311532<br>int型の最小値は-2147483648<br>オーバーフローしている|
|value << 1|1431655764|010 1010 1010 1010 1010 1010 1010 10100|= value * 2|
|value / 2|-715827883|11010 1010 1010 1010 1010 1010 1010 101||
|value >> 1|-715827883|11010 1010 1010 1010 1010 1010 1010 101|= value / 2|
|value >>> 1|1431655765|01010101010101010101010101010101||

つまり、
```<< n```は * 2<sup>n</sup> 
```>> n```は / 2<sup>n</sup> 
と対応している。

「なぜ```<<```が符号無しシフトなのに、記号を左右反転した```>>```が符号付きシフトなのか・・・」という疑問は、論理シフトや算術シフトを基準に考えるのがそもそも間違っていたという事だった。
Linux環境でのAWS CLI（Command Line Interface）のインストール方法

#AWS CLI（Command Line Interface）とは？
AWSにアクセスするには、ブラウザ上で操作可能なマネジメントコンソールもありますが、コマンドラインツールである、AWS CLI（Command Line Interface、以下、AWS CLI）も提供されています。これにより、シェルスクリプトに組み込んだりすることで、手動ではなく自動でAWSを操作することも可能になります。

##AWS CLIのインストール方法
本記事では、Linux環境でのインストール方法について触れていきます。WindowsやMacでのインストール方法については、公式ページをご参照いただければと思います。

基本的には、Pythonのpip（ピップ）を利用してインストールすることが一般的のようです。
pipは、Pythonの公式ディストリビューションに含まれているパッケージ管理ツールです。
※以下からは、Python及びpipが正しくインストールされていることを前提で記載します

pipを利用して、AWS CLIコマンドをインストールします。

```shell

[shota@hostname ~]$ pip install awscli --upgrade --user
```
正常にインストールすることが出来たか確認します。

```shell

[shota@hostname ~]$ aws --version
aws-cli/1.15.81 Python/3.4.8 Linux/2.6.32-696.1.1.el6.x86_64 botocore/1.10.80
```
上記のような表示が出ればインストール成功です。
Qiita 記事／ユーザ／Organization／タグ のフィード URL（フォローしたいユーザーやタグの XML/ATOM の URL）

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

1. URL のお尻に `/feed.atom` もしくは `/activities.atom`を付ける
2. Qiita のフィードは `atom` フォーマット 
3. フィード例 
    - 特定ユーザの Qiita 記事フィード: http://qiita.com/KEINOS/feed.atom
    - 特定 Organization の Qiita 記事フィード: https://qiita.com/organizations/qiitadon/activities.atom
    - 人気の記事のフィード: https://qiita.com/popular-items/feed.atom <sup><sup>[情報元](https://qiita.com/KEINOS/items/f0a5bce2fa9cfec85f8b#comment-3f3dd23cc4a556bb2a42)</sup></sup>
    - 特定のタグの記事フィード: http://qiita.com/tags/Ruby/feed.atom <sup><sup>[情報元](https://qiita.com/KEINOS/items/f0a5bce2fa9cfec85f8b#comment-3f3dd23cc4a556bb2a42)</sup></sup>
    - 特定のタグの Qiita Zine 記事フィード: https://zine.qiita.com/feed/?tag=%E3%81%8A%E3%81%99%E3%81%99%E3%82%81 (タグ=おすすめ)

- 関連記事
    - [Qiitaの新着記事を見たい。なのでQiita APIを叩こう。](https://qiita.com/yyano/items/f8172f80cb93307af317) @ Qiita

## TS; DR

### タグ・フィードの URL

```
http://qiita.com/tags/<NAME_TAG>/feed.atom
```

- 気になるタグ・ページの URL に `feed.atom` を付けてみてください。
- 例）[「セキュリティ」タグのフィード](https://qiita.com/tags/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3/feed.atom)

### Qiita Organization の URL

```
 http://qiita.com/organizations/<NAME_ORGANIZATION>/activities.atom
```

- 気になる Organization の URL に `/activities.atom` を付けてみてください。
- 例） https://qiita.com/organizations/qiitadon/activities.atom

### Qiita ユーザーの URL

```
 http://qiita.com/<ID_USER>/feed.atom
```

- 気になるユーザーや、自分の「マイページ」の URL に `/feed.atom` を付けてみてください。
- 例） https://qiita.com/KEINOS/feed.atom

## 所感

Qiita 記事の特定タグ、特定 Qiita ユーザーの新着情報（XML フィード）が欲しかったのですが URL が思い出せませんでした。 

`ATOM` フォーマットの `XML` ファイルということだけ覚えていたので、思い込みで `RSS` を含めずにフィードで検索しては、「ピンポイントで出ないなぁ」と悩み、途中からデジャブを感じたので、恐らく同じミスを犯すであろう未来の自分に送る記事です。


## 参考文献

- 「[記事をrssリーダーで読む](https://qiita.com/tukiyo3/items/5b1051e63c7a32bfa48b)」 @ Qiita
- 「[Organizationの「最近の投稿」にRSSフィードを設置しました](https://blog.qiita.com/165064370664-2/)」 @ Qiita Blog
ネットワーク関係で学習した内容

秋の情報処理技術者試験も近づいてきたことだし、去年ネスペ受けたときのことを整理したいと常々思ってたので、自分がこれまでに買った参考書（試験目的でなかったものもたぶんに含まれますが）や手を動かしたことを挙げていきます。

# 自分が使った参考書など

(1) ネットワークスペシャリスト 本試験問題
https://www.amazon.co.jp/dp/4865751254/
解説付きの過去問見ながら勉強するのが効率的だと思うので、自分はこの手の本を買うことにしてる。

(2) マスタリングTCP/IP 入門編
https://www.amazon.co.jp/dp/4274068765/
ネットワークの基本を抑えるならまずこの辺から。

(3) マスタリングTCP/IP ルーティング編
https://www.amazon.co.jp/dp/4274066762/
ルーティングに関連する問題はちょいちょい出てる印象なので押さえておくと安心です。正直業務でOSPFやBGPを使ったことはほぼ無いのですが。

(4) インフラ/ネットワークエンジニアのためのネットワーク技術＆設計入門
https://www.amazon.co.jp/dp/B00IP549AE/
ロードバランサーやファイアウォール使った実践的な構成が図解されていて必見です。資格試験にも役に立つけどそれ以上に実務的。

(5) Amazon Web Servicesクラウドデザインパターン設計ガイド
https://www.amazon.co.jp/dp/B0126HZGP8/
↑の本と同じようにシステムのデザインパターンが諸々記載されています。AWSの本だけど、極力一般化して書こうとする著者の努力が素晴らしいです。

(6) ハイパフォーマンス ブラウザネットワーキング
https://www.amazon.co.jp/dp/4873116767/
大手SIerとかでルータやスイッチばかり触ってる人にとって、ネスペが意外と難しく感じられるのはHTTP、SMTP、DNSあたりの通信に対する知識が足りてなかったりするからかなと思います。上位のレイヤー勉強するのも大事です。

(7) 実践DNS　DNSSEC時代のDNSの設定と運用
https://www.amazon.co.jp/dp/B00IJNDKDE/
上述のとおりDNSわからないでネスペ受けるのはなかなかしんどいので購入しました。ただ、この本はDNSSECがメインの本なので若干選択を誤った気もしますし、DNSの学習ならbindとかでDNSの各種レコード登録して挙動確認するのが近道という気はします。

(8) マスタリングTCP/IP SNMP編
https://www.amazon.co.jp/dp/427406607X/
インフラ屋としてSNMP知らないとあかん、と思い購入しましたが試験勉強ではほぼ役に立たなかったと記憶してます。

(9) 詳解IPマルチキャスト
https://www.amazon.co.jp/dp/B06XZY37XF/
試験には正直全く役に立たなかったけど、自分の仕事にタイムリーだったので読みました。マルチキャスト使ったシステム・ネットワーク設計を経験している人とか、周りにはいない。

# 自分がこれから試験を受けるなら読んでおきたい本

a) Asterisk ―テレフォニーの未来
https://www.amazon.co.jp/dp/4873112893/
IP-PBX関連の本なら何でも良いので一冊読んでおきたい。
IP-PBX関連って意外と出題されているし、コールセンターとかの業務にかかわってたことがあるのでそのうち読もうと思っていたら試験1か月前とかになっていて買うのを断念しました。

b) プロフェッショナルSSL/TLS
https://www.amazon.co.jp/dp/4908686009/
ネット上の評判も良くてぜひ読みたかったけど、これもタイムアップで読めなかったです。そのうち買いたい一冊。

c) プロフェッショナルIPv6
https://www.lambdanote.com/products/ipv6
私が試験受けたときにはまだ発売していなかったです。というかネスペでIPv6の問題って出てたかな？でもこれから熱くなる分野のはずなので読んでおきたいですね。

d) クラウド時代のネットワーク技術 OpenFlow実践入門 
https://www.amazon.co.jp/dp/4774179833/
Software Defined Network の時代らしく、2017年の午後2で出題されたのが記憶に新しいです。僕が2017年に受けたときはOpenFlowとかは全然知らない状態でその問題を選択しましたが、これから受けるなら押さえておきたいですね。

# 手を動かすこと
手を動かすことは大事です。本だけ読んでても眠くなるばかりだし。自分が実際にやったことは以下です。
試験勉強ではなく実務も含まれてます。

* VPN設定を一通りする

　RTX1200を中古で1万円ちょいで購入して、外出先から自宅にVPNで接続できるようにするとかしました。VPN固有の設定項目とか、普段あまり意識しないこともあるので慣れておくとオススメです

* 冗長化設定を一通りする

　NICのチーミングしてケーブル抜いたり、クラスタ組んでプライマリサーバー落としてVIPのフェイルオーバーとかしながら、ifconfig や arp コマンド打ったりしていると色々見えてくることがあります。仕事で触れるならスイッチをスタック構成にするとか、VRRPを試すとかもできるとイメージがわくのでオススメです。

* TCPタイムアウトとパケットキャプチャを試す

　SYNの再送とかは比較的パケットキャプチャで確認しやすいので一度見てみると良いです。ファイル受信中に相手ノードでpanicを起こして、TCP keepaliveの重要性を確認したりするのも乙です。

# まとめ
ここまでだらだらと書いてしまいましたが、上記のことを一通りやろうとすると数か月～1年くらいは余裕でかかりそうなので、試験に受かることだけを考えるなら試験対策本（参考書と問題集）を買って勉強するのが効率的です。理解を深めたいときは、ご参考まで。
QiitaのUI—「編集を続ける」での編集内容を簡単に捨てたい

投稿済みの記事で「編集を続ける」を選ぶ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/44130c60-3127-2368-fdba-62fd587ae304.png)

編集する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0a31ddb3-d472-2ee1-ca52-c1b34db0b4ad.png)

編集内容を捨てたいが選択肢がない。
仕方なく「下書きに保存」を選ぶ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e84ddadb-6611-fda9-f34d-87b292b12e25.png)

元の記事に戻って、再び「編集を続ける」を選ぶと、さっきの編集内容が保存されている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/fb089667-9382-d869-b735-1fbc4671a538.png)

**‥どうやって元に戻すんだ！**

下書きの一覧にも出てこないので、削除も出来ない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f39c0465-7a8f-599f-453e-346664cc2294.png)

よく見ると「投稿済み」のタブがあり、こちらから削除できるようになっている。

Qiita歴3年の自分でも「どうやるんだっけ？」と悩んだぐらいなので、改善されると良いなあ。

## そうだったらいいのにな

- 「更新」「下書きに保存」の他に「編集内容を破棄する」が選べる
- 「編集を続ける」の横の歯車マークから「下書きを捨てて新規編集する」が選べる










<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Google Cloud Next 2018 Extended BigData & ML Day


タイトルの勉強会に行ってきました（2018/8/17）
そのメモ書きです。

#### gcpのノウハウがここに書いてある。
https://github.com/gcpug/nouhau

####dogrun来てねとのこと
https://gcpug-tokyo.connpass.com/event/95560/

####BigQueryについて

####BMQL
- 線形回帰とロジスティック回帰の結果を出力する、SQL構文が用意されている。

####GIS
- 地図関連のツール

####Clustered Tables
- カラムを指定して、カテゴリーごとにテーブルを分けることができる。

その他QA
重くてクエリが動かない時はどうしたらいいですか？
→ ティアーを増やせ

#### TPU
- version: 一般が使用できるものがV2に加え、V3が増えた。

#### Auto ML
Cloud ML Engine(tfのモデルをアップロードすると...）とは別サービスであり、現状では作成したモデルをダウンロードすることはできない。

（補足：Cloud ML Engine は、主に次の 2 つのことを行います。
クラウドで、TensorFlow トレーニング アプリケーションを実行して、大規模な機械学習モデルのトレーニングを可能にする。
これらのトレーニング済みモデルをクラウドにホストして、新しいデータに関する予測の取得に使用できるようにする。
https://cloud.google.com/ml-engine/docs/technical-overview）

- Vision
画像をストレージにアップロードして、設定ファイル作成のうえボタンを押すと、いい感じのダッシュボードやConfusion Matrixが作成される。結果を綺麗な形に整理するのは意外に面倒なので便利。(training $20/hour)

- Natural Language
現状では日本語を入力できないらしい。
(training $3/hour)

- Translation
(training $76/hour)

その他
- 学習用データを依頼できるサービスがあるらしい。
(補足：高品質なトレーニング データの生成
Google のヒューマン ラベリング サービスを使用して、画像ラベルにアノテーションを付けたり、整理したりすることで、モデルが高品質なデータでトレーニングされるようにすることができます。https://cloud.google.com/automl/)
Meryマクロで開いているファイルを削除する


- 現在開いているファイルを削除するマクロです
    - 開いているドキュメントがファイルでない場合は警告を表示して終了します
    - 削除したウィンドウを閉じます

```DeleteFile.js
#title="開いているファイルを削除する"

var fso = new ActiveXObject('Scripting.FileSystemObject');

var fullPath = Document.FullName;
if(fullPath == "") {
    alert("ファイルを開いていません")
    Quit();
}

var file = fso.GetFile(fullPath);
alert(file + "を削除しました");
fso.DeleteFile(file);;
Editor.ActiveDocument.close();

```
GCPチュートリアル試行「Stackdriver Logging でログエントリの読み取りと書き込み」

# お題
表題のチュートリアルを試しにやってみる。

【参照】
https://cloud.google.com/logging/docs/quickstart-sdk

# 前提
- GCP環境は保持済み。
- ```gcloud```コマンドインストール済み。

# 試行
## 非構造化ログの書き込み
```
$ gcloud logging write test-log "This is a test log."
Created log entry.
```

Cloud Consoleで見ると、こんな感じ。
**※ポイントは、選択リソースプルダウンで「グローバル」を選択すること！（最初、表示されなくて焦った・・・）**
![sdl01.png](https://qiita-image-store.s3.amazonaws.com/0/180599/907088e7-8120-d8d6-ecff-08a896b8fd4b.png)

## 構造化ログの書き込み
```
$ gcloud logging write --payload-type=json test-log2 '{"id":1,"name":"Taro","age":20}'
Created log entry.
```

Cloud Consoleで見ると、こんな感じ。
![sdl02.png](https://qiita-image-store.s3.amazonaws.com/0/180599/ea5ac5bb-7ddf-6ccf-feed-53f02787538a.png)

## 書き込んだログを```gcloud```コマンドで確認
```
$ gcloud logging read "resource.type=global"
---
insertId: 1hafp3pg1ugpjd1
jsonPayload:
  age: 20
  id: 1
  name: Taro
logName: projects/XXXXXXXX/logs/test-log2
receiveTimestamp: '2018-08-19T09:11:15.179659141Z'
resource:
  labels:
    project_id: XXXXXXXX
  type: global
timestamp: '2018-08-19T09:11:15.179659141Z'
---
insertId: 10cm45xg1y8lsg7
logName: projects/XXXXXXXX/logs/test-log
receiveTimestamp: '2018-08-19T08:33:20.389734330Z'
resource:
  labels:
    project_id: XXXXXXXX
  type: global
textPayload: This is a test log.
timestamp: '2018-08-19T08:33:20.389734330Z'
```

## ログの保持期間

見ると、ありとあらゆるログが```Stackdriver Logging```に記録されている様子。
これらのログは全ていつまでも記録され続けるんだろうか？

当然そんなことはなかった。
https://cloud.google.com/logging/quotas#logs_retention_periods

- 管理アクティビティ監査ログ：400日
- データアクセス監査ログ：30日
- アクセスの透明性ログ：30日
- 監査ログまたはアクセスの透明性ログ以外のログ：30日

正直なところ、上記それぞれのログの違いは調べていないけど、おそらく今日吐いたログは、30日経過すると消えてしまう（可能性がある）ということかな。
となると、必要なログは消える前にどこかに退避する必要がある。
退避先はGCSかな。↓のドキュメントもあったので、今度、このへんも調べてみよう。
https://cloud.google.com/logging/docs/export/
AccessVBAでAccessのリンクテーブルのリンク元ファイルの更新時間を確認する

## Accessでリンクテーブルのリンク元ファイルの更新時間を確認するマクロ
Accessでリンクテーブルを使用し、かつそのリンク元ファイルを他の人が定期的に更新して運用するような場合、リンク元ファイルを見に行かないと、元ファイルが更新し終わったのかどうかは分からないと思います（そうですよね…？）~~そもそも、更新日を見て判断するという手順がおかしい~~

ですが、「リンク元ファイルはどこにあるんだっけ？:thinking:」などと毎回やるのも嫌なので、
1. リンクテーブルのリンク先パス、
2. 更新日、
3. 更新日が1月以内かどうかのCheck
について、出力してくれるマクロを作成しました:relaxed:

同様の作業を行っている人が結構いるのではないかと思っているのですが、その割にネットにコードが転がっていなかったのでアップしてみました:sunny:（と言ってもほぼ参考サイトのコードを組み合わせただけですけどね:wink:）

参考サイト：
[リンク先のデータベースファイル名を取得するには？](http://tsware.jp/tips/tips_363.htm)
[VBA ファイルの作成日時や更新日時を取得または変更する](https://www.tipsfound.com/vba/18013)
[Access VBA:リンクテーブルのリンク元をVBAで変更する方法（リンクテーブルをループで処理する箇所）](https://selifelog.com/blog-entry-104.html)

```vb:
Option Compare Database
Option Explicit

Sub GetLinkTableDates()
    Dim fso As Object 'FileSystemObject
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim f As Object 'File
    Dim db As DAO.Database, td As DAO.TableDef, filePath As String, msg As String
    Set db = CurrentDb
    For Each td In db.TableDefs
        If td.Connect <> "" Then 'リンクテーブルだけを処理
            filePath = Mid$(td.Connect, InStr(td.Connect, ";DATABASE=") + Len(";DATABASE="))
            msg = msg & "テーブル名：" & td.Name & vbNewLine
            msg = msg & filePath & vbNewLine
            Set f = fso.GetFile(filePath) 
            'msg = msg & "DateCreated:" & formatDate(f.DateCreated) & vbNewLine
            msg = msg & "DateLastModified:" & formatDate(f.DateLastModified) & vbNewLine & vbNewLine
            'msg = msg & "DateLastAccessed:" & formatDate(f.DateLastAccessed) & vbNewLine & vbNewLine
        End If
    Next
    MsgBox msg
    Set fso = Nothing
End Sub

Private Function formatDate(target_date As Date)
    Dim strCheck As String
    If DateAdd("m", 1, Date) < target_date Then
        strCheck = ""
    Else
        strCheck = "Check!! (1月以上前)"
    End If
    formatDate = Chr(9) & target_date & Chr(9) & strCheck
End Function

```
ls -1(数字の1)とは

### 前書き
今回は、ちょっとしたコマンドの引数を紹介します。

### **ls -1**
`l`(小文字のエル)では無く`1`(数字のイチ)です。
manコマンドにも記載されていない引数なので、意外と知らない方も多いのではないでしょうか。

### lsコマンドとは
lsコマンドはディレクトリ内のファイル・ディレクトリの一覧を表示するコマンドです。引数を指定せずに実行すると以下のように表示されます。

```
[root@test01 log]# ls
anaconda  cron-20180819  maillog-20180819   secure-20180819   wtmp
audit     dmesg          messages           spooler           yum.log
boot.log  dmesg.old      messages-20180819  spooler-20180819
btmp      firewalld      ppp                tallylog
chrony    lastlog        rhsm               tuned
cron      maillog        secure             vmware-vmsvc.log
[root@test01 log]#
```
引数無しだと可読性に難があるため、表示を縦にするために`-l`(小文字のエル)という引数をよく使います[^1]。

[^1]: よく使う`ll`コマンドは`ls -l` のエイリアスコマンドです。

```
[root@test01 log]# ls -l
合計 1108
drwxr-xr-x. 2 root   root     4096  8月 17 23:22 anaconda
drwx------. 2 root   root     4096  8月 17 23:24 audit
-rw-r--r--. 1 root   root     8576  8月 18 01:24 boot.log
-rw-------. 1 root   utmp        0  8月 17 23:18 btmp
drwxr-xr-x. 2 chrony chrony   4096 11月 15  2016 chrony
-rw-------. 1 root   root     3192  8月 19 17:01 cron
-rw-------. 1 root   root     9248  8月 19 03:25 cron-20180819
-rw-r--r--. 1 root   root   116035  8月 18 01:24 dmesg
-rw-r--r--. 1 root   root   116117  8月 17 23:46 dmesg.old
-rw-r--r--. 1 root   root      113  8月 17 23:46 firewalld
-rw-r--r--. 1 root   root   291708  8月 18 01:24 lastlog
-rw-------. 1 root   root        0  8月 19 03:25 maillog
～以下省略～
[root@test01 log]#
```


ただし、`-l`だとアクセス権などの付加情報も表示されてしまうため、単に縦に並べたい時やシェル内で加工する時に不便だったりします。その場合に最適なのが`-1`(数字のイチ)という引数です。

```
[root@test01 log]# ls -1
anaconda
audit
boot.log
btmp
chrony
cron
cron-20180819
dmesg
dmesg.old
firewalld
lastlog
maillog
～以下省略～
[root@test01 log]#
```

同じことを`ls -1`を使用せずに実行しようとすると、以下のようにちょっと面倒になります[^2]。

[^2]: `ls -l`の出力に`awk`や`cut`を使用することでも実現できます。

```
[root@test01 log]# for i in `ls`;do echo $i;done
anaconda
audit
boot.log
btmp
chrony
cron
cron-20180819
dmesg
dmesg.old
firewalld
lastlog
maillog
～以下省略～
[root@test01 log]#
```

ファイルやディレクトリの一覧を、一旦ファイルに落とし込む時などに便利ですので、ぜひ活用してみてください。

### 追記
パイプやリダイレクトを使えば`ls`のみで1ファイル1行となるとのご指摘を頂きました。ありがとうございます。

```
[root@test01 log]# ls |cat
anaconda
audit
boot.log
btmp
chrony
cron
cron-20180819
dmesg
dmesg.old
firewalld
lastlog
maillog
～以下省略～
[root@test01 log]#
```


以上
terraform import したものを取り消したい

`terraform import` したものを取り消したい場合

```bash
# 既存のresourceをインポート
$ terraform import aws_iam_user.foo foo
# やっぱり取り消したい
$ terraform state rm aws_iam_user.foo
```

`terraform state rm` は、stateファイルから削除するだけなので、
実際のresourceには影響なし。

## References

- [terraform state rm](https://www.terraform.io/docs/commands/state/rm.html)
【アドカレ 2018】Closing Creditsでスタッフロールを作る

# アドカレ 2018
これは「Unity アセット真夏のアドベントカレンダー 2018 Summer! 」
8月21日(火)の記事になります

## スタッフロールを簡単に作られるAssetを紹介したいと思います
[Closing Credits](https://assetstore.unity.com/packages/tools/gui/closing-credits-14169)
![title.jpg](https://qiita-image-store.s3.amazonaws.com/0/269852/d97ad284-6437-817e-0a5f-06ce3da84359.jpeg)

### 前提
このAssetのReviewsにはunity2017、2018バージョンでは動けない報告がありますが
- 2017.4
- 2018.2.2
この２つバージョンでテストしたところ、問題なく動いています

ただし、
このAssetは2015にバージョンアップ以来、もう更新してないため、ご注意を下さい


## 1、Package導入
<img width="213" alt="スクリーンショット 2018-08-19 16.51.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/269852/46922f1e-2edc-8ac3-7dde-c85dbbf584a3.png">


## 2、Credits Editor
Window/Credits Editor
<img width="358" alt="スクリーンショット 2018-08-19 17.20.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/269852/4f20bb25-80b8-22e0-cf4a-b3394fd70cbe.png">

![new.png](https://qiita-image-store.s3.amazonaws.com/0/269852/2fa42436-d58b-5164-8639-186ee73cefb9.png) ：新しいデータを作る

![open.png](https://qiita-image-store.s3.amazonaws.com/0/269852/c9a2b2ab-3ded-d1af-fe81-427fe22d82f7.png) ：既有のデータを開き

![save.png](https://qiita-image-store.s3.amazonaws.com/0/269852/3cce6e63-6cc6-54b7-78e1-e9f7ae2fe4fb.png) ：Save

### staff情報を編集する
Credits Editorの使い方法はとてもシンプルです

##### 機能は以下５つです

1.title: タイトル
2.single column: 名前入力欄
3.two columns: タイトル付き名前入力欄
4.image: リソースに入れてる画像の名前
5.empty space: スペース

##### 編集もボタンだけで簡単にできます
![add.png](https://qiita-image-store.s3.amazonaws.com/0/269852/8a00c472-dffe-d633-46ce-024149840758.png) : 項目追加
![delete.png](https://qiita-image-store.s3.amazonaws.com/0/269852/ee88dba8-7076-f5b9-c185-a7ddbb9f8bd4.png) : 項目を削除
![down.png](https://qiita-image-store.s3.amazonaws.com/0/269852/16f99400-574b-17aa-e073-d64331c0bf64.png) : 項目を下へ移動
![up.png](https://qiita-image-store.s3.amazonaws.com/0/269852/1c71ddab-404e-d9b8-6a60-a1e33987663a.png) : 項目を上へ移動

##### サンプルデータをいくつカットしました
結構簡単な使い方のため、ここはサンプルデータの重複の部分を削除し、以下のように実行しようと
<img width="548" alt="スクリーンショット 2018-08-19 17.53.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/269852/bb01b3fa-1468-a046-01e8-62e152771233.png">


### 実行
![1.gif](https://qiita-image-store.s3.amazonaws.com/0/269852/8ce1201b-cb0c-d8d8-f874-0e4e152564b2.gif)

## 終わり
大人数でゲームのスタッフロールを作る時、
自由に編集できるEditorは結構助かりますね

このAssetもう更新しないのはとても残念ですが、
幸いcoedはシンプルのため、修正は難しくないと考えます

codeは触りたくない場合、
値段は$10ですが、3D Sauceの[Credits Pro!](https://assetstore.unity.com/packages/tools/gui/credits-pro-30059)もおすすめです
[Ruby][初心者] Procオブジェクト

### Procオブジェクトとは？

### 例

Procオブジェクトをつくります

```ruby:
proc = Proc.new { puts 'hoge' }
```

クラスを確認すると、Procオブジェクトであることがわかる

```ruby:
proc.class
=> Proc

```

Procオブジェクトを作った時にブロックで渡した処理をcallで実行することができる

```ruby:
proc.call

hoge # hogeが出力される
```

Procではブロックの外側にある変数を参照することができる

```ruby:
hoge = :hoge
proc = Proc.new { puts hoge }

proc.call
hoge # hogeが出力される

hoge = :fuga

proc.call
fuga　# 次はfugaが出力される

```
##### 注意
Procオブジェクトが作成される前に変数が定義されている必要がある
【C#】「カプセル化」をもう一度学ぶ

## 「カプセル化」とは
- 「利用者に関係のないものは見せない」という、オブジェクト指向言語の概念の一つ
    - この概念により、下記のような安全性と利便性を確保できる
        - 利用者に使ってほしい機能を安全に公開できる
        - その機能を実現するための内部的で、直接利用者には利用してほしくない機能を隠蔽できる

## 「カプセル化」の例
ここでは、C#を用いてカプセル化の例を紹介する。

### 悪いカプセル化の例

```C#
class Person
{
    public string firstName;  // 名
    public string lastName;   // 姓
    public int    age;        // 年齢
    public double height;     // 身長
    public double weight;     // 体重

    public string GetFullName()
    {
        return this.firstName + this.lastName;
    }
}
```

上記のPersonクラスでは、以下に挙げる三点の理由から、カプセル化の利点を享受することができない。

- フィールドの読み書きを、詳細に制御することができない
    - 「フィールドの読込は認めたいが、書換は制限したい」という場面が、開発をしている最中に出てくるが、フィールドのアクセスレベルはアクセス修飾子でしか定義できないため、上記のような読込と書込で、アクセスレベルを分けることができない(`readonly`修飾子を用いることもできるが、クラス内部でも書換不可となるため、利便性が落ちる)


- 値の妥当性を検査できない
    - `age`フィールドには年齢が入るので自然数が入るべきだが、自然数の型は存在しないので、負の整数を代入を制限することができず、不正データを生みやすくなってしまう


- 内部変更に弱い
    - フィールドの値の持ち方、つまり型が変更された場合に改修箇所が増える
    - 例えば、`height`/`weight`フィールドが`double`型ら`int`型に変更された場合、両フィールドを利用している全てのコードに影響が及ぶ


### 良いカプセル化の例

```C#
class Person
{
    private string _firstName { get; set; }  // 名
    private string _lastName  { get; set; }  // 姓
    private int    _age;                     // 年齢
    private double _height    { get; set; }  // 身長
    private double _weight    { get; set; }  // 体重

    public int Age
    {
        set
        {
            if (value < 0)
            {
                throw new ArgumentException("自然数を指定してください");
            }
            this._age = value; 
        }

        get { return this._age; }
    }

    public string GetFullName()
    {
        return this.FirstName + this.LastName;
    }
}
```

C#が用意している、フィールドを取得する仕組みである「プロパティ」を用いることで、クラス内ではメソッドのように表記できるが、クラス外からはフィールドのようにアクセスすることができる。

また、フィールドのアクセスレベルを`private`にすることで、利用者側の不用意なアクセスを禁止している。

さらに、先述の悪い例で挙げた問題点を解決することができる。

- 読み書きを制御することができる
    - `get`/`set`キーワードには、個別にアクセス修飾子を付与できるので、詳細なアクセス制御が容易に実現できる
    - 但し、プロパティ自体のアクセスレベルを超えて設定はできない

- 値の妥当性を検査できる
    - `age`フィールドに負の整数が入らないよう、代入前に検査を実装することができる


## まとめ

このように、カプセル化においては、

- 機能の制限
- 外部で参照する際のインターフェイス

以上の二点を適切に設けることで、利用者が複雑な内部処理を意識することなく機能を使えるだけでなく、不用意に内部機能にアクセスすることを防ぐことができる。
Slack入門（お家編）

会社でSlackという言葉すら出てこない…。でも、周りのエンジニアたちは「Slack!!Slack!!」って、もうね宗教並みに皆んな言ってて皆んな使ってるんですね。
私も使いたい！！ってことで、おうちで使うことにしました。

#### 使い方はこちらを参考にさせていただきました。
#### [ママはゆるキャリ](https://www.yururito.net/entry/slack_for_family_use)

チャットはもちろんですが、リマインダ、Googleカレンダー連携、Trello連携とか、痒いところに手が届く感じで好印象。


## 準備
- まずは登録
[Slack](https://slack.com/intl/ja-jp/pricing/free)
- [Slackを始める]をクリック
- ワークスペースを新規作成
- あとは画面に従ってい進むだけで登録完了

## 招待
妻を招待してみる。
- [メンバーを招待する]をクリック
- メールアドレスを入力して、[招待を送信]する
簡単。


こっからが本番！！

## チャンネル作成
[チャンネルとは](https://get.slack.help/hc/ja/articles/201402297-%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
要はチャットスペース。
- チャンネルの横の+アイコンで作成が可能。
- パブリックとプライベートの２種類が作成できて、任意の名前をつけることが可能。とりあえず以下のチャンネルを作成
  - パブリック：予定(おでかけ)決め、相談事、ブログ記事共有 とか
  - プライベート：ふと思いついたToDo、ちょっとした備忘録 とか

## リマインダー
ワークスペース内のどこからでも仕込むことができて、「/remind [@メンバー/#チャンネル] [何を (日本語OK)] [任意: いつ (英語)]」で登録できるらしい。
Googleカレンダーのリマインダで事足りているので、こちらは未使用。
気が向いたら使ってみます。

## Googleカレンダー連携
[Google カレンダーと Slack を連携させる
](https://get.slack.help/hc/ja/articles/206329808-Slack-%E3%81%A8-Google-%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%82%8B)
- 夫婦共用アカウントのGoogleカレンダーを連携させた。
- これでお互いの登録・更新に気づくことができるし、リマインダにもなる。
- ちなみにゲスト招待されて、承認してないものも出てきます。
- すごい便利。

## あとやりたい事
- Trello連携
  - Trelloは昔使ってたんですが、今は大切に大切に温めている(使ってないだけ)なので、家庭内ToDoで復活させようかと。
- zaim連携
  - 我が家の家計簿はzaimで全て管理してるので、入出金がわかると嬉しい。
ExcelVBAでズンドコキヨシ

煎じまくられたネタではありますが、投稿テストも兼ねてズンドコキヨシをしてみました。

```vb

Sub Zundoko()

Dim Kiyoshiarr(1) As String
Dim ZunDokostr As String
Dim Zuncnt As Integer
Dim i As Integer
Dim k As Integer

Kiyoshiarr(0) = "ズン"
Kiyoshiarr(1) = "ドコ"
i = 1

Do
    k = Int(2 * Rnd)
    ZunDokostr = ZunDokostr + Kiyoshiarr(k)
   
    If Kiyoshiarr(k) = "ズン" And Zuncnt < 4 Then
        Zuncnt = Zuncnt + 1
    ElseIf Kiyoshiarr(k) = "ドコ" And Zuncnt = 4 Then
        ThisWorkbook.Worksheets(1).Cells(i, 1).Value = ZunDokostr & "キ・ヨ・シ！"
        Exit Do '整ったので終わり！
    Else
        ThisWorkbook.Worksheets(1).Cells(i, 1).Value = ZunDokostr
        ZunDokostr = ""
        i = i + 1
        Zuncnt = 0
    End If
Loop

End Sub
```

VBAズンドコキヨシ記事、すでにたくさんあるんですけどいくつかみると１セル１ワードのものが多く、「やっぱりズンドコキヨシは１フレーズで収まらないと」と思って失敗/成功が確定するまでは書き出してないです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/219407/2d77e511-75c3-0503-a6b9-23eb55a39cd3.png)

作って見てから他の人のを見るともっと短いやり方とかあって、VBAでも奥が深いなあと思った次第。
Access 2003からMariaDBに移行

内製のAccess 2003アプリを、DB部分はMariaDBに移行している。
フロントは.Net(C#)

ツールを使って工数を削減できないかと模索したが、以下のような正攻法で攻めるしかないと言う結論に達した。


1. Access側のテーブルにて、極力Not Null制約を適用する... 後述のデータ移行クエリ実行の際、NullがあるとINSERT SELECT 文がこけるため、Nullの場合とそうで無い場合で別クエリを実行する必要が出てくるため。  
   文字列型は、NULL=空文字と考えて問題ない場合がほとんどと想定されるので、以下の手順を機械的に実行する。  
   文字列でない場合はNULLを置き換えるべき値が自明でない場合も多いので、一旦NULL値固定で移行し、列ごとに個別で移行(`UPDATE DEST.COL=SRC.COL WHERE SRC.COL IS NOT NULL`)  
   1. 対象列の空文字を許可する。
   2. 該当列を更新する部分にてNULLの場合は空文字に置き換える処理を追加　　
      * 画面のフォームがデータと連結していてSQLではなくDoCmdで処理している場合、後付でSQLを組み込むと競合エラーが面倒なので、単純にフォームの値をNz関数でNullを置換してやれば良い
      * ウィザードに従って作成した画面などで、データ更新処理を明示的に記載されていない場合は、フォームの追加・更新前処理イベントにてNz関数を適用する
   3. UPDATE文で該当列のNULLを空文字に置換
   4. 該当列にNOT NULL制約を適用。
2. MariaDB側に、同一レイアウトのテーブルを新規作成。参照制約も実装。
3. MariaDBのODBCドライバをインストールし、対象のMariaDBをODBC登録。
4. AccessのリンクテーブルとしてMariaDBのテーブルを登録
5. AccessのテーブルからMariaDBのテーブルにデータを流し込む(INSERT SELECT)クエリを作成、初回の移行を行う。  
   参照整合性制約から、移行可能な順番がはっきりする。
6. MariaDBのデータに対してアクセスするフロントプログラムを作成する。
   - 移行後のテーブルレイアウトそのものでプログラムの動作検証が可能。
7. フロントプログラムの作成が完了したら、MariaDBの全データをTruncateしてデータの本番移行を行う。
   - データ移行の逆順で実行しても参照整合性制約からデータを削除できない場合がある。素直に参照整合性制約を一時削除し、データの削除完了後に再度作成する。

テーブル名や列名にスペースやマルチバイト文字が入ってて命名規則を満たしていない、明らかに数量データなのに文字列型になっている...といった問題はこれ以降にじっくりリファクタリングしていく。上記の手順とリファクタリングを同時に行うのはリスクが大きい。
Docker ＆ Docker Composeのインストール(CentOS7.4)

Linux環境(CentOS7)にDocker、Docker Composeのインストール方法について、以下にまとめます。
## 前提  
- Centos7.4を使用  

## Dockerのインストール
1.ソフトウェアパッケージをインストール

```
yum install -y yum-utils device-mapper-persistent-data lvm2
```

2.Docker CEのyumリポジトリの追加  

```
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```
3.Docker CEのインストール

```
yum -y install docker-ce
```
4.バージョン確認

```
docker --version
```
バージョンが表示されると、無事インストール完了。


## Docker Composeのインストール
1.Docker Composeのダウンロード

```
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
```
※バージョンに応じてバージョン番号は変更すること。 
※最新バージョンなどバージョンの確認は[github](https://github.com/docker/compose/releases)を参照。

2.バイナリの実行権限を適用する  

```
chmod +x /usr/local/bin/docker-compose
```

3.バージョン確認

```
docker-compose --version
```
バージョンが表示されると、無事インストール完了。

## 補足

- Docker Composeにおける各種ファイル変更時の反映について別記事を作成していますので、よかったら参考にしてみてください。  
→　[Docker Composeにおける各種ファイルの変更時の反映](https://qiita.com/subretu/items/5857628534b53f29f5a3)

## あとがき
初めてqiitaに記事を書いてみました。
まだまだ未熟な文章、記事ですが、皆さんにとって有益になる記事を提供できるように精進していきます:bow:
Node.js向けORM Objection.jsを使ってみた(4) - トランザクション

## 概要

トランザクションの利用方法は2種類あります。

* クエリを実行する際に、明示的にTransactionオブジェクトを受け渡す
* ModelをTransactionオブジェクトに束縛する

## 明示的にTransactionオブジェクトを受け渡す

```javascript
const { transaction } = require('objection');

await transaction(Project.knex(), async trx => {
  const project = await Project
    .query(trx)
    .insert({ name: 'hoge' });

  await project
    .$relatedQuery('members', trx) 
    .insert({ name: 'hogepiyo', email: 'hogepiyo@example.com' });
});
```

transaction関数を実行することで、トランザクションを開始します。

第１引数にはknexインスタンス、第2引数にはコールバック関数を渡します。

knexインスタンスは、任意のModelのknexメソッド等で取得できます。

第２引数のコールバック関数は、引数としてTransactionオブジェクトを受け取ります。

このTransactionオブジェクトを、`query`, `$query`, または`$relatedQuery`メソッドの最後の引数として渡すことで、クエリがトランザクション内で実行されます。

コールバック関数が返却したPromiseがresolveされると、トランザクションはコミットされます。

コールバック関数で返却されたPromiseがrejectされた場合、またはコールバック内で例外が発生した場合は、トランザクションはロールバックされます。

## ModelをTransactionオブジェクトに束縛する

```javascript
const { transaction } = require('objection');

await transaction(Project, Task, async (Project, Task) => {
  // 引数のProject, Taskを介して発行されるクエリは、自動的にトランザクション内で実行される
  const project = await Project
    .query()
    .insert({ name: 'hoge' });

  const task = await Task
    .query()
    .insert({ name: 'sample', projectId: project.id });

  // Transactionが束縛されたModelのインスタンスを使用してクエリを発行する際も、
  // 同一トランザクション内で実行される
  const users = await project
    .$relatedQuery('members') 
    .insert({ name: 'hogepiyo', email: 'hogepiyo@example.com' });

  // 引数のProject, Task以外のModelからクエリを発行すると、そのクエリはトランザクション内で処理されないので注意 
  // User
  //   .query()
  //   .insert({ name: 'fuga', email: 'fuga@example.com' });
});
```

transaction関数に、トランザクションを束縛したいModelを渡します。

最後の引数のコールバック関数には、Modelのコピーが渡されます。

Modelのコピーを介してクエリーを発行すると、各クエリが同一トランザクション内で実行されます。

Modelのコピー以外からクエリーを発行すると、同一トランザクション内では実行されないので注意が必要です。

## 参考元

https://vincit.github.io/objection.js/#transactions
java.lang.Voidをインスタンス化するという遊び

# 趣旨

この記事は`java.lang.Void`のオブジェクトを生成して、
そのオブジェクトのメソッドを呼ぶまでのことをやってみた記事です。

しかし、`java.lang.Void`のオブジェクトを生成できてもおそらくなんのメリットも無いと思われますので、ただの遊びです。

# コード

解説もコメントに書きました。

```java
import java.lang.reflect.Constructor;

public class CreateVoid {
    public static void main(String... args) throws Exception {
        //クラス名を文字列で指定してClassを取得する方法です
        Class<Void> voidClazz1 = (Class<Void>)Class.forName("java.lang.Void");
        Void o1 = getVoid(voidClazz1);

        //実際のメソッドからClassを取得する方法です
        Class<Void> voidClazz2 = (Class<Void>)CreateVoid.class.getMethod("voidMethod", new Class[]{}).getReturnType();
        Void o2 = getVoid(voidClazz2);

        System.out.println(o1);//java.lang.Void@1c6b6478
        //equalsメソッドをOverrideしていないので、別インスタンスであれば必ずfalseになる
        System.out.println(o1.equals(o2));//false
        System.out.println(o1.hashCode());//476800120
        System.out.println(o1.toString());//java.lang.Void@1c6b6478
        System.out.println(o1.getClass());//class java.lang.Void
    }

    //voidだとプリミティブ型となるので、Void(=java.lang.Void)です。
    public Void voidMethod(){return null;};

    //Class<Void>からVoidオブジェクトを生成します
    private static Void getVoid(Class<Void> voidClazz) throws Exception {
        //JDKのソースを覗くと`private Void() {}`とコンストラクターがprivateになっているので以下のようにする必要があります
        //1. getConstructorではなくgetDeclaredConstructorと書く
        //2. accessibleフラグをtrue
        Constructor<?> declaredConstructor = voidClazz.getDeclaredConstructor(new Class[]{});
        declaredConstructor.setAccessible(true);
        return (Void)declaredConstructor.newInstance(new Object[]{});
    }
}
```
データの取り扱い方メモ

配列の中に個人認識と数字が入った入力値を受け取った時。
`[Federer 6 1 8 5]`
フェデラーのグランドスラム優勝回数を取り扱うとして
データを分離かさせてみた。
`GS_d = gets.split(" ")`
👆player = GS_d[0] 選手名だけ抜く
`win = GS_d[1..4].map(&:to_i)`
👆優勝回数だけ
`all_win =　win.inject(:+) `
👆優勝合計
みたいに細かく書いていった。
これでCクラスはだいたい解けるかも
備忘録: Python 関数 zip() の引数にイテレータを使うと位置によって挙動が変わる (あたりまえの) 話

ひとつのイテレータを複数の箇所で使いまわそうとしてまして。

```python
>>> from itertools import count
>>> fooiter = count()
>>> tuple(zip(fooiter, ('a', 'b', 'c')))
((0, 'a'), (1, 'b'), (2, 'c'))
>>> tuple(zip(fooiter, ('a', 'b', 'c')))
((4, 'a'), (5, 'b'), (6, 'c'))
```
イテレータ (`count()`) が 3 を飛ばす。
なぜなら第2引数のタプルの終端を検出する前に第1引数のイテレータを評価 (`next()`)するから第1引数を最後に評価した値 3 (そして7も) は破棄されてしまう。

```python
>>> tuple(zip(('a', 'b', 'c'), fooiter))
(('a', 0), ('b', 1), ('c', 2))
>>> tuple(zip(('a', 'b', 'c'), fooiter))
(('a', 3), ('b', 4), ('c', 5))
>>> 
```
インデックスが後ろについて気持ち悪いがそれは気持ちの問題。

「イテラブルの左から右への評価順序は保証されています。」
ちょっと考えればすぐわかる話(←強調)。