OmniAICreator/Qiita-1.07M huggingface dataset:
簡単・安全にパスワード流出を確認する方法を作った話

#Qiita初投稿！！
初めてのqiita投稿、今まで読むだけだった私が記事を書いてみた。

#概要
[Have I Been Pwned?](https://haveibeenpwned.com/)でパスワードを送信せずにパスワード流出を確認できるスクリプトを書いてみた。

#作ったものと動機
以前から巷で有名なパスワードの漏洩を入力のみで確認できるサイト( https://haveibeenpwned.com/ )は存在が、パスワードをWeb上で入力し、送信するのには抵抗があった人も多いのではないだろうか？

そんなときにこんな記事を目にした。
Have I Been Pwned?でパスワードを入力せずに漏洩を調べる方法 | マイナビニュース
https://news.mynavi.jp/article/20190625-848118/

この記事によると、送信するのはパスワードではなく、パスワードをハッシュ化したハッシュ値の先頭5文字を送信する。
送信後、先頭5文字分に該当するハッシュ値のリストが取得できるため、ローカルにて先頭5文字以降のハッシュ値が含まれているか確認し、あれば流出していると言うことになる。

この方法であれば、自分が使用しているパスワードが外部に送信されることなく、安全に確認することができる。
しかし、記事に書かれていた方法ではLinuxコマンドを知っており、使えるような人でないと調べることができずもっと簡単に使えるようなソフトウェアがあれば、と言うことで作ってみた。

#作ってみた

https://github.com/ahodesuyo/PasswordCheck

```PasswordCheck.ps1
$pw =(Read-Host パスワードを入力してください -AsSecureString)
$encpw = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pw)
$decpw  = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($encpw)
$str1 = (([string]::concat(([security.cryptography.SHA1]::create().computehash([text.encoding]::ascii.getbytes($decpw))|%{ $_.tostring("x2")}))).ToUpper().Substring(0, 5))
$str2 = (([string]::concat(([security.cryptography.SHA1]::create().computehash([text.encoding]::ascii.getbytes($decpw))|%{ $_.tostring("x2")}))).ToUpper().Substring(6, 34))
[System.Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls11
$api = (curl https://api.pwnedpasswords.com/range/$str1)
if($api | select-string -CaseSensitive $str2 ){
	echo "`r`n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`r`n            流出しています。`r`n   直ちにパスワードを変更してください`r`n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!`r`n"
}else{
	echo "`r`n流出していません`r`n"
}

echo "終了するには何かキーを押してください . . ."
$host.UI.RawUI.ReadKey()
```

```Start.bat
powershell -ExecutionPolicy RemoteSigned .\PasswordCheck.ps1
```

**使い方**
Start.batを起動し、調べたいパスワードを入力してEnterを押すと流出しているかどうか分かります。

**実行例**
![pw.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449007/c7391e50-5f44-f56b-c626-a4c0f7d36b39.gif)

#参考
[Have I Been Pwned?](https://haveibeenpwned.com/)
[Validating Leaked Passwords with k-Anonymity](https://blog.cloudflare.com/validating-leaked-passwords-with-k-anonymity/)
[Have I Been Pwned?でパスワードを入力せずに漏洩を調べる方法 | マイナビニュース](https://news.mynavi.jp/article/20190625-848118/)
[Windows OS 上で文字列の SHA256 ハッシュ値を求める方法](https://devadjust.exblog.jp/18728927/)
Passing list-likes to .loc or [] with any missing label will raise KeyError in the future

## はじめに

pandas を使っていたら、以下の警告（warning）が出て、将来的に（pandas 0.21.0以降で）はエラーになるよ、と書いてあるのでドキュメントをちゃんと読んでみた。

> See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike
> ...
> Passing list-likes to .loc or [] with any missing label will raise KeyError in the future, you can use .reindex() as an alternative.

### 該当箇所

```python
# n_train はただの整数型の数値
# train_vars は df_train から必要な変数だけをとってくるために指定した文字列配列
X_train = df_train.loc[0:n_train, train_vars]
```

## 原因

ドキュメントから該当箇所を抜き出してみる。

> In prior versions, using .loc[list-of-labels] would work as long as at least 1 of the keys was found (otherwise it would raise a KeyError). This behavior is deprecated and will show a warning message pointing to this section. The recommended alternative is to use .reindex().

【拙訳】
過去のバージョンでは、`.loc[ラベルのリスト]` は少なくとも 1つのキーが見つかる限りは正しく動作していた（1つも見つからなければ `KeyError` となった）。この振る舞いは非推奨となり、（ドキュメントの）このセクションを示す警告を表示する。代わりに推奨されるのは、`.reindex()`を使用することである。

つまり、

```python
# こういうデータフレームに対して、
>>> df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6], 'c': [7,8,9]})
>>> df
   a  b  c
0  1  4  7
1  2  5  8
2  3  6  9

# これは OK で、
>>> df.loc[:,['a']]
   a
0  1
1  2
2  3

# これはダメ
>>> df.loc[:,['a','d']]
__main__:1: FutureWarning:
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike
/Users/chase0213/.pyenv/versions/3.6.2/lib/python3.6/site-packages/pandas/core/indexing.py:1367: FutureWarning:
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike
  return self._getitem_tuple(key)
   a   d
0  1 NaN
1  2 NaN
2  3 NaN
```

ということ。存在しないキーに対して参照すると、過去のバージョンでは何もなかったかのように `Nan` を突っ込んで返していたところ、ちゃんとエラーになるようにしたよ、というもの。
何も出なかったら見逃して処理続けちゃうよね、良い変更だね！

というわけで、対応策を考える。

## 対応策

### １． ちゃんと存在するキーを指定する

前述の通り、ちゃんと存在するキーを指定すれば問題ない。
ただし、データを結合したりして、どうしてもキーのない行、列を使いたいときはあるので、その際には次の `reindex()` を使う。

### ２． `reindex()`を使う

```python
# 新しく 'd' というキーを追加する
>>> labels = ['a','b','c','d']

# axis=1 に対して、labels を新しくキーに設定する
>>> df.reindex(labels, axis=1)
   a  b  c   d
0  1  4  7 NaN
1  2  5  8 NaN
2  3  6  9 NaN

# 何もエラーがでなくなる
>>> df.loc[:, ['a','d']]
   a   d
0  1 NaN
1  2 NaN
2  3 NaN
```

## 結論

deprecated になる箇所にはちゃんと意味があるので、警告だからといって無視せずにちゃんと理解して使おう（自戒）。
六ヶ月間Noモバイルインターネット!

![addiction-3558963_1920.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229807/3f7fc8a8-3fc7-f19a-81fa-14e5be7aee28.jpeg)
## はじめに

こんにちは streampack チームのメディです。
https://cloudpack.jp/service/option/streampack.html

## Copyrights 
Copyleft picture https://pixabay.com/photos/addiction-black-casual-cellphone-3558963/
Copyleft picture https://pixabay.com/photos/kindle-ereader-ebook-reading-cup-1245899/


## 免責事項
私は自身の経験を共有し、強制はいたしません。

## 動機 
私の携帯電話は、六ヶ月以上、オフラインの状態になっていました。通勤中は主に、娯楽目的で、携帯電話を使用していました。

使用状況がどのように変化したか説明したいと思います。

## スマートフォンの機種
アンドロイド携帯SIMフリーを約8500円で購入し、32gbのsdカードを追加購入しました。

## オフラインGPS
![Screenshot_20190624-173913.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229807/c997824c-1a2c-cf88-b5b7-7475dca39fa2.png)


ほとんどのオフラインGPSアプリは[Open Street Map](https://www.openstreetmap.org/#map=16/35.6796/139.7533)プロジェクトの地図を使用しています。
地図をダウンロードしてあなたの携帯電話のメモリまたはSDカードに保存する必要があります。
たとえば、東京の地図全体のサイズは約66 MBです。

私は[OsmAnd](https://osmand.net/) アプリを使っています。


## オフラインウィキペディア
オフラインでウィキペディアを使用することが可能であったことを知っていましたか？
![Screenshot_20190624-180634.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229807/b27fa15d-2e6b-501e-8997-10f8393da81f.png) ![Screenshot_20190624-180751.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229807/2da56bc4-22c7-1071-bb48-cb0f7ecb03a4.png)

[Kiwix](https://www.kiwix.org/en/)アプリでWikipediaをオフラインで使用することは可能です。
ウィキペディアのファイルは重いため、sdカードを購入することをおすすめします。


## 学習
![Screenshot_20190624-174554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229807/f9808ba3-45dd-3651-2d70-a59b1751d6e7.png)
語学習得のため私は[Anki](https://play.google.com/store/apps/details?id=com.ichi2.anki)アプリを使用しています。
Ankiはフラッシュカード暗記アプリケーションです。
基本的にあらゆる分野を学ぶことができます。(言語、科学など)


## 読書
![kindle-1245899_1920.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229807/0a575c95-3db5-daea-1bc7-5d169addf0cf.jpeg)
私はシンプルな白黒の電子ブックリーダーを使っています。
ほとんど無料のパブリックドメインの本を読んでいるのでコストはかかりません。


## ストレスが多い？
正直に言うと、携帯依存があったので、モバイルインターネットなしでの最初の週は非常に難しかったです。

## 結論
現在、語学学習や調べものをする際など正当な理由のみスマートフォンを利用します。


## 情報元
https://www.kiwix.org/en/
https://www.openstreetmap.org/#map=5/35.588/134.380
https://osmand.net/
https://play.google.com/store/apps/details?id=com.ichi2.anki
wemosで16字2行LCD

#概要

wemod d1で16字2行LCDやってみた。

#写真

![DSCN0365.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d83dbb90-1f43-648a-705b-b0350a416edb.jpeg)

#接続

i2cなので、SDAとSCLをつなぎます。
アドレスは、0x27です。


#サンプルコード

```
#include <Wire.h> 
#include "Lcd8574.h"

Lcd8574 lcd;
int i = 0;
void setup()
{
	pinMode(2, OUTPUT);
	lcd = Lcd8574();
	lcd.begin(16, 2);
	lcd.print("012hello, world!");
}
void loop()
{
	i++;
	lcd.setCursor(1, 0);
	lcd.print(i);
	digitalWrite(2, HIGH);
	delay(1000);
	digitalWrite(2, LOW);
	delay(1000);
}
```


#ライブラリー

https://github.com/ohisama/Lcd8574

以上。
【Flutter】カスタムWidgetを用いて破線を表示する

# 背景
Flutterアプリで破線を表示したいと思いました。
標準のWidgetで実現できないか調べたところ、私が調べた限りでは実現方法が見つからなかったため、カスタムWidgetを作成して実現しました。

# 見た目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/b2bfcab8-5e5b-f001-b39d-e28a2d52a552.png)

# コード

```dart:dash_line.dart
import 'package:flutter/material.dart';

class DashLine extends StatelessWidget {
  const DashLine({
    @required Color dotColor,
    Color spaceColor = Colors.transparent,
    @required double width,
    @required double height,
    @required double dashGap,
    @required Axis direction,
  })  : assert(
            (direction == Axis.vertical && dashGap <= height) ||
                (direction == Axis.horizontal && dashGap <= width),
            "When direction is $direction, dashGap($dashGap) must be less than ${direction == Axis.vertical ? "height($height)" : "width($width)"}"),
        this._dotColor = dotColor,
        this._spaceColor = spaceColor,
        this._dashGap = dashGap,
        this._width = width,
        this._height = height,
        this._direction = direction;

  final Color _dotColor;
  final Color _spaceColor;
  final double _dashGap;
  final double _width;
  final double _height;
  final Axis _direction;

  @override
  Widget build(BuildContext context) {
    return Container(
      width: _width,
      height: _height,
      child: ListView.builder(
        itemBuilder: (_, index) {
          final color = index % 2 == 0 ? _dotColor : _spaceColor;
          return _buildDashLine(color);
        },
        scrollDirection: _direction,
        physics: NeverScrollableScrollPhysics(),
      ),
    );
  }

  Widget _buildDashLine(Color color) {
    switch (_direction) {
      case Axis.horizontal:
        return Container(
          height: _height,
          width: _dashGap,
          color: color,
        );
        break;
      case Axis.vertical:
        return Container(
          height: _dashGap,
          width: _width,
          color: color,
        );
        break;
      default:
        return null;
    }
  }
}
```

# 追記
ライブラリとしてpub.devに公開いたしました！
ぜひ使ってみてください。
https://pub.dev/packages/dotted_line
https://github.com/umechanhika/dotted_line

また、ライブラリの運用自動化に関する記事も書いたので、ご興味をお持ちの方はそちらもご参照ください。
https://qiita.com/umechanhika/items/9790ed73c36e28dac926
日々の進捗ノート_言語処理100本ノック05

# 05.n-gram
>与えられたシーケンス（文字列やリストなど）からn-gramを作る関数を作成せよ．この関数を用い，"I am an NLPer"という文から単語bi-gram，文字bi-gramを得よ．

```gengo05.py
def l_n_gram(sentence, n):
    res = []
    for i in range(len(sentence)-n+1):
        res.append(sentence[i : i+n])
    return(res)

def w_n_gram(sentence, n):
    sentence = sentence.split(" ")
    return(l_n_gram(sentence, n))

print(l_n_gram("I am an NLPer", 2))
print(w_n_gram("I am an NLPer", 2))
```
####結果
`['I ', ' a', 'am', 'm ', ' a', 'an', 'n ', ' N', 'NL', 'LP', 'Pe', 'er']
[['I', 'am'], ['am', 'an'], ['an', 'NLPer']]`

####備忘録
・関数名にはハイフンは使えない
・"："忘れがち
Office2019のインストール（ボリュームライセンス版）

## 経緯
職場用パソコンにOffice2019をダウンロードした時、以前のように簡単にはいかずちょっと面倒くさかった。


## 使用したパソコン
・Windows10 Home
・SSD約512Gb、メモリ約20Gb

ご参考まで・・。
##インストール手順
①　Microsoft ボリューム ライセンス サービス センターにログイン後、製品のダウンロードをクリック
![VL1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285156/b635ec86-bf8a-4078-0301-77d5939cc6c6.png)

②Office Standard 2019の”ダウンロード”をクリックし、続行をクリック。
![VL2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285156/7bc4f733-08d1-0afa-a8af-2ef2025f658c.png)

③いろいろな言語のISOファイルなどがずらずらと出てくると思うが、ここでは一番下にある”Office 2019 Deployment Tool ”のところにある↓マークをクリックしてOffice 2019 Deployment Toolをダウンロードする（Microsoft Edgeの場合、デフォルトではダウンロードフォルダにダウンロードされる、、はず）。
![VL3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285156/8afc300e-58cf-d6d6-a80b-dd7b0a1b2673.png)

④ダウンロードしたOffice 2019 Deployment Toolがあるフォルダを開き、ダウンロードしたファイル（Office_Deployment_Tools_2019_*****）をクリック
![VL4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285156/6cd789b8-4626-b7d3-77e4-c23db02de0e2.png)


⑤デバイスに変更を加えるかどうか聞かれると思うので、許可する（じゃないとインストールできない）

⑥チェックボックスをクリックし、チェックをいれたらContinueをクリック
![VL5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285156/a4b2e120-e065-0d16-9d0f-50e4536fd330.png)

⑦Office Deployment Toolをインストールするフォルダーを聞かれるので、分かりやすいデスクトップなどを指定し、OKをクリック。”Files extracted successfully.”とでたらOK。（PC操作が苦手な人はデスクトップにインストールしよう）
![VL6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285156/df28ed91-2bd5-fc75-9f6a-8328d2b56452.png)

⑧ダウンロードしたフォルダー（ここではデスクトップ）に”setup.exe”、”configuration-Office365-x64.xml”、”configuration-Office365-x86.xml”という3つのファイルができていることを確認。

⑨メモ帳などを開いて、configuration.xmlというファイルを作成します。よくわかんねぇ！という方は以下に記載した文？をメモ帳にコピペしましょう。”PIDKEY”=に、ハイフン込みでライセンス認証のプロダクト キーを入力してください。

```xml:configuration.xml
<Configuration>
  <Add OfficeClientEdition="64" Channel="PerpetualVL2019">
    <Product ID="Standard2019Volume" PIDKEY="XXXX-XXXX-XXXX-XXXX-XXXX">
      <Language ID="ja-jp" />
    </Product>
  </Add>
</Configuration>
```
ファイル名をconfiguration.xmlとしてデスクトップに保存（setup.exeと同じところに保存すると楽かも）。
※32bit版が欲しいという方は、OfficeClientEdition="64"のところを32にしてください。

⑩コマンドプロントを立ち上げます。タスクバーの左から2番目にある〇マークをクリックし、”コマンド プロンプト”と検索して起動させてください（”コマンド”だけでもでてくるかも？）
![VL7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285156/94f87a5f-00b6-8b41-836b-7f593aad0590.png)

⑪黒い画面が立ち上がったら、以下のコマンドを入力して先ほどダウンロードした"setup.exe"が入っているフォルダー（今回はDesktop）に移動します。

```
C:¥Users¥User名>dir
～
更新日やフォルダー、ファイル名がずらっとリストされると思います。
Desktopがあるのを確認しましょう。
～

C:¥Users¥User名>cd Desktop　#Desktopフォルダーに移動

C:¥Users¥User名¥Desktop>
```

⑫メモ帳で作ったファイル名を指定して以下のコマンドを打つと、Office2019のインストールが始まります（確か）

```
C:¥Users¥User名¥Desktop>setup /configure configuration.xml
```

![VL9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285156/777e71f0-d986-7155-0389-671332b826eb.jpeg)

WordやExcelなどを立ち上げて問題無ければ、インストール完了です。お疲れ様でした！！

ボリュームライセンスでもOffice2016までは楽にインストールできると聞きましたので、上記の方法で失敗してしまった！または黒い画面に抵抗ある・・・という方はOffice2016のインストールをお勧めします。
2019-06-28 Hatenabookmark > bug > タグリストが更新されない > サーバーの不調と関係？ | 直る見込みがない (2019-07-03)

2019-06-28現在

はてなブックマークで登録しても、タグリストに新規タグが登録されないようだ。

タグ入力補完に表示されない理由を探していて気づいた。

運営には報告済。

使いにくい。

~~自分でタグリストに追加する、などしないといけない。~~
自分で追加するUIはないか。

### 追記

2019-06-28

ブックマーク登録時にタグ登録が失敗している、のではないようだ。
WebUIからタグ検索でブックマークが検索できる。

一方で、WebUIの左メニューの「すべてのタグ」でそのタグは表示されない。

最近のサーバーの不調と関係あるのかもしれない。

サーバーの不調のために下記の症状が発生しているのだろう。

A. WebUIのタグリストに表示されない
B. FireFoxアドオンでのタグ入力補完のリストに表示されない


### タグの上限数

タグの上限数の変更について
https://hatena.g.hatena.ne.jp/hatenabookmark/20070406/1175838568

上記の情報が有効であれば、5000件は可能。

5000件もタグを登録はしていない。

### 直る見込みがない (2019-07-03)

2019年7月3日現在、この症状は直る見込みがない。

はてなブックマーク以外のサービス利用を検討しているが、今のところ「これだ」と思えるものは見つかってはいない。

移行するにしても時間がかかるだろう。

### 一部のタグだけ見えるようになった (2019-07-05)

一部のタグだけ見えるようになった。ブラウザ拡張でのタグ入力補完も有効。

まだ一部のタグが見えない。

サーバーの調子が悪かった時期の登録が失敗している可能性はある。

(運営からの連絡はなし）
coreserver value domainの関係性

coreserverの使い方をまとめています。
まずは無料お試し版を使ってみています。

使い方は難しくはなさそうなので、まぁ備忘録ってことで記録しておきます。

わからないこと
valueは昔登録していたようで全然おぼえがないが、　でもすぱむ　広告が入っていたので、いつかは、comをとっておこうかなって思った。
Active Storage利用時にPublic URLな画像を利用する方法

Active Storageでs3などにファイルをアップロードする場合、基本的にprivateでアップロードされ、画像表示時には一時URLを参照することになります。

ただ、ogpに使う画像などpublicで恒久的なURLが欲しい場合があると思います。

そんなときの対処方法を調べてみたので共有します。

# 結論

`rails_representation_url` を使うのが良さそう感

```ruby
class Member < ApplicationRecord
  has_one_attached :avatar
end
```

みたいなモデルの場合

```ruby
rails_representation_url(@member.avatar.variant(resize: "512x512!", strip: true).processed, disposition: :inline)
```

のように取得できます

# 作業ログ
> [Active StorageはまだPublic URL（ファイル）に対応していない](https://blog.funseek.co.jp/2018/08/active-storagepublic-url_22.html)

まじかよ

↓

> [Rails の ActiveStorage を S3 で使ったらPublicなURLが取れなかった](https://qiita.com/chchu/items/35249b00e5c4cea178e4)

アップロード時に権限を変更する方法(アップロード後にLambdaでやっても良さそう)があるのか。
でもなんかもっといいやり方ないんだろうか

↓

> [Rails ActiveStorage で PUBLIC な URL を表示する](https://qiita.com/yutackall/items/bc1ab2e9a508e33a05ac)

このやり方良さそう。
でもbucketポリシーで指定してるけど、Active Storage側はprivate前提なので、後で見たときわからなくなりそうだったり、Active Storage側のレールに乗ってない感で、ちょっと不安あるなあと思ったので、他の選択肢ってないかな

↓

images_controllerみたいなのを自前で作って、signed_urlにリダイレクトすることで、そのURLが公開URLになるのでは?

↓

そういうのがActive Storage公式にあった

https://github.com/rails/rails/blob/v5.2.3/activestorage/app/controllers/active_storage/representations_controller.rb

> Take a signed permanent reference for a blob representation and turn it into an expiring service URL for download.
> Note: These URLs are publicly accessible. If you need to enforce access protection beyond the
> security-through-obscurity factor of the signed blob and variation reference, you'll need to implement your own
> authenticated redirection controller.

↓ グーグル翻訳

> BLOB表現の署名付き永久参照を取得し、ダウンロード用に有効期限が切れたサービスURLに変換します。
> 注：これらのURLは一般にアクセス可能です。 アクセス保護を超えてアクセス保護を強化する必要がある場合
> 署名されたBLOBとバリエーション参照のセキュリティを通じた曖昧さ要因、あなた自身で実装する必要があるでしょう
> 認証済みリダイレクトコントローラ。

なんか求めてるもののような違うような...英語力が貧弱なので不安

処理を見てみると 単純に `service_url` へリダイレクトをしているので求めているものっぽい感じ
expireしても再取得できそう

↓

Rails Guideに載ってないのでちょっと不安だが、これを使うことにしました。
IntelliJで開発する時によく使ってるショートカットキー

* 自分がIntelliJで開発するときによく使っているショートカットキーをまとめてみました。

## 保存
* **`Command` + `S`**
* IntelliJはデフォルトの設定だと自動保存になっている（はず）ので打つことは無いかもですが、あんまり自動保存が好きじゃないのでOffにしているためよく使います。

## 前に戻る
* **`Command` + `Z`**
 
## 次へ
* **`Command` + `Shift` + `Z`**

## コードフォーマット
* **`Command` + `Shift` + `F`**
* キーの位置的に若干使いづらい感があるので僕は`F`を`L`に変更してます。

## 不要なインポート文の削除
* **`Ctrl` + `Option` + `O`**
* 使っていないimport文が残ったままpushすることが結構あったので意識して使うようにしています...。

## 定義に移動
* **`Command` + `B`** もしくは **`Command` + `↓`**
* クラスやメソッドがどのように実装されているか確認するときによく使っています。

## 実行&再実行
* **`Ctrl` + `R`**

## デバッグ
* **`Ctrl` + `D`**

## 縦選択
* **`Option２回` + `↑` か `↓`**
* Option2回目の時に`Option`押しながら`↑` か `↓`キーを押します。

## カーソル行の複製
* **`Command` + `D`**
* テストを書く時とかに使ったりしてます。

## カーソル行の削除
* **`Command` + `BackSpace`**

## リネーム
* **`Shift` + `F6`**
* メソッド名とか変数名を変更するときに重宝します。

## ターミナル召喚
* **`Option` + `F12`**
* ｻｯと呼べるので便利です。

## コミット操作画面の表示
* **`Command` + `K`**

## プッシュ操作画面の表示
* **`Command` + `Shift` + `K`**

## プル操作画面の表示
* **`Option` + `P`**
* デフォルトだと割り当てられていないので自分でこのキーマッピングにしました。

## フェッチ
* **`Option` + `F`**
* デフォルトだと割り当てられていないので自分でこのキーマッピングにしました。

## IntelliJの設定画面の表示
* **`Command` + `,`**

## プロジェクト構成画面の表示
* **`Command` + `;`**
* 使用するJDKのバージョンとか変更する時に使ったりしてます
CSSで版ズレエフェクト テキスト編

昨日書いた[CSSで版ズレエフェクト画像編](https://qiita.com/hibikikudo/items/1e447ef49928ced21d6a)に続き、テキストで版ズレを作ってみたらなかなかエモい感じになりました。
![スクリーンショット 2019-06-28 14.56.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119598/e10b9630-9092-05c7-fb60-a1d2d324b8b1.png)

<p class="codepen" data-height="500" data-theme-id="0" data-default-tab="result" data-user="h_kudo" data-slug-hash="oroOgM" style="height: 500px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Off-registration Text Effect">
  <span>See the Pen <a href="https://codepen.io/h_kudo/pen/oroOgM/">
  CSS Off-registration Text Effect</a> by Hibiki Kudo (<a href="https://codepen.io/h_kudo">@h_kudo</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## コード
### 2色版ズレ
```html:html
<link href="https://fonts.googleapis.com/css?family=Abril+Fatface|Sawarabi+Mincho&display=swap" rel="stylesheet">
<div class="off-registration">
  off registration effect
</div>
```

```scss:scss
.off-registration {
  font-family: "Abril Fatface", "Sawarabi Mincho", cursive;
  font-size: 70px;
  color: rgba(0, 0, 0, 0.9);
  position: relative;
  line-height: 1.2;
  margin-bottom: 40px;
  @media screen and (max-width: 480px) {
    font-size: 60px;
  }
  &:before,
  &:after {
    top: 0;
    position: absolute;
    display: block;
    content: "off registration effect";
    mix-blend-mode: color-burn;
  }
  &:before {
    color: cyan;
    transform: translate(1px, 1px) rotate(0.1deg);
  }
  &:after {
    color: magenta;
    transform: translate(-1px, -1px);
  }
}
```

### 3色版ズレ
```html:html
<link href="https://fonts.googleapis.com/css?family=Abril+Fatface|Sawarabi+Mincho&display=swap" rel="stylesheet">
3色版ズレ
<div class="off-registration-jp">
  <span>まつすぐな道でさみしい</span>
</div>
```

```scss:scss
.off-registration-jp {
  font-family: "Abril Fatface", "Sawarabi Mincho", cursive;
  font-size: 70px;
  color: rgba(0, 0, 0, 0.9);
  position: relative;
  line-height: 1.2;
  @media screen and (max-width: 480px) {
    font-size: 60px;
  }
  &:before,
  &:after {
    top: 0;
    position: absolute;
    display: block;
    content: "まつすぐな道でさみしい";
    mix-blend-mode: color-burn;
  }
  &:before {
    color: magenta;
    transform: translate(1px, 1px) rotate(0.1deg);
  }
  &:after {
    color: cyan;
    transform: translate(-2px, -1px) rotate(-0.2deg);
  }
  span {
    &:before {
      top: 0;
      position: absolute;
      display: block;
      content: "まつすぐな道でさみしい";
      mix-blend-mode: color-burn;
      color: rgba(250, 240, 0, 0.7);
      transform: translate(2px, 3px);
    }
  }
}

```
基本は[画像編](https://qiita.com/hibikikudo/items/1e447ef49928ced21d6a)と一緒です。こちらの方がより簡単ですね。
ポイントはシアン（Cyan）、マゼンタ（Magenta）、イエロー（Yellow）のうち2色を使って、CMYK印刷の雰囲気を出すこと。
3色選ぶと輪郭の荒れが気になりましたが、イエローを最前面に持ってくると綺麗な表示になりました。
[Google Fonts](https://fonts.google.com/)でいい感じのフォントを選んで遊んでみてください！
Laravel で 開発を始める時の master/slave を意識した Docker 環境

# 概要

Laravel で開発を始める際、
最低限用意してあると便利そうだと思った構成をコピペできるようしました。
説明は基本的にリポジトリの README.md に書いてあります。

[リポジトリ](https://github.com/koizumi-yakumo/laravel-base)

需要があればもう少し丁寧に整理するかも…。

# お世話になったドキュメント

利用させて頂きました、ありがとうございます。
問題ありましたら修正・対応致します。

* [Dockerを使ってLaravel開発環境構築](https://qiita.com/A-Kira/items/1c55ef689c0f91420e81)
* [docker-composeでMaster/Slave構成のMySQLを手に入れる](https://qiita.com/takyam/items/f13bc4a1db0433ffb958)
* [docker-compose で MySQL レプリケーション環境をサクッと用意する](https://ngyuki.hatenablog.com/entry/2019/02/18/103036)

# ざっくり機能

* Laravel をコンテナ上で動かす
* mysql は master/slave 構成とする
* あえてレプリ遅延を起こす
Django について 

#仮想環境の作り方
1. 仮想環境用のディレクトリを作る
   (mkdirコマンドを用いる)
2. cdコマンドを用いて、1.で作ったディレクトリに移動
3.  python3 -m venv myvenvを入力

#Djangoのインストール
1. python3 -m pip install --upgrade pipを打ち込み、最新のバージョンか確認
2. requirements.txtファイルをフォルダーの中に作る
3. コードエディタをつかって、ファイル中にDjango~=2.2.2を追加
4. windowsでは、pip install djangoを打ち込んでDjangoをインストール
5. 実行例:
```(myvenv) ~$ pip install -r requirements.txt
Collecting Django~=2.2.2 (from -r requirements.txt (line 1))
  Downloading Django-2.2.2-py3-none-any.whl (7.1MB)
Installing collected packages: Django
Successfully installed Django-2.2.2
```

***詳しくはdjangogirlsを参照***
日々の進捗ノート_言語処理100本ノック04

# 04.元素記号
>"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し，1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字，それ以外の単語は先頭に2文字を取り出し，取り出した文字列から単語の位置（先頭から何番目の単語か）への連想配列（辞書型もしくはマップ型）を作成せよ．

####190628追記
`for x, i in enumerate (senlis, 1)`
ここんとこiを前にしてxを後にしたほうがいいらしい
確かにiは慣例としてインデックス値を取る
あと関数は省略しないほうがいい，とのことでxをcharacterにするとかするとよりよい．

```gengo04.py
sen = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
sen = sen.replace(".", "")
senlis = sen.split(" ")
pick =(1, 5, 6, 7, 8, 9, 15, 16, 19)
res = {}
for x, i in enumerate(senlis, 1):
    if x in pick:
        res[senlis[x - 1][0]] = x
    else:
        res[senlis[x - 1][0:2]] = x

print(res)
```
####結果
`{'H': 1, 'He': 2, 'Li': 3, 'Be': 4, 'B': 5, 'C': 6, 'N': 7, 'O': 8, 'F': 9, 'Ne': 10, 'Na': 11, 'Mi': 12, 'Al': 13, 'Si': 14, 'P': 15, 'S': 16, 'Cl': 17, 'Ar': 18, 'K': 19, 'Ca': 20}`

####備忘録
・enumerateべんり
・１２番目の元素はMg
【Unity】UnityEditor.BuildPlayerWindow+BuildMethodExceptionが発生してAndroidビルドできないときの対処方法

# 背景

スマホ向けVRアプリを作成中です。
そのとき、Android用にビルドしようとしてもうまくいかず、かなり解決に時間がかかってしまいました。
対処方法として、いくつか試したので、紹介しようと思います。

発生したエラーは以下のとおりです。

```
UnityException: No Android devices connected
Make sure your device is plugged in.
If you are sure that the device is attached then it might be USB driver issue, for details please check 'Android environment setup' section in Unity manual.
UnityEditor.BuildPlayerWindow:BuildPlayerAndRun()
```

```
Build completed with a result of 'Failed'
UnityEditor.BuildPlayerWindow:BuildPlayerAndRun()
```

```
UnityEditor.BuildPlayerWindow+BuildMethodException: 2 errors

  at UnityEditor.BuildPlayerWindow+DefaultBuildMethods.BuildPlayer (UnityEditor.BuildPlayerOptions options) [0x00242] in C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindowBuildMethods.cs:194 

  at UnityEditor.BuildPlayerWindow.CallBuildMethods (System.Boolean askForBuildLocation, UnityEditor.BuildOptions defaultBuildOptions) [0x0007f] in C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindowBuildMethods.cs:97 
UnityEditor.BuildPlayerWindow:BuildPlayerAndRun()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/1211fa5a-8ff4-e41a-6536-acf509dd045b.png)


# 環境

- Windows 10
- Unity 2019.1.5f1
- Android Studio Version 3.2.1

# 1. Unityを管理者として実行＆ビルド（効果なし）

Unityを「右クリック」→「管理者として実行」をクリックして、該当するプロジェクトを開きます。
そして、Build And Runします。
エラー内容変わらず。

# 2. Unityをバージョンアップする（効果なし）

Unityを最新バージョンにアップデートします。
エラー内容変わらず。

# 3. Unityをダウングレードする（効果なし）

Unity 2018.3.1f1にダウングレードしてビルドしてみました。
エラー内容変わらず。

# 4. Windows 10の更新プログラム（効果なし）

設定→更新とセキュリティ→Windows Update で更新プログラムを確認。
とくに更新するものもなく、状況は変わらず。

# 5. C:\Users\[name]\Documentsフォルダにビルドする（効果なし）

いままで C:\Users\[name]\Desktop にapkを作成しようとしていたので、Documentsフォルダ配下に変更しました。
エラー内容変わらず。

# 6. Minimum API Levelを下げる（効果なし）

Android 7.1（API Level 25）から、Android 5.0（API Level 20）に下げてみました。
エラー内容変わらず。

# 7. プロジェクトのフォルダ内の.slnファイルを削除する（効果なし）

.slnファイルをゴミ箱へ。
エラー内容変わらず。
（必ずバックアップをとっておき、作業が終わったら戻してください。）

# 8. AndroidをUSBデバッグをONにする

使用していたAndroidがデバッグモードになっていませんでした。
下記が非常に参考になります。
[[Android]  アプリを実機でデバッグするためのUSB ドライバーを設定する](https://akira-watson.com/android/nexus7-usb-driver.html)

USBデバッグをONにしたら、無事ビルドすることができました。

# あとがき

AndroidのUSBデバッグをOFFにしたことを完全に忘れていました。
てっきりUnityをアップデートしたことが原因かと思い、ずっと的外れな対処を試していました。
Unityに関するエラー調査力がまだまだだと痛感しました。

# 参考文献

[Unityがビルドできない｜teratail](https://teratail.com/questions/139998)
[Unable to build my projects in 2018.2.0b7 after receiving fatal build error](https://forum.unity.com/threads/unable-to-build-my-projects-in-2018-2-0b7-after-receiving-fatal-build-error.535810/)
ng addでng-cli-pug-loaderとapollo-angularしたらERROR in : 'module' is not a known element

Webページの見た目とかを試行錯誤していくのに、生のHTMLだと閉じタグの面倒みるのが手間なので[PUG](https://pugjs.org)(旧Jude)を好んで使っている。

Angular CLIでもテンプレートにPUGを使いたいという要望はあるけど、内部のWebpackの設定を書き換えるという荒業(?)を実現してくれる[ng-cli-pug-loader](https://github.com/danguilherme/ng-cli-pug-loader)が公開されている。
```ng add ng-cli-pug-loader```でインストールでき、npmでインストール後のタイミングでng-add-pug-loader.jsが実行され、上記設定書き換えが行われる。

これで、例えばapp.component.htmlも

```:app.component.pug
//The content below is only a placeholder and can be replaced.
div(style='text-align:center')
  h1 
    | Welcome to {{ title }}!
  img(width='300', alt='Angular Logo', src='...割愛...')
h2 Here are some links to help you start:
ul
  li
    h2
      a(target='_blank', rel='noopener', href='https://angular.io/tutorial') Tour of Heroes
  li
    h2
      a(target='_blank', rel='noopener', href='https://angular.io/cli') CLI Documentation
  li
    h2
      a(target='_blank', rel='noopener', href='https://blog.angular.io/') Angular blog
```
な感じに書ける。これは[HTML2Jade](https://html2jade.org/)を使って変換したやつで、既存のHTMLとかかでも簡単に移行できる。あとはng g componentで生成されるテンプレートが最初からpugになると更に嬉しいかんじです。


# ところが
昨日はうまく動いていたAngularアプリが、朝にnpm startで起動してブラウザでアクセスると何も画面が表示されず、コンソールには以下のエラーが出力されていた。

```
ERROR in : 'module' is not a known element:
1. If 'module' is an Angular component, then verify that it is part of this module.
2. To allow any element add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component.
```

最初はなんのことかさっぱりだったけど、そう言えば昨日、GraphQLクライアントを```ng add apollo-angular```でインストールしてたことを思い出した。その時はnpm startしたまま作業を続けていて、それだと問題が発生しない現象なのかもしれない。

この時の主なモジュールのバージョンは以下の通り。

|モジュール|バージョン|
|---|---|
|nodejs|10.16.0|
|@angular/cli|8.0.3|
|ng-cli-pug-loader|0.2.0|
|apollo-angular|1.6.0|


# 調べてみた
結論として、Webpackの設定ファイルがおかしな状態になっていた。


* ng add ng-cli-pug-loader直後

```js:node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/webpack-configs/common.js
309:            rules: [
310: { test: /\.(pug|jade)$/, exclude: /\.(include|partial)\.(pug|jade)$/, use: [ { loader: "apply-loader" }, { loader: "pug-loader" } ] }, { test: /\.(include|partial)\.(pug|jade)$/, loader: "pug-loader" },
```

* ng add ng-cli-pug-loader → ng add apollo-angular直後

```js:node_modules/@angular-devkit/build-angular/src/angular-cli-files/models/webpack-configs/common.js
309:            rules: [ { test: /.(pug|jade)$/, exclude: /.(include|partial).(pug|jade)$/, use: [ { loader: "apply-loader" }, { loader: "pug-loader" } ] }, { test: /.(include|partial).(pug|jade)$/, loader: "pug-loader" },
310: { test: /\.(pug|jade)$/, exclude: /\.(include|partial)\.(pug|jade)$/, use: [ { loader: "apply-loader" }, { loader: "pug-loader" } ] }, { test: /\.(include|partial)\.(pug|jade)$/, loader: "pug-loader" },
```

本来の定義の前に、エスケープ文字が取り除かれた定義が追加されていた。
これを元に戻すことでエラーは解消された。

うろ覚えだけどAngular Materialも```ng add @angular/material```で追加した時にも同じようなエラーに遭遇した気がするので、同じ原因なのかもしれない。

さらに誰がこれを引き起こしているのか追求してみたいところだが、まずはここまでで満足しておきます。
thinkpad bion 開かない 起動しない時

thinkpad を起動する際に
````F2````も試して````Fn````+````F2````も試して````Enter````も試して上手くいかない場合

１日くらい悩んだ結果、
シャットダウンの仕方に問題があるようで、
````Shift````+````ShutDoun````で
その後、立ち上げた時、キー入力ができるようになりました。
Singularity入門：コンテナを使う(shellとexec)

# はじめに
今までSingularityの環境構築やビルドの方法について以下のような記事をアップしてきました．

- 環境構築編：[CentOS7にSingularity 3.0.3+GPU環境を構築する](https://qiita.com/HoriThe3rd/items/492afd7600ce714dd240)
- イメージ作成編：[SingularityコンテナをBuildする方法まとめ(Singularity v3.0.3)](https://qiita.com/HoriThe3rd/items/6982247ac0f612d0474a)

今回はこれらの環境を「使う」ことに焦点を当てて基本を解説したいと思います．
主に，データサイエンスや深層学習で用いられるJuliaやPythonといったスクリプト言語をSingularityコンテナで実行する用途を想定しています．Singularityコンテナでスクリプトを走らせるにはどうすればよいのかまとめます．

なお，使用したSingularityのバージョンは，3.0.3です．
公式サイトのマニュアルは[こちら](https://sylabs.io/docs/)です．

# コンテナの準備
今回の例として，Julia[^1]と呼ばれるプログラミング言語のコンテナを例にしてみようと思います．ここは別にJuliaでなくてもPythonでもRでもなんでも同じです．

[^1]: [Julia公式サイト](https://julialang.org/)

まず，Juliaのコンテナを作成します．[DockerHubに出来合いのものがある](https://hub.docker.com/_/julia)ので，それをSingularityコンテナにbuildしましょう．

```shell
$ singularity build Julia.sif docker://julia

INFO:    Starting build...
Getting image source signatures
Skipping fetch of repeat blob sha256:6f2f362378c5a6fd915d96d11dda1e0223ccf21f121ace56ae0f6616ea1dc8
Skipping fetch of repeat blob sha256:d95646cd657efb15e2cba09c7de5fb7a6a12ede978490868456fbb752ea70e
Skipping fetch of repeat blob sha256:57212f546c7dc689fe27d5b104a29e0cd109f637f7c737c9a9c0358fb33e35
Copying config sha256:079bf4814a0593c941f1485eb4befefc5645fed8bbc976e38da0d490bcca18
3.59 KiB / 3.59 KiB [======================================================] 0s       
Writing manifest to image destination
Storing signatures
INFO:    Creating SIF file...
INFO:    Build complete: julia.sif
```

しばらくすると，同じディレクトリに，Julia.sifなるイメージファイルが出来上がっています．

# 実際に動かしてみる
Singularityコンテナでコマンドを実行するには大きく分けて以下の2つの方法があります．

- コンテナ内のシェルに一旦入ってそこでコマンドを実行する(shellコマンド)
- コンテナ上でコマンドを直接実行する(execコマンド)

それぞれ見ていきます．

## shellコマンド
コンテナに入ってその中の環境のシェルを呼び出します．
singularity shellに続いてイメージファイルを指定します．ついでにJuliaも起動してみます．

```shell
$ singularity shell my_image.sif

# 以下のプロンプトはコンテナ内の環境である
Singularity julia.sif:~/containers> julia --version 
julia version 1.1.1 

# Julia起動
Singularity julia.sif:~/containers> julia

               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.     
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.1.1 (2019-05-16)
_/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release   
|__/                   |

julia>
```

これを行うと，そのコンテナのシェルにログインします．プロンプトが表示されていると思います．
そこではコンテナの環境が持つ各種コマンドを利用することができます．
この状態で，"julia"と打ち込むと，Juliaが起動し，コマンドを入力できるようになります．

## execコマンド
これはコンテナのシェルにログインせず，外からそのコンテナの環境に処理させるコマンドを与える方法です．
最近流行りのデータサイエンスや深層学習の処理などまとまったスクリプトを実行するときに便利でしょう．
構文は次のようになります．

```shell
$ singularity exec イメージファイル名 実行させるコマンド
```

試しに，JuliaでHello worldと表示させるだけのスクリプトを作ってみます(全く実用的ではないですが・・・)．

```julia:test.jl
println("hello world!")
```

では，このファイルを実行してみます．julia.sifのコンテナ内で"julia test.jl"コマンドを実行しています．

```shell
$ singularity exec julia.sif julia test.jl
hello world!
```
# 終わりに
singularityには様々なコマンドが存在しますが，おそらくshellとexecは使用頻度の非常に高いものではないでしょうか．
singularityの入ったサーバでプログラムを実行しようと思っている人の参考に少しでもなれば幸いです．
Effective Java 第３版 第８章メソッド


Java中級者以上の必須本である、[Effective Java 第３版](https://www.amazon.co.jp/Effective-Java-%E7%AC%AC3%E7%89%88-%E3%82%B8%E3%83%A7%E3%82%B7%E3%83%A5%E3%82%A2%E3%83%BB%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF-ebook/dp/B07RHX1K53)に Kindle版が出たので、まとめる。

前：[Effective Java 第３版 第７章ラムダとストリーム](https://qiita.com/tseno/items/7bbac195dc3382fab167)
次：[Effective Java 第３版 第９章プログラム一般](https://qiita.com/tseno/items/d35f1cc5cc0a37096423)

# 項目４９　パラメータの正当性を検査する

- publicとprotectedのメソッドに対しては、パラメータ値に関する制約が守られていない場合にスローされる例外をJavadocの`@throws`タグを使って文章化する。一般的にその例外は、`IllegalArgumentException`、`IndexOutOfBoundsException`、`NullPointerException`。 
- Java7で追加された、`Objects.requireNonNull`メソッドは柔軟かつ便利なので、null検査を手作業で行う必要はない。

```Java
// strategyがnullの場合は、NullPointerExceptionを投げる
this.strategy = Objects.requireNonNull(strategy, "strategy must not be null.")
```

- Java9では範囲検査機構が、`java.util.Objects`に追加された。`checkFromIndexSize`、`checkFromToIndex`、`checkIndex`の3つのメソッドから構成され、リストと配列のインデックスが範囲内かどうかチェックする。
- publicではないメソッドは、アサーションを使ってパラメータを検査すべきである。

# 項目５０　必要な場合、防御的にコピーする

- Dateクラスのような可変なオブジェクトがパラメータとして入ってきた場合、防御的にコピーすることが重要である。

# 項目５１　メソッドのシグニチャを注意深く設計する

- メソッド名を注意深く選ぶ。長いメソッド名は避ける。
- 便利なメソッドを提供しすぎない。個々のメソッドは「自分の役割を果たす」べきで、メソッドが多いと、テスト、保守を困難にする。
- 長いパラメータのリストは避ける。４個以下を目標にする。同一の型のパラメータが何個も続くのは有害である。過度に長いパラメータのリストを短くするには、以下の三つの技法がある。
    - メソッドを分割して、各メソッドはパラメータのサブセットだけを必要とするようにする。
    - パラメータの集まりを保持するヘルパークラスを作成する。
    - Builderパターンをオブジェクト生成からメソッド呼び出しに適用する。
- パラメータ型は、クラスよりもインタフェースを選ぶ。パラメータを定義するために適切なインタフェースが存在する場合、そのインタフェースを実装したクラスよりは、そのインタフェースを使う。（例：HashMap→Map）
- booleanの意味がメソッド名から明らかでなければ、booleanよりも二つの要素を持つenum型を使う。 

# 項目５２　オーバーロードを注意して使う

- オーバーロードで、どのメソッドが呼び出されるかの選択は、コンパイル時に行われる。`Collection`インスタンスで、中身が`ArrayList`の場合には、`ArrayList`を引数メソッドをうまく呼び出すことができない。
- 安全で保守的な方針は、同じパラメータ数の二つのオーバーロードされたメソッドを提供しない。オーバーロードする代わりに、異なる名前のメソッド名にする。

# 項目５３　可変長引数を注意して使う

- 可変長引数メソッドで、1つ以上の引数が必要な時、実行時にしかチェックできないのが問題。
- 必須パラメータの後に、可変長引数を置く。

# 項目５４　nullではなく、空コレクションか空配列を返す

- 空コレクションや空配列の代わりに、nullを返さない。
- nullだとAPIの使用が困難になり、パフォーマンスの利点もない。

# 項目５５　オプショナルを注意して返す

- 値を持たないオブジェクトの表現方法は3つ。
    - null（NullPointerExceptionの危険）
    - Exception（コストが高い)
    - Optional（java8から）
- `Optional.empty()`で空。`Optional.of(value)`でvalueを含むOptional。
- `Optional.ofNullable(value)`は、valueがnullかどうかにより、上記のいずれかを判断して返す。
- Optionalを返すメソッドでは、nullを返してはならない。
- ボクシングされた基本データ型を含むオプショナルを返すのは、ボクシングを2レベル行うので高くつく。そのために、基本データ型の`OptionalInt`、`OptionalLong`、`OptionalDouble`が用意されている。
- 戻り値以外でOptionalを使うのはまれであるべき。

# 項目５６　すべての公開API要素に対してドキュメントコメントを書く

- すべての公開されているクラス、インタフェース、コンストラクタ、メソッド、フィールド宣言の前に、ドキュメントコメントを書かなければならない。
- メソッドに関するドキュメントコメントは、メソッドとそのクライアント間の契約を簡潔に記述すべき。
- メソッドのすべての事前条件、事後条件、副作用を列挙する。
- `@param`、`@return`、`@throws`タグを書かれるべき。
- ドキュメントコメントはHTMLに変換されるので、HTMLタグが使える。
- 継承のためにクラスを設計するときは、自己利用パターンを文書化しなくてはならない。そのために、`@implSpec`を使う。
- HTMLのメタ文字（`<``>``&`など）を使うときは、`@literal`タグで囲む。例）`{@literal |r| < 1}`
初心者がwebpackを使うための調べたことまとめ

# 参考サイト
▼フロントエンドエンジニア必見！JavaScript開発現場で人気の「Webpack」とは？
https://ferret-plus.com/6337

▼知っておいて損はなし！新人Webデザイナーのための「npm」入門
https://ferret-plus.com/6104

そのほか、本文中でも参考にしたその都度記事を紹介しています。

# Webpackとは
Webpackは、複数のファイルを１つのメインファイルにまとめてくれるだけではなく、SassやLESSなどの CSSプリプロセッサー言語をコンパイルしてくれる。

ターミナルに以下のコマンドを入力することでインストールできる。

```:ターミナル
npm install -g webpack
```

この時の、`-g` はオプションで、これをつけることでMac OS X環境では`/usr/local/lib/node_modules`にライブラリがインストールされる。
同時に同ディレクトリにパスが通るようになり、どこからでもコマンドが呼び出せる。（グローバルインストールという）

▼参考：npm installコマンドの -gオプションについて
http://d.hatena.ne.jp/replication/20110607/1307458180

# npm
「Node Package Manager」の略。Node.jsのパッケージを管理するためのシステム

# Node.js
サーバーサイドで動くJavaScript。
こちらからDL可能。

▼Nodejs.org
https://nodejs.org/en/

DLしたものを解凍すると、インストール可能。
インストール後、ターミナルで下記のコマンドを入力することで、インストールされているか、およびバージョンを確認することができる。

```:ターミナル
node -v #Node.jsのバージョンを確認
npm -v #npmのバージョン確認
```

# 覚えておきたい二つのコマンド
## npm init
「このディレクトリをnpmの管理下に置きます」という命令。

```:ターミナル
cd ~/npmの管理下に置きたいフォルダへのパス
npm init
```

その結果、出てきた内容がこちら。

```:ターミナル
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.


See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.

# ここから先は１行ずつ現れて入力を求められます。

package name: <プロジェクトのパッケージ名>
version: <バージョンコード(x.y.z形式)>
description: <パッケージの説明>
entry point: <ライブラリとして呼び出されるときのエントリーポイント>
test command: <テストコマンド>
git repository:  <gitリポジトリのURL>
keywords: <関連ワード>
author: <作者名>
license: <ライセンス(MIT, GPLなど)>
```
上記の入力が終わると、「package.json」がアプリやプロジェクトのディレクトリのトップに設けられます。

▼参考：npmのpackage.jsonと依存関係を理解しよう！
https://bagelee.com/programming/npm-package-json-dependencies/

## npm install
「npm install」は「このフォルダに次のパッケージをnpmリポジトリからダウンロードし、インストールしなさい」という命令。

例えば、下記はjqueryをインストールするための命令。

```:ターミナル
npm install jquery --save
```

上記で、ダウンロードとインストールを同時にやってくれます。
また、--saveオプションをつけることで、「package.json」内にどのパッケージを取ってきたのかを記述することができる。

package.jsに加わった記述がこちら。

```json:package.json
"dependencies": {
    "jquery": {
      "version": "3.4.1",
      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz",
      "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw=="
    }
  }
```

▼参考：webpack 4 入門
https://qiita.com/soarflat/items/28bf799f7e0335b68186
Vueでアイテムをドラッグ＆ドロップで並べ替えしたいとき

## インストール
```
npm i -s vuedraggable
```

#ソース
- draggableで囲んだアイテムがドラッグ＆ドロップの対象になる
- groupを指定すると別々に用意したdraggable内のアイテムが入れ替え可能になる

```vuejs:DraggAndDrop.vue
<template>
  <div id="app">
    <div class="box">
      <draggable v-model="array01" group="group1">
        <div v-for="element in array01" :key="element.id" class="item">
            {{element.name}}
        </div>
      </draggable>
    </div>
    <div class="box">
      <draggable v-model="array02" group="group1">
        <div v-for="element in array02" :key="element.id" class="item">
            {{element.name}}
        </div>
      </draggable>
    </div>
    <div class="box">
      <draggable v-model="array03">
        <div v-for="element in array03" :key="element.id" class="item">
            {{element.name}}
        </div>
      </draggable>
    </div>
  </div>
</template>

<script>
import draggable from 'vuedraggable'

export default {
  name: 'DraggAndDrop',
  components: {
      draggable,
  },
  data: () => {
    return {
      array01: [
        { id:'id01', name:'ジャガイモ' },
        { id:'id02', name:'玉ねぎ' },
        { id:'id03', name:'人参' },
      ],
      array02: [
        { id:'id04', name:'牛肉' },
        { id:'id05', name:'豚肉' },
      ],
      array03: [
        { id:'id06', name:'肉まん' },
        { id:'id07', name:'餃子' },
      ]
    }
  }
}
</script>

<style>
.box {
  padding: 0.5em 1em;
  margin: 2em 0;
  background: #FFF;
  border: solid 3px #6091d3;
  border-radius: 10px;
}
.item {
  padding: 10px;
  border: solid #ddd 1px;
  border-radius: 10px;
}
</style>
```

## 実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361770/6dcd739f-b1d6-4713-a60d-ce1af0cb28dc.png)

### ドラッグ＆ドロップ操作後の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361770/8ea3bed5-ee5f-df42-6465-c6c085516b21.png)
「コメントは書くな」

同僚だったロシア人のMはとにかくすごいエンジニアで、給料について社長ともめていたかと思えば、スーパーデプロイシステムを一人で作り上げていたり、Python推しの会社の中で、各所を説き伏せてTypeScript on node.jsの導入を進めたりしていた。
皮肉屋で、だれかれかまわず議論をふっかけていたが、とにかく仕事が速くて品質がよいので絶大に信頼されていた。

私は開発者としてMから様々な教えを授けられた。当時私はPHPerあがりのひよっこで、日々ダメコードを生産していた。

ある日Mにコードレビューを依頼すると、こんなことを言われた。
**「堀さん！ソースコードにコメントを書いてはいけない！」**

```scala
// connect to the database named "mysql" on the localhost
val driver = "com.mysql.jdbc.Driver"
val url = "jdbc:mysql://localhost/mysql"
val username = "root"
val password = "root"

// initialize
var connection: Connection = null

try {
  // make the connection
  Class.forName(driver)
  connection = DriverManager.getConnection(url, username, password)

  // create the statement
  val statement = connection.createStatement()

  // get data from user table
  val resultSet = statement.executeQuery("SELECT host, user FROM user")
  while (resultSet.next()) {
    val host = resultSet.getString("host")
    val user = resultSet.getString("user")
    // print host and user
    println("host, user = " + host + ", " + user)
  }
} catch {
  case e => e.printStackTrace
}
connection.close()
```
*（ソースコードはイメージです）*

教科書なんかを読むと、**ソースコードには適宜コメントを書いて読者に動作を伝えましょう**、と書いてあるものである。

よくよく話を聞いてみると、こういうことだった。

* きちんと書かれたコードは、それ自体が動作を明確に表す
* その場合、コメントは読者にとってノイズにしかならないし、ソースコードを太らせる
* だから、ソースコードがドキュメントの役割を果たすような、きれいなコードを書かなければならない
* 止むに止まれぬ理由で汚いコードを書いてしまった時に、意図を伝える最後の手段がコメントである

ひよっこの私は納得するしかなかった。

同様の教えに「ドキュメントを書くな」というものがあるのだが、それはまた別のお話。

---
この記事を少しでも建設的な結果に導きたいので、いくつか追記します。

* まず、あらゆるコード内コメントが悪だと言っているのではない。それはMも思ってないし、私も思っていない。
* この記事はちゃんとした技術的記事というより、軽いプログラミングエッセイを書くつもりで書かれた。
    * そのため、このような扇情的なタイトルになった。この点はちょっと申し訳ない
    * でも（当時の私が）ビックリしたので
* サンプルコードは当時私が書いていたようなコードを模したもので、今はこんなコードは書かない

いくつかの反響に対する私の考え:

* 「日本語ネイティブがそこまで達するのは無理」
    * 英語がんばろう。少なくとも英語で命名しているなら、コード内の英語表現は最大限気を遣おう
    * 別アプローチとしては、弊社内のあるプロジェクトでは日本語プログラミングに挑戦している
* 「プロジェクトの規約で無理」
    * 環境を変えよう。それは率先してプロジェクトの意識を変えていくことかもしれないし、プロジェクトを去ることかもしれないが

興味を持った方に:

* [Stop Writing Code Comments](https://blog.usejournal.com/stop-writing-code-comments-28fef5272752)という記事を同僚に教わった。より具体的に、よくないコメント例が列挙されている
* 書籍「リーダブルコード」
    * 特に命名のところは大好き
    * Mも「命名は小さなコメントのようなもの」と言っていた
【React Native】画面が真っ白で起動しない

## 何が起きたか
- metro bundler はエラーを出していない
- 画面は真っ白だ
- エラーがないからどうしたらいいのかわからない・・・。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/bf76bdca-9aaf-b0c2-dbf4-02681806be56.png" width="300"> 


## 解決の糸口
**ホーム画面に戻って、アプリアイコン押下する**

すると、

<img src="https://user-images.githubusercontent.com/10850034/60312354-ff112000-9995-11e9-964e-c7465f2cd350.gif" width="300"> 

発生しているエラーが表示される。
CentOS7 でNginxをインストールする

# CnetOS7にNginxをインストールする

`nginx.repo`に追加する

`nano /etc/yum.repos.d/nginx.repo`コマンドでエディタモードを起動する。
個人的には、初心者は直感的な操作が可能な`nano`を使用するといいでしょう。
もし導入していないのであれば、`yum -y install nano`を先に実行して、先ほどのコマンドを入力するといいかと思います。

```:nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
```

あとは、`yum -y install nginx`とやるだけ...

### おまけ

公式サイトによれば安定版ではない、最新版を使いたい場合は、以下のコマンドを実行すればいい。
`sudo yum-config-manager --enable nginx-mainline`


参考サイト:
[Installation instructions to CentOS][cent2nginx]
CentOSのサポートしているバージョン

| Version | Supported Platforms |
|:--|:--|
| 6.x | x86_64, i386 |
| 7.4+ | x86_64, ppc64le |
| 8.x | x86_64 |

[cent2nginx]:http://nginx.org/en/linux_packages.html#RHEL-CentOS
Laravel5.7でAPIコントローラーをメソッドとしてテストする方法

LaravelでAPIやコントローラーをテストする方法を調べると、大体出てくるのはサーバーを立ち上げてルーティングに対してリクエストを飛ばしてテストする方法です。
今回はコントローラーのメソッドをそのままテストする方法について記述していきます。


# なぜそうしたのか？

簡単に言うとテストが軽くなるからです。
メソッドを一つテストするのにすぎず、サーバーとしての機能を一切使う必要がありません。
もちろんこのテストが通ったからといって、ルーティングなどその他の部分が正しいことを担保することはできません。
しかし一番重要であるコントローラーのメソッドが通ることは担保できます。
個人開発として素早く開発していきたかったので、最小限のコストでクリティカルな部分を担保したかったのでこの方式でテストすることにしました。

# やること

基本的なテストクラスの記述は普通のテストとなんら変わりません。
Laravel(composer)の機能で自動ファイル作成してもらって構いません。

ここでやることは以下です。

- ログインする
- 任意のリクエストを送る
- コントローラーのメソッドを実行する
- 戻ってきたステータスをテストする


# テストコード

今回は`BookController`という本を司るコントローラーに、本の作成依頼をするテストをします。

```php
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Http\Request;

class UserBookControllerTest extends TestCase
{
    use RefreshDatabase;

    protected $user;

    public function setUp()
    {
        parent::setUp();
        $this->user = factory(User::class)->create();
    }

    public function testStoreBook(){
        $this->actingAs($this->user, 'api');

        $request = new Request(['isbn' => '9784063842760']);
        $response = \App::make(BookController::class)->store($request, $this->user);
        $this->assertEquals(201, $response->status());
    }
}
```

まずユーザーをfactoryで作成します。
factoryの説明は[こちら](https://readouble.com/laravel/5.7/ja/database-testing.html#generating-factories)をご覧ください。

このコントローラーへのアクセスはログインが必要なので`$this->actingAs`を使ってログインします。
引数にユーザーを渡し、第二引数に`api`でログインすることを明示します。

次にリクエストを作成します。
`Request`のコンストラクタに連想配列を渡してあげるだけです。

次に`App::make`メソッドを使用してテストしたいコントローラーを指定します。
戻り値にコントローラーが帰ってくるのでテストしたいAPIのメソッドを呼び出します。
今回は`store(Request $request, User $user)`をテストします。

するとレスポンスが帰ってきますので、`status`メソッドを実行すればステータスコードを見ることができます。
もしレスポンスデータもテストしたい場合は`$response->getData()`を実行ればデータが連想配列で帰ってきます。

# モック化

コントローラーをテストするときに、内部で重い処理や外部への問い合わせをしている場合はモック化したいと思います。
Laravelのモック化については記事の範囲外なので、以下の記事を参考にしてください。

[Laravel5.7のServiceコンテナをモック化してする方法](https://nakka-k.hatenablog.com/entry/2019/06/28/102749)

# まとめ

テストが早いと開発の効率もガンガン上がりますよね。
テストは書きたいけど、遅くなるのは嫌だと言う人は、この方法でテストすればある程度テストの実行時間を落とせるかもしれませんね。
良いテスト生活を！
All About ACS: IBM i Access Client Solutions での印刷方法と基本機能の比較

Access for Windows から ACS に移行する時に、印刷への影響を検討することは重要です。
ここでは、基本機能の比較をします。

# 3つの印刷方法

ACS での印刷には3つの方法があります。

## PDT/PDF による印刷

エミュレーターが、プリンターの印刷命令に変換する方法です。印刷する文字のデータはエミュレーターがプリンターに合わせて、Shift_JIS や JIS コード に変換し、プリンターに送ります。
プリンターの印刷命令に変換するため、対応しているプリンターが必要です。

## HPT による印刷
 
HPT(Host Print Transform)の機能で、IBM i 上でプリンターの印刷命令に変換する方法です。
リモート OUTQ や LPR での印刷と同じ変換を使います。印刷する文字のデータはShift_JIS や JIS コード に変換され、プリンターに送信されます。
プリンターの印刷命令に変換するため、対応しているプリンターが必要です。

## JPS による印刷

JPS(Java Print Service) は、Java の印刷機能を使う方法です。
Java と Windows 上のプリンタードライバーの組み合わせで、印刷されます。
Windows 用の プリンタードライバーがあれば、機種を問わずに利用できる印刷方法です。

1.1.7までは、スプールを HPT でテキストにして、そのテキストデータを印刷するだけだったのですが、1.1.8 から、ACS 内でレイアウトして印刷するようになりました。

JPS印刷の詳細は下記に書きました。

[IBM i Access Client Solutions の JPS 印刷](https://qiita.com/6onoda/items/bafd71afa4b2444af5f6)

# 外字の印刷

下記のようになります。

| 方法| 可・不可 | 使われる外字 |
|:-:|:-:|:-:|
|  PDT/PDF | 〇 (1.1.8.4より) | Windows外字から専用イメージファイルを生成  |
|  HTP |  〇 |CGU外字   |
|  JPS |  △ |monospaced で Windows外字 |

PDT/PDF での外字利用に関して RFE が受理され、1.1.8.4 以降 PDT/PDF が印刷できるようになりました。ACS の acslaunch_win-XX.exe で 外字イメージファイルを生成し、所定のフォルダーに置くという手順が必要です。詳しくは、「[IBM i Access Client Solutions 1.1.8.4 で PDTモード印刷で外字を印刷する](https://qiita.com/6onoda/items/33ddf707172443cba527)」に記載しました。

HPT の場合、CGU で登録されている文字をイメージで送ることで印刷します。

JPS で印刷する場合は、フォントで monospaced を選択すれば、Windows外字 が使われます。物理フォントを選択すると、印刷されません。これは 5250 と同じです。

# 1399 拡張文字の印刷

ここで言う 1399 拡張文字とは、Unicode 由来で CCSID 1399に追加された、対応する Shift_JIS コードを持たない文字のことです。正式な言い方ではありませんが、とりあえず、こう呼んでおきます。

下記のようになります。

| 方法| 可・不可 | 使われる文字 |
|:-:|:-:|:-:|
|  PDT/PDF | 〇  | ACS 組み込みフォント |
|  HTP |  × |-   |
|  JPS |  〇 |Windowsフォント   |

PDT/PDF は、1.1.8.2 から ACS に組み込まれているフォントのイメージを送ることで、Shift_JIS コードを持たない文字も印刷可能になりました。

[SE70600 - OSP-ACCESS CLIENT SOLUTIONS ADD PDT SUPPORT FOR EXTENDED SHIFT_JIS CHARACTERS](https://www-01.ibm.com/support/docview.wss?uid=nas2SE70600)

HPT は、IBM i 上に1399文字に対応したフォントがないため、印刷できません。

JPS は、Java と プリンタードライバーが、印刷を行います。

# 印刷の再現度

| 方法| 再現度 |
|:-:|:-:|
|  PDT/PDF | 〇  | 
|  HTP | 〇 |
|  JPS |  △ |

PDT/PDF や HPT は、プリンターのコマンドを直接制御しているため、これまでと同等は印刷が可能です。

しかし、JPS 印刷は Java の印刷機能を呼ぶだけで、印刷結果は Java と プリンタードライバーに任せられます。
そのため、以前と同じ印刷結果が得らえないこともあります、

***
2020-05-11 PDTで外字印刷が可能になったことを記載
***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
***
再試行待ちの DelayedJob を手動で再実行する

- 参考: https://stackoverflow.com/questions/3312054/manually-retry-job-in-delayed-job (この記事のコメント内)

### 背景

- `DelayedJob` の `max_attempts` を多めに設定している (デフォルトの25回など)
- 次回のジョブの実行まで長い時間がかかりそうで手動で再実行したい

### やったこと

- `delayed_jobs` テーブルの `attempts` を 0 に変更して、即時実行した

```ruby
Delayed::Job.all.each do |dj|
  dj.run_at = Time.now;
  dj.attempts = 0;
  dj.save!
end
```

### 注意点

- 上のコードではそのとき実行されているジョブのデータを変更してしまうことがある
    - `locked_at`, `last_error` などのカラムを使って対象としたいジョブのみに絞って実行すればよい