OmniAICreator/Qiita-1.07M huggingface dataset:
Objective-CでコードからAutoLayoutを設定する

## 参考
[iOS 9で追加されたNSLayoutAnchor使うと簡単にわかりやすく間違えずにNSLayoutConstraint（制約）が作れます【Auto Layout】](https://qiita.com/yucovin/items/4bebcc7a8b1088b374c9)

## 目的
HowTo目的なので、細かな仕様は参考記事を見てください。
参考記事の言語はswiftですが、Objective-Cでもほぼ同じです。
その内のほぼ同じ **でない** 部分をぱっとみてコーディングできるように備忘録です。

## サンプル

```Objective-C:Objective-C
// 今回生成し制約を設定したいview
// 制約でサイズを決めるのでCGRectZeroでOK
UILabel* label = [[UILabel alloc] initWithFrame:CGRectZero];
// AutoResizingはNOにする
[label setTranslatesAutoresizingMaskIntoConstraints:NO];
// viewにaddする
[self.view addSubview:label];

// 上
NSLayoutConstraint* topAnchor = [label.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:0];
// 左
NSLayoutConstraint* leftAnchor = [label.leftAnchor constraintEqualToAnchor:self.view.leftAnchor constant:0];
// 右
NSLayoutConstraint* rightAnchor = [label.rightAnchor constraintEqualToAnchor:self.view.rightAnchor constant:0];
// 高さ
NSLayoutConstraint* heightAnchor = [label.heightAnchor constraintEqualToConstant:60];
[self.view addConstraint:topAnchor];
[self.view addConstraint:leftAnchor];
[self.view addConstraint:rightAnchor];
[self.view addConstraint:heightAnchor];
```

## 気をつけるところ
### 基本的な考え方
1. 上
2. 左
3. 幅
4. 右
5. 高さ
6. 下
の順で組み立てていくと理解しやすい。

### translatesAutoresizingMaskIntoConstraintsはNOにする

これをしないと勝手にリサイズされて意図したものにならない。

### 制約をaddConstraintするタイミングと場所
* `addConstraint`するのは親Viewに`addSubViews`した後に行う
* `addConstraint`するのは今回生成し制約を設定したいviewに行うのではなく、 **`addSubViews`した親Viewに対して** 行う

## 所感
SwiftだとisActive=trueだけで済んでいたので`addConstraint`の曲がった感じが気持ち悪い。
まだ親viewに対して`addConstraint`するあたりも同様。
更に言うならleftAnchor→leadingAnchor、rightAnchor→trailingAnchorなどの命名も日本人には馴染みがなく手間がかかって面倒。
【C#】Null合体演算子でシングルトンパターンを簡潔に書く

イマイチNull合体演算子を使うケースの
例として良いものが思い浮かばなかったけど
これだと有用性が分かりやすいと思った例があったので備忘の為に記載。

```C#:演算子使用前
class HogeManager
{
    private static HogeManager _instance;

    /// <summary>
    /// インスタンス取得
    /// </summary>
    /// <returns></returns>
    public static HogeManager GetInstance()
    {
        if (null == _instance)
        {
            // Nullの場合だけインスタンス生成
            _instance = new HogeManager();
        }
        return _instance;
    }
}
```

```C#:演算子使用後
class HogeManager
{
    private static HogeManager _instance;

    /// <summary>
    /// インスタンス取得
    /// </summary>
    /// <returns></returns>
    public static HogeManager GetInstance()
    {
        return _instance ?? (_instance = new HogeManager());
    }
}
```

大分スッキリします。
OneNote for Mac ローカルでのファイル保存場所

OneNote for Mac ローカルでのキャッシュファイル保存場所のメモ：

~/Library/Containers/com.microsoft.onenote.mac/Data/Library/Application Support/Microsoft User Data/OneNote/

2019年9月時点では、上記フォルダ内の「15.0」という名前のフォルダの内容をバックアップして元に戻せば、バックアップした内容を復元してOneNoteで表示できます。（ただし、この方法で復元した内容をオンラインで同期することはできないようです）
Webサイトをアプリ化して審査に出したらAppleStoreに却下された

##やろうとしたこと
私はWordPressで作成したブログを運営しており、**アプリとしてブログを公開**できないかと思い、SwiftでUIWebViewを使用した簡単なアプリをAppleStoreに審査を出してみました。
却下される前提で、修繕を繰り返していこうと考えていたのですが、リジェクトメールの内容が明らかに**修繕しても無理そうな内容**だったので公開します。
##メール本文
Guideline 4.2 - Design - Minimum Functionality


Your app provides a limited user experience as it is not sufficiently different from a mobile browsing experience. As such, the experience it provides is similar to the general experience of using Safari. Including iOS features such as push notifications, Core Location, and sharing do not provide a robust enough experience to be appropriate for the App Store.

Next Steps

To resolve this issue, please revise your app to provide a more robust user experience by including additional native iOS functionality.



If you cannot - or choose not to - revise your app to be in compliance with the App Store Review Guidelines, you may wish to build an HTML5 web app instead. You can distribute web apps directly on your web site; the App Store does not accept or distribute web apps.

For more information about creating web apps, refer to the Configuring Web Applications section of the Safari Web Content Guide.

For a description of the HTML elements and attributes you can use in Safari on iPhone, check out Safari HTML Reference: Introduction.
##メール内容(翻訳)
ガイドライン4.2-設計-最小機能


アプリは、モバイルブラウジングエクスペリエンスと十分に異なるわけではないため、ユーザーエクスペリエンスが制限されます。そのため、提供されるエクスペリエンスは、Safariを使用する一般的なエクスペリエンスに似ています。**プッシュ通知、コアロケーション、共有などのiOS機能を含めても、App Storeに適した堅牢なエクスペリエンスは提供されません。**

次のステップ

この問題を解決するには、アプリを修正して、追加の**ネイティブiOS機能**を含めて、より堅牢なユーザーエクスペリエンスを提供してください。



アプリをApp Storeレビューガイドラインに準拠するように修正できない場合、または修正しない場合は、代わりに**HTML5 Webアプリを構築することをお勧めします。** WebアプリをWebサイトに直接配布できます。 App StoreはWebアプリを受け入れたり配布したりしません。

Webアプリの作成の詳細については、Safari Webコンテンツガイドの「Webアプリケーションの構成」セクションを参照してください。

iPhoneのSafariで使用できるHTML要素と属性の説明については、Safari HTMLリファレンス：はじめにをご覧ください。
##結論
**ブログを単純にアプリで公開しようという目的では、いくら小細工(プッシュ通知など)をしても審査には通らない**よという内容でした。:frowning2:
審査を通したいなら**アプリ固有のサービスを提供する**しかない様です。
終いにはHTMLで公開したほうがいいよと言われてしまいました。(笑)
PrismのBindableBase.SetPropertyとNullable型と.net nativeコンパイルとが組み合わさると発生する問題への対処方法


## 概要


例えばBindableBaseを継承したクラスに以下のような変更通知対応したNullableなプロパティがあった時に、

```csharp
private TimeSpan? _TimeshiftPosition;
public TimeSpan? TimeshiftPosition
{
    get { return _TimeshiftPosition; }
    set { SetProperty(ref _TimeshiftPosition, value); }
}
```

リリースビルド（Native Tool chainコンパイルを有効に）して動かすと、setter呼び出し時に

```
ハンドルされない例外が 0x0A7E9F08 (SharedLibrary.dll) で発生しました(NicoPlayerHohoema.exe 内): 0x00001007。
```

という例外が発生してアプリがクラッシュします。

## 対処方法


Xamarin.Forms UWP app failing at run time with .net native tool chain but works otherwise
[https://stackoverflow.com/questions/55867384/xamarin-forms-uwp-app-failing-at-run-time-with-net-native-tool-chain-but-works](https://stackoverflow.com/questions/55867384/xamarin-forms-uwp-app-failing-at-run-time-with-net-native-tool-chain-but-works)

こちらのStackoverflowの回答によると

> So this turned out to be an issue with Prism (7.0.0.396) and the .net native. It looks like binding properties with a nullable type (int? in this case) using BindableBase.SetProperty fail when compiled with the .net native tool chain. The following appears to fix this:

つまり .net native と Prism における問題であり、Nullable型に対して`BindableBase.SetProperty`を通じてプロパティ変更通知を行おうとすると、.net native tool chain でコンパイルした時に問題が発生するということのようです。

問題を回避するには以下のクラスをBindableBaseと差し替えて利用します。

```csharp
public class BindableBaseWithFix : BindableBase
{
    protected virtual bool SetProperty<T>(ref T? storage, T? value, [CallerMemberName] string propertyName = null)
        where T : struct
    {
        if (EqualityComparer<T?>.Default.Equals(storage, value))
            return false;
        storage = value;
        RaisePropertyChanged(propertyName);
        return true;
    }
} 
```

## 試行環境

* C# 7.3
* Prism 7.2.0
* UWP 
  * ターゲットバージョン version 1803 （10.0; ビルド 17134）
  * 最小バージョン Faill Creators Update （10.0; ビルド 16299）
GoDaddyを使用しているサイトでサブドメインを作る方法

# レンタルサーバーGoDaddyを使用しているサイトからサブドメインを取得する方法について

自分の備忘録用に。

GoDaddyにログイン
Web HostingのManageをクリック。
<img width="1438" alt="スクリーンショット 2019-09-02 21.51.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491398/c3daaaba-da77-032b-66c8-0f6b8c7cf14d.png">

cPanel Adminをクリック
<img width="1438" alt="スクリーンショット 2019-09-02 21.55.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491398/dcdab334-91a3-a1b2-f499-398e8c8a75f2.png">

Subdomainsをクリック
<img width="950" alt="スクリーンショット 2019-09-03 9.04.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491398/a7a90b51-6c54-466e-ac3e-1625dd3af4e1.png">

Subdomain欄に付けたいドメイン名を記載
<img width="950" alt="スクリーンショット 2019-09-03 9.03.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491398/f34df74d-4161-7871-2c43-fa890d49b11f.png">


cPanelのホームに戻り、File Managerをクリック
<img width="1086" alt="スクリーンショット 2019-09-02 21.55.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491398/a0c7de44-0318-f152-27bf-8bdb849dd107.png">

public_htmlに新規フォルダを作成する。フォルダ名はサブドメイン名。
<img width="815" alt="スクリーンショット 2019-09-02 21.59.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491398/ff9618a8-93cf-52d8-67d9-3171c257489b.png">

htmlファイル、cssファイルなど必要なファイルが全て入っているフォルダを圧縮し、先ほど作成したフォルダの中にアップロードする。htmlファイル名は"index.html"でないとエラーになるので注意。違う名前でアップロードした場合は後から"Rename"で修正可能。
<img width="1436" alt="スクリーンショット 2019-09-02 22.51.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491398/c72cebf0-46f0-98d7-88d6-1181f5949ffb.png">
<img width="1436" alt="スクリーンショット 2019-09-02 22.57.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491398/be461bd6-6b7e-92b3-6ee9-c187f0560247.png">

アップロードされたファイルzipファイルからファイルを取り出す(Extract)。
<img width="950" alt="スクリーンショット 2019-09-02 23.01.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491398/16d4da62-d01b-0820-97ea-de45bac9d4b0.png">

zipファイル,"_MACOSX"ファイルは不要なので削除。
<img width="949" alt="スクリーンショット 2019-09-02 23.05.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491398/9ef9a471-fe24-71d3-9791-68fb03437f67.png">


残ったファイル(アップロードしたファイル)の中の個々のファイルをファイルの外へ移動。空になったファイルは削除する。
<img width="950" alt="スクリーンショット 2019-09-02 23.10.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491398/f5d2d157-51d8-ca43-e90d-414666135d32.png">

この状態まできたら、新しいウィンドウにサブドメイン名を入力すると今回作成したサイトを確認できる。
<img width="950" alt="スクリーンショット 2019-09-03 10.19.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491398/aa8455e0-f15a-d0ce-5c25-82b297752020.png">
C#/.NET Frameworkで圧縮を同期的(リアルタイム)に行う方法

## はじめに

一般的な圧縮ストリームは、Close() メソッドか呼ばれるまでバッファリングしてしまって、リアルタイムな相互通信が必要な場合などには使えない。

![compress0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182822/fd2532a2-08ab-8bf8-c0f6-b4865c1d0b4f.png)

[zebedee](http://www.winton.org.uk/zebedee/) などの通信を圧縮してくれるようなツールの互換プログラムは作りにくいだろう。

[Javaの場合、SYNC_FLUSHモードが JDK7 から提供されているので](https://docs.oracle.com/javase/jp/8/docs/api/java/util/zip/DeflaterOutputStream.html#DeflaterOutputStream-java.io.OutputStream-java.util.zip.Deflater-int-boolean-)、それを使えばいいが、.NET Framework の GZipStreamなどには提供されていない。

しかし、[zlib.NET.dll](http://www.componentace.com/zlib_.NET.htm) にはSYNC_FLUSHモードが実装されてるので、それを使えばいいと思う。

## バージョン

基本的に ver1.04 の話。

## 使い方(基本)

zlib.NET の demo フォルダを見ればわかると思うけど、一応メモ

zlib.ZOutputStream クラスも zlib.ZInputStream クラスもペースとなるストリームだけの一引数のコンストラクタの場合は、**解凍**
ペースとなるストリームと、圧縮レベルの二引数のコンストラクタの場合は、**圧縮**

後は、zlib.ZOutputStream#FlushMode に zlib.zlibConst.Z_SYNC_FLUSH を指定するだけ。

## 使い方(zlib.ZInputStream の落とし穴)

これ、なぜか[System.IO.BinaryReader](https://docs.microsoft.com/ja-jp/dotnet/api/system.io.binaryreader?view=netframework-4.8) クラスを継承している。
にもかかわらず、BinaryReader クラスの各種メソッドは実装していない！！(ソースコードを見るとわかる)

唯一の実装が Read() と なぜか小文字始まりの read(byte[] b, int off, int len) だ。

まぁ、zlib.ZInputStream クラスをStreamとして包むラッパークラスを自作して、それの Read() を read() に繋げればいいだけの話なんだけど、私は BinaryReader として(BinaryReader.ReadByte()を)そのまま使っていて "解凍しねーな" と数日悩んだので、メモとして残しておくよ。

つまり、zlib.ZInputStream はBinaryReader を継承しているけど、Reader としては不十分なので、各自 Stream のラッパとして包み込んであげてから 再度Reader に包み込んであげればいいと思う。

## BouncyCastle/C# でもできた

[BouncyCastle/C#](http://www.bouncycastle.org/csharp/) でもできた。

BouncyCastle/C# の Org.BouncyCastle.Utilities.Zlib.ZOutputStreamクラス/Org.BouncyCastle.Utilities.Zlib.ZInputStreamクラスの FlushMode プロパティがそれ。
このプロパティに Org.BouncyCastle.Utilities.Zlib.JZlib の Static 値を与えればいいと思う。
Org.BouncyCastle.Utilities.Zlib.JZlib.Z_SYNC_FLUSH とかを与えればいいと思う。

## Javaでの捕捉

上の方に「[Javaの場合、SYNC_FLUSHモードが JDK7 から提供されているので](https://docs.oracle.com/javase/jp/8/docs/api/java/util/zip/DeflaterOutputStream.html#DeflaterOutputStream-java.io.OutputStream-java.util.zip.Deflater-int-boolean-)」と書いているが、Javaの場合は、 
DeflaterOutputStream などだけではなく、java.util.zip.GZIPOutputStream にも、Sync_Flush (同期的圧縮)が付いている。(コンストラクタの第二引数に注目)

## 以上
VagrantをProxy経由で利用する

# はじめに
Proxy経由でインターネットに接続している環境で、Vagrantを利用するとBoxイメージのダウンロードすらできません。
いくつかProxy経由でVagrantを利用する記事を見かけましたが、誤った設定も多いので、自分のメモとしてまとめます。

# イメージダウンロード用の設定
Proxy経由でBoxイメージをダウンロードするには、環境変数 HTTP_PROXY, HTTPS_PROXY を設定します。

```
> set http_proxy=(ホスト名):(ポート番号)
> set https_proxy=(ホスト名):(ポート番号)
```

たまに、以下のようにホスト名にプロトコルも記載している記述を見ますが、これだと正常に動作しません。

```
// 誤った環境変数の設定
> set http_proxy=http://(ホスト名):(ポート番号)
> set https_proxy=https://(ホスト名):(ポート番号)
```

この環境変数の設定により、`vagrant box add`コマンドでBoxイメージがダウンロードできるようになります。

# vagrant up 時のProxy設定
`vagrant up`により、vagrantfileの内容で仮想環境を構築していきますが、その際のProxy設定はVagrantのPlugin(vagrant-proxyconf)が必要になります。

### vagrant-proxyconf のインストール
以下のコマンドでPluginをインストールします。

```
> vagrant plugin install vagrant-proxyconf
```

### vagrantfile の更新
Pluginのインストールができたら、vagrantfileにProxyの記述を追記します。

```lang:vagrantfile
if Vagrant.has_plugin?("vagrant-proxyconf")
  config.proxy.http     = "http://(ホスト名):(ポート番号)"
  config.proxy.https    = "http://(ホスト名):(ポート番号)"
  config.proxy.no_proxy = "localhost,127.0.0.1"
end
```
`config.proxy.https`に設定している値も`http://～`となっていますが、問題無いようです。

# vagrant up
ここまで設定できたら、`vagrant up`で仮想環境立ち上げましょう。
起動時に以下のようなメッセージが表示されると思います。

```
==> default: Configuring proxy environment variables...
==> default: Configuring proxy for Yum...
```
上記メッセージの通り、起動したゲストOSの環境変数とYum設定にProxy情報が反映されています。

```lang:/etc/yum.conf
# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d
proxy=http://(ホスト名):(ポート番号) # Proxy設定が追記されている
proxy_username=
proxy_password=
```

```lang:環境変数
http_proxy=http://(ホスト名):(ポート番号)
https_proxy=http://(ホスト名):(ポート番号)
HTTP_PROXY=http://(ホスト名):(ポート番号)
HTTPS_PROXY=http://(ホスト名):(ポート番号)
```
これにより、yum などもProxy経由でダウンロードが行えます。

# Docker
DockerでBuildやpullする場合、以下の設定をdocker.serviceに追記する。

```lang:docker.service
[Service]
Environment="HTTP_PROXY=http://(ホスト名):(ポート番号)/" "HTTPS_PROXY=http://(ホスト名):(ポート番号)/"
```

docker.serviceファイルは以下のどこかにあると思います。

```
/etc/systemd/system/docker.service
/lib/systemd/system/docker.service
/etc/systemd/system/docker.service.d配下
```

※HTTPS_PROXYに設定する値は「http」で設定してください。「https」で設定して`docker build`したら、以下のようなエラーが表示されました。

```
Get https://registry-1.docker.io/v2/: proxyconnect tcp: tls: first record does not look like a TLS handshake
```

# 参考
https://weblabo.oscasierra.net/windows-vargent-proxy/
https://weblabo.oscasierra.net/vagrant-proxyconf/
https://protocol.nekono.tokyo/2018/09/10/%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E7%92%B0%E5%A2%83%E3%81%A7vagrant%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B/
【Android】月曜日の日付を取得する

```
//今日の日付を取得する
//例：今日（9/3(tue)→9/2(mon)を取得する）

//localDate使用不可のため、カレンダーを使用している
Date today = new Date();
Calendar day = Calendar.getInstance();

//月曜日を取得するメソッド
day.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
today = day.getTime();

//String型に整形する（必要に応じて）
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String strToday = sdf.format(today);
```
印刷調整の罠

多色刷り印刷の冊子を作成するにあたって、いくつもの罠があり、１日で印刷できないことが何回かあった。

#印刷機

Canon LBP6230
Canon LBP8720
Canon LBP843C

の３種類

#PC
1. Mac Book Pro/macOS 10.13.x
2. Mac mini/mscOS 10.12.x
3. NEC Versa pro/Windows 10 pro
4. Dell/ Windows 10 personal

の４種類

# Word
Microsoft Word for Mac 15.29
Microsoft Word for Mac xx
Office 2019 Word 
Microsoft Office standard 2016 Word

#Acrobat
Acrobat DC Reader
Acrobat Acrobat Pro DC

#罠1
機材2でプリンタ３に接続しても出力しない。
ドライバソフトのダウンロード、
OSの再起動
その他のソフトウェアの更新
などを繰り返しても接続しない。

実験時間 24時間

#罠2
WindowsとMacの間でデータのやりとりしたり、
同じOSでもWordの違う版でデータのやりとりをすると書式がずれる。

調整時間　１文書あたり１時間から１２時間

#罠3
WordとPDFからのプリンタの出力でずれがちがう。

どちらかで印刷すればいいときは、それで済む。
PDFを渡した相手が印刷しなくてはいけないときには調整が必要な場合がある。

#罠4
WordからPDF出力すると、書式がずれる。

今回の案件だと作業を始めて６時間。まだ終わらない。
（この記事を書いている時間を含めて）

#罠5
WordからPDF出力しなくなった。

今日のAcrobat　Error：有効期限が切れているか、または認証されていません。
https://qiita.com/kaizen_nagoya/items/c2beb3d0ed6c508d0fe4

#罠6

WordとPDFからの印刷機への出力で、
紙の大きさ、両面印刷（機材１と２はできない）、多色刷り（機材１と２はできない）、拡大縮小、冊子、右とじ左とじなどが、機材の種類、ソフトの違いなどで設定方法が違い、わけがわからなくなっている。

２回に１回は、最初に印刷間違えて１枚は無駄にしている。
地球環境さんごめんなさい。


#参考資料(reference)

MS Wordで色調整
https://qiita.com/kaizen_nagoya/items/fc0ca5cde8a59a97d472

プログラマが知っているとよい色使い(安全色)とカラーユニバーサルデザイン
https://qiita.com/kaizen_nagoya/items/cb7eb3199b0b98904a35


#文書履歴(document history)
ver. 0.01 初稿 20190903 午前
ver. 0.02 加筆 20190903 午後
The keyword 'yield' is reserved ってなによ

# 概要

> *'yield'は予約語です。*

Webアプリのフロント開発をしてたら謎のエラーメッセージと遭遇したので、メモ。

# 開発環境（フロントエンド）
TypeScript
Vue

# ソースコード

```typescript
service = new SampleService();

search(){
  let sample = await this.service.findall();
  console.log(this.sample);
}
```

もうお気づきでしょうが･･･await文を使用しているのに、searchメソッドにはasyncがついてません。

これが原因です。

# yield？
yieldはジェネレータ関数の一時停止や再開を行う構文だそうで、JavaScriptにおける非同期処理に密接に関わっている様子。
asyncつけないとawaitが機能しないことをJavaScriptでは「The keyword 'yield' is reserved.」と言うのか･･･

# 修正コード

```typescript
service = new SampleService();

async search(){ // 修正点
  let sample = await this.service.findall();
  console.log(this.sample);
}
```

# 参考文献
http://codereform.com/blog/post/es6-generators-and-asyncawait-in-typescript/
Python3 indexを活用したfor文と同時平行ループ

###for文でindexを取得する
####enumerateを使う
pythonのfor文でindexを取得するときはrangeを使うよりもenumerateを使う方が最適

```python
instruments = ["ピアノ","ギター","しゃくはち"]

for i,c in enumerate(instruments):
    print('{0}は{1}'.format(i,c)) 
```

変数iにはインデックスが、変数cにはinstrumentsの要素がそれぞれ格納されていく。

実行結果は以下のようになる。

```
0はピアノ
1はギター
2はしゃくはち
```

###2つのリストを同時にループさせる

####zip()関数を使う
2つのリストを同時にループさせるときはzip()関数を使うのが最適

```python
instruments = ["ピアノ","ギター","しゃくはち"]
players = ["yoshiki","gackt","大泉洋"]

for i,p in zip(instruments,players):
    print('{0}は{1}'.format(i,p)) 
```

変数iにはinstrumentsの要素が、変数pにはplayersの要素がそれぞれ格納されていく。

実行結果は以下のようになる

```
ピアノはyoshiki
ギターはgackt
しゃくはちは大泉洋
```

はい、よいですネ

###参考
https://programming-study.com/technology/python-for-index/
WebViewでページに戻って欲しくない時の対応

# はじめまして
はじめまして、Blueです。
はじめての投稿です。
温かい目で見てくれると幸いです。

# はじめに
Androidアプリには、Webサイトを表示することができるWebViewというものがあります。
goback()、goForward()を使用することで、ページを戻ったり、進んだりすることができます。
その際、データを送信等のページに戻って欲しくない場合に閲覧履歴を削除する方法を紹介いたします。

# 方法
[WebView](https://developer.android.com/reference/android/webkit/WebView)のPublic methodsを見てみると、clearHistory()といったものがあります。
これを使用することで、戻る/進む履歴をクリアすることができます！

履歴の削除を特定のページの時に行いたい場合、次の手順で実装することができます。
1.[copyBackForwardList()](https://developer.android.com/reference/android/webkit/WebBackForwardList.html)で戻る/進むリストを取得
2.currentIndexで現在の履歴アイテムのインデックスを取得
3.getItemAtIndex()で指定したページをアイテム(URL)を取得
4.取得したページがHogeページなら履歴を削除

試しに実装して見ました。

```php
//　読み込みが始まった時
override fun onPageStarted(view: WebView?, url: String, favicon: Bitmap?) {

       // 戻る/進むリストを取得
       val backForwardList = WebView.copyBackForwardList()

       // 現在のページのURLを取得
       val currentIndex = backForwardList.currentIndex

       // 1つ前のページのURLを取得
       val previousPageUrl = WebView.copyBackForwardList().getItemAtIndex(currentIndex - 1).url

       // 1つ前のページのURLがhogeページなら履歴を削除
       if (previousPageUrl == hogePageUrl) {
           WebView.clearHistory()
       }
}
```

# 最後に
文章を書くことが苦手でわかりづらい文章になってしまうかもしれませんが、頑張って投稿していくので、よろしくお願いします。
【android】端末の設定言語を取得する方法

```
Locale locale = Locale.getDefault();
ーーーーーーー
出力例：Log.d("log",String.valueOf(locale));
英語：en
日本語：ja
韓国語：ko
中国語：zh
```  
  
```
Locale locale = Locale.getDefault();
String language = locale.getLanguage();
ーーーーーーー
出力例：Log.d("log",language);
英語：多数(usとか)
日本語：JP
韓国語：KO
中国語：多数(twとか)
```  
   
```
Locale locale = Locale.ENGLISH.getLanguage();
※ENGLISH/JAPAN/KOREA/CHINA
String language = locale.getLanguage();
ーーーーーーー
出力例：Log.d("log",language);
英語：en
日本語：ja
韓国語：ko
中国語：zh
```
[RSpec]画像がアップロードされたかテストする方法(Capybara)

## はじめに
調べたところによると、Capybaraでは画像アップロードテストに`attach_file([locator], paths, **options)`を使えということだったのですが、なんかうまくいかなかったので別の方法でテストしてみました。

## コード

設定画面等で画像をアップロードすると、マイページに反映されるようなテストを想定します。
Qiitaも同じで、プロフィール設定で画像をアップロードすると右上のプロフィール画像が変わります。これのテストです。

```slim:test.html.slim
input#input-image type="file" name="avatar" accept="image/jpeg"
```

```ruby:test_spec.rb
scenario '画像をアップロードするとマイページに反映される' do
      using_session(@user.name) do
        visit 'path/to/target'
        image_path = File.join(Rails.root, "spec/factories/images/img.jpg")
        page.('#input_image').set(image_path)
        update_profile(page)
        expect(page).to have_selector("img[src$='img.jpg']")
      end
    end
```


`using_session`はCapybaraのこのセッションを使うよってやつですね。ここには入れてませんが、beforeの処理でこのユーザーはログイン済みです。
`visit 'path/to/target'`で好きなページにアクセスします。
`image_path`はそのままですね。画像のパスです。


そして重要なのが`page.('#input_image').set(image_path)`です。`attach_file`ではなく、setを使っています。正直この2つの違いが分かりませんが、setはinputに入力しているだけなので、ファイルだけではなく、textであってもsetの中身が入力されます。

画像を選んだら`update_profile(page)`でプロフィールを更新し、`expect(page).to have_selector("img[src$='img.jpg']")`でsrc属性にimg.jpgを含むimgタグがあるかを確認しています。`$=`とすることでその後に続く文字列を**含む**ものを探します。
今回はimg.jpgをアップロードしたので、同じ名前のjpgファイルを探して、指定したurlにその属性があるかどうかをテストしています。

## 注意点
基本的にテストは使い捨てなので、テスト上で行われたDBの操作、例えばユーザー名の変更などはそのテストが終われば元に戻りますが、今回の場合画像をセットしているため、ユーザーの画像が置いてあるディレクトリの画像が置き換わっています。そのため、1回テストが完了すると、テストによっては初期の画像を読み込めずエラーを起こす場合がありますので、手動で画像を入れ替えるか、テスト用DBを初期化してください。

## まとめ
attach_fileが上手くいかない時は試してみると良いかもしれません。
Git運用関連のメモ

# 前書き
- バージョン管理をCVSからGit（サービスはGitLabCE）に変えたときのメモ。
- 私のスペックは言語能力のみでミドルウェアーやOSの知識はほぼ0。(CPU、メモリ、ディスク？？の状態)
- 個人活動ではないので、色々手助けして実現してます・・・。

# 背景
PleiadesのAll in One からCVSが除外されているにもかかわらず、いまだに利用しているって
どうなの？と疑問に感じてSVN通り越してGitを導入することに。

# Gitをまず知る
## そもそもGitって何？
まず出だしに詰まったのが、GitHubとGitの違い。
この違いを理解するためにまずはGitについて猛勉強。
ここでようやく、**Git = ツール。GitHub = Gitのホスティングサービス**　と理解。

## Gitに慣れる。
#### 自端末にインストール
ひとまずGitに慣れるために、Git for Windows を自端末にインストール。
ローカルでの動きをひたすら試す行為をしました。
#### リモート端末にインストール
ただ自端末だけではリモートとのやり取りがつかめなかったので、社内の開発サーバー(Windows)に
Git for Windowsをインストールして、リモートとのやり取りを試しました。
ここで問題が発生。
なぜか想定している動きにならなかったのです・・・。
詳しくはこちら・・・
[Git cloneの挙動がおかしい](https://ja.stackoverflow.com/questions/44172/git-clone%e3%81%ae%e6%8c%99%e5%8b%95%e3%81%8c%e3%81%8a%e3%81%8b%e3%81%97%e3%81%84/44738#44738)
この問題を経て、リモートで立てるベアリポジトリは**Windowsではダメ**ということが判明しました。

結局Linuxたててホスティングサービスを入れるのが何よりも楽ということになりました。
※尚、Linuxサーバ構築とGitLab導入はベテランの方に頼んでスンナリ出来上がりました。

## 提案書を作る
ひとまず、Git、GitLab導入をすることのメリット・デメリットをまとめた資料を作成。
branch利用のところで心動かせた感じがします。(CVSでbranchの利用していなかったので)
試行という形で実際の案件で活用することにこぎつけました。

## 実際の運用
実際に運用をしてわかった問題です。
ちなみにIDEはeclipseを利用していました
実際に運用しているときは、ある程度２～3週間に一度メンバーであつまり**KPT**でふりかえって
問題の洗い出し、良い操作などの洗い出しをしていきました。
(個人的にふりかえりを学んだ直後なので試した感じですが、これはよかったです！)

#### 大きなバイナリファイルがPUSHできない！
今まで試してきたのは小さなファイルばかりで、実際に大きなバイナリファイルをPUSHしようとした瞬間。なぜかエラーが発生して、PUSHできない状態に・・・。
その時のやりとりがこちら↓
[EGitでjarや画像ファイルをプッシュについて教えてください](https://ja.stackoverflow.com/questions/51143/egit%e3%81%a7jar%e3%82%84%e7%94%bb%e5%83%8f%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e3%83%97%e3%83%83%e3%82%b7%e3%83%a5%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6%e6%95%99%e3%81%88%e3%81%a6%e3%81%8f%e3%81%a0%e3%81%95%e3%81%84)

#### ブランチ戦略問題
開発工程でのブランチ戦略は不要とどこかの記事で見たので、
masterからdevelopブランチを切り、メンバー全員がローカルにブランチも作らずdevelopブランチを操作するようにしました。また、ソースレビューもせずPUSH！PUSH！だったのでマージリクエストもしない状況。
この時、競合が発生しまくり、慣れないメンバーは慌てふためくというカオスに・・・。
↓
そこでひとまずはローカルにワークブランチを切って操作しよう！ということに落ち着きました。
コミットの数が増えるけど、さほど問題になりませんでした。
ワークブランチで操作することで、かなり競合発生は回避できたかと思います。

#### GitLabのパスワード変更した場合の問題
eclipseの**セキュア・ストレージ**をリセットする必要がありました・・・。

#### 改行コードの取り扱い
いまだに悩まされていますが、`core.autocrlf`をtrueに統一するようにしました。
(本当に改行コード自動変換する設定でいいのか悩ましいところ・・・)

## やってみて思ったこと
CVSからGitに変えたことで、学習が必要となりましたが、CVSやっていたおかげでさほど高い壁に感じる事はなかったです。
逆に恩恵が大きすぎて絶対にGitいれるべきだわー。って思います。
入れてよかった点は
#### コミットの管理単位がファイルではなく状態であること。
CVSではファイル単位で管理しているので、変更に対して修正したファイル群を確認することができませんでした。これがあることで調査がだいぶと楽になった感じがします。

#### ソースがIDEなくても見れる。
ホスティングサービスのないCVSだったので・・・。

#### 退避が楽にできる。
`stash`のおかげでちょい試しがものすごくしやすい。

## 課題
今後の課題としては、GitLab側の運用。
#### CVSから移行したあとなぜか表示されない問題
GitLabのバージョン問題かもしれませんが、うまく移行できてるのにLab側で表示されない問題があります。
Lab側でなんらかのファイルをPUSHすると、正常に表示されるようになるという謎の動きが未解決。

#### バックアップ・リストア問題
バックアップとリストアがうまくできない感じです。
やりたいことは、全体バックアップから一部のプロジェクトのみリカバリすること。
bundleファイルからcloneするも全ブランチをcloneしないとできない・・・。
もっと効率のいい方法がないのかが未解決・・・。

## 感想
ハードル高いと思っていましたが、やってみればそんなことなかったです。
逆に得られるものの方がおおきいなぁって思います。
GitにすることでCI/CDへのつなぎがしやすくなるのかなぁと個人的には思います。
python Bottleの基本1(Hello World)

#Bottleとは、とてもコンパクトWeb Server(WSGI)です。
WSGI（Web Server Gateway Interface）とは、サーバーとWebアプリケーションをつなぐ共通のインターフェースをPythonで定義したもです。
python言語で作成できるWeb serverで簡単にユーザーインターフェイスを構築できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/46aef7c7-82db-eec2-337c-fda06ea4ff9a.png)

```ex1.py
# bottleの基本1
from bottle import *
@route('/')
def home():
    return "<h1>Hello World</h1>"
HOST,PORT='localhost',8080　#web server のアドレスとポートの定義
if __name__ =='__main__':
    run(host=HOST,port=PORT)

```
上記のソースコードは、bottle Serverの最低限のコードです。

```
@route('/')は、def home()の関数に対するデコレーション(機能追加)です。
本来ならば、
def home():
     ......
route('/','GET',home)
デコレーション機能を使ってすっきり書くことができます。
```
##@付いたらデコレーション関数だ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274715/dc2c2efc-60e1-7498-19f5-dfe4688bf695.png)


```
HOST,PORT='localhost',8080　#web server(WSGI)
このコーディングでHOSTとPORTを定義しています。
他の言語を学習した方は、違和感あるでしょうが=の意味を考えてみましょう。
多くの場合、=は、Moveとして習慣化されています。
A=10とコーデングしたなら10をAに移動する(load)となりますが、
pythonの場合は、10の値にAという名前(alias)を付けるという意味になります。
インタープリタの立場にたって考えるとわかりやすいです。

```
#たった8行でWeb Serverを構築できます。
mysqldumpでmax_allowed_packetが最大値にもかかわらずエラー

表題の通りですが、結論から言うとmysqldumpは設定がmysqldとは別なのでmysqldに設定してあっても意味がありません。ちょっとはまりました。

全てのDBをバックアップ取ろうと思って

```
mysqldump --lock-all-tables --all-databases -u root >/root/all_dbs.sql
```

こんな感じでコマンド打ったら下記のエラー。

```
mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' bytes when dumping table `guest` at row: 18746
```

以前DBを流しこむ時に最大値に変更したはず・・・


```
# my.cnf
[mysqld]
max_allowed_packet = 1G
```

おかしいなあ、と右往左往してたら[この辺](https://serverfault.com/questions/102564/error-2020-got-packet-bigger-than-max-allowed-packet-bytes-when-dumping-table)が参考になりました。

mysqldumpは設定が別です。

```
mysqldump --lock-all-tables --all-databases --max_allowed_packet=1G -u root >/root/all_dbs.sql
```

あるいはmy.cnfに（付属のテンプレートを使ってると下の方にある）

```
[mysqldump]
max_allowed_packet = 1G
```

ちなみに1Gが最大値っぽいです。
KPTが上手く出来ないので新しい振り返りを考えたGPWM (Good/Problem/Will/Must)

# 新しい振り返りを作ってみた目的

僕はKPTが大好きです。
正確にはKPTTが好きです。

しかし、どうも世の中のプロジェクトマネジメントでKPTが上手く行っていないように見えることが多々あります。
そこでKPTでハマるところを改善しつつ目線を `やりたいこと` と `やるべきこと` を分離し、改善を実行するための振り返りを考えていみました。


# 最初の着想

Will, Can, Must (やりたいこと、出来ること、やるべきこと) をベースに考えました。

やりたいこととやるべきことは雲泥の差があり、コントロールが難しいにも関わらずTryというカテゴリにまとめられています。そこには出来ること(Can)で判断することが必要です。

また、やりたいことっていうものは問題があって出てくるものではなく、ただやりたいと感じることがあります。技術的チャレンジや興味、新しく見つけた手法の実験もあります。
その中でプロジェクトが上手くいくように思いついたアイデアは、深堀りしていったときに初めて本当の課題や問題を見つけることもあります。明らかにわかりやすい問題は一定レベルのチームでは既に対処可能状態になるものだと思います。

Tryに移した事象はまずは本当に今のチームで実現可能なものなのか？ `出来ること` なのか？と言うフィルターこそがチーム改善の中でキーエンジンになると思いました。

これについては現状のKPTTのフォーマットを使っていても、うまいファシリテーションを実行すれば実現可能なものだと思います。

しかし、どうにもファシリテーション力が求められるものだと感じました。


# 他の振り返りとの違い。やりたい目的。

僕は圧倒的にTryが大好きです。 `次に何をするべきか？` をしっかり考えることで改善が加速すると考えているからです。

その中で、KPTやYWTの `Try` は上記に書いた目的で曖昧なため、うまいファシリテーションなどのコントロールを要すると思います。
またFDL (Fun, Done, Leane)やタイムライン、セレブレーショングリッドは完全に振り返ることに特化しており、Nextアクションを決めきるものではないので、プロジェクトマネジメント上でチームの改善を加速するためには物足りないと感じています。(どれも利用する場面によってはとても大好きな振り返りです)


# そこで考えたGPWMと言う振り返り

#### GPWM (Good / Problem / Will / Must) のやりかた

やり方はKPTとほとんど変わりません。
最初に出すべき項目はGood, Problem, Will です。
そして、その結果やるべきことと判断したもののみをMustに書きます。
Mustはチームの総意であり、カンバンなどでプロジェクトを管理しているのであればチケット化するべき項目になります。


### Good
KeepをGoodに変えている理由はシンプルで、続けていく良かったことだけでなく、ただ単純に良かったと感じたことを書いてもらいたいからです。Keepを書いてもらうときに良かったことを書くんだよって毎回説明していましたが、それが必要なくなります。
それにみんなが続けたいと思うものは自然にKeepされるものだと思います。
Keepで続けたいと思っていてもコスト対効果が見合わないものは自然に淘汰されると思います。
それはやったらいいなと思うレベルではなくやるべきことの場合とは別のカテゴリとして扱うべきだと考えました。


### Problem
これはKPTのProblemと同等です。問題に感じていることをシンプルに書いてもらうことで良いと思います。


### Will
これは新しく定義した項目です。
Tryに近いのですが、もっと純粋にやってみたいなと感じたことを書いてもらえればいいと思います。
今までのTryはKeepやProblemをベースに書かれていることがKPTのメジャーな方法ですが、課題ベースだと課題を深堀りしてからでなければその課題そのものが出てきにくい現状がありました。なので、感じているやりたいことをもっとシンプルに書いてもらっていいと思いました。

別の名称候補としてChallengeやWantなども考えましたが、Will, Can, Mustの考えに従ったほうがより実行するべき課題を抽出しやすいと考えてWillにしました。


### Must

やりたいなーと思うことはプロジェクトを進めていくと山程あります。Tryにはやれたら良いことやずっとやりたいと思ってることが溜まり続けてしまう自体にもなります。
その中で本当にやるべきことは何なのか？
コスト対効果が出せるものはなんなのか？
チームでチャレンジする意義のある取り組みは何なのか？
などを精査して、チームの中で必ずやりきる合意が取れた項目のみをここに残します。 KPTTではTODOと呼ばれる項目です。 TODOだとリストにすると満足してしまいがちな言葉に思えるため、より強く実行するべきことの意味でもMUSTとしました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17213/e154f306-f19b-d8dd-8a4f-803f26627a4d.png)


### Can
ここでのポイントは本当に `出来ること (Can)` のみをMustとすることです！
したいことはたくさんある中でチームのリソースは限られています。
大きすぎるサイズのものや効果が出るまでに時間がかかる方法などは実行するべきものとしては難しいです。
やらないと分からないものの場合は1週間程度実行したら結果がわかりそうなサイズにしてMustに移動します。

Canはチームの合意であり、アイデア出しの場であり、フィルターし集約した結果のみがMustに集まります。
これをチケット化などして次回の振り返りまでトラッキングしましょう。



# まとめ

KPTがマンネリしていて新しく課題解決できていないな？と感じたり、新しいアイデア(Will)が出てこず課題ばかりにフォーカスしてしまったり、Tryにやれたら良いなと言う項目が溢れてしまって、本当に実行するべきことが実行できていないと感じたり。
そんなKPTに課題を感じたチームの方々はちょっとGPWMをやってみてはどうでしょうか？

課題ばかり上げてTryを出すのではなく、ただただシンプルにやりたいこと(Will)を出してポジティブになりませんか？ Willから課題を見つける事もできます。Willから見つけるチャレンジは、課題からでは見つからないチームの大きな変化を見つけることも出来るかもしれません。

チャレンジした結果はコメントやツイッター等でレポート頂けると嬉しいです。

改善が推進される振り返りをしたい！！


# 追加課題
GPWMというのがどうにも読みにくいので、良い読み方や別の名前を募集したいかもしれない。
AtomエディタでつくったJavaファイルをコマンドプロンプトで実行したら文字化けしてしまったとき

# AtomエディタでつくったJavaファイルをコマンドプロンプトで実行したら文字化けしてしまった！
##### 開発環境：windows8.1、コマンドプロンプト
##### 状況説明
１．Atomを使って「〇〇.java」というJavaのコードを記述
２．コマンドプロンプトで「javac 〇〇.java」と打ち、コンパイル
３．コマンドプロンプトで「java 〇〇」と打ち、プログラムを実行

#### ⇒日本語の文字が文字化けしてしまった！！
#### ⇒同様のことをWindowsPowershellでやっても日本語の文字が文字化けしてしまった！！

##### さあどうする？？

#####以下の記事を見ながら、Atomの文字コードの設定をいじり、文字化けを解消しました！
↓　↓　↓　↓　↓
#####http://www.comp.tmu.ac.jp/tmuner/faq/mac/java.html

####☆文字化け解消の流れ☆
#####上記の記事によると、Windowwsにあるコマンドプロンプトの文字コードは、「SJIS」であるため、編集しているファイルのAtomエディタの文字コードを確認。


####1. 編集しているコードの文字コードがUTF-8であることが判明
![スクリーンショット (195).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400333/923e7fd8-5335-d5c2-157b-79e2b7ccae6b.png)


####2. 編集しているコードの文字コードをSJIS(Shift JIS)に変更
![スクリーンショット (194).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400333/5eef4e7e-52ec-3824-7e31-3885f13a49a6.png)


####3. 文字化け解消！！
![スクリーンショット (197).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400333/1e15dcf7-f141-a4d7-40fe-08ecfe7ae7e1.png)
Craft CMS で自分がアップしたアセットのみを利用できるようにする

アセットを利用するときに、自分でアップしたアセットのみを利用できるようにするプラグイン

> Asset Ownership
> https://plugins.craftcms.com/asset-ownership

色々権限周りで制限をかけたいときとかには便利かもしれない
Union型のうれしいところ

値に複数のパターンがあり得ることを型を以て定義できる。
静的型付け言語において、型で値の取りうる値を定義することは非常に大事。

# 例
例えば、aに値が入っている場合はb,cは値なしであるべきだが、
aに値がない場合b,cに値が入っていなければいけないという場合。

``` typescript

type Hoge = {
  a:string
} | {
  b:string,
  c:string
}

```
という風に書ける。
単なる静的型付け言語やnull安全なだけの言語だと、これらのパターンが存在するということは、
コメントやドキュメントで後続の開発者に伝達する必要があるし、
bに値が存在する時は「当然aは値なしでcは値がある」という前提でのエディタによるコード補完やコンパイル時チェックも入らない。(実際に使うには判別共用体用のタグを足す必要があるが)

値が複数のパターンを取る状態管理などでは非常に有効。

# まとめ
* Union型で複数のパターンを取りうることを型で示すことが出来る
* 状態管理などで特に有効
* もっと流行って搭載される言語が増えて欲しい
Golang - Gorilla Websocket Auto Disconnect Randomly Problem

Sometimes, the websocket connection terminated unexpectedly. Then I trace the source code and find the root cause.


```golang:conn.go
...
...
...
		if c.readLimit > 0 && c.readLength > c.readLimit {
			c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait))
			return noFrame, ErrReadLimit
		}
...
...
...
```


The solution is increased the read limit size.

```golang:conn.go
...
...
...
// SetReadLimit sets the maximum size in bytes for a message read from the peer. If a
// message exceeds the limit, the connection sends a close message to the peer
// and returns ErrReadLimit to the application.
func (c *Conn) SetReadLimit(limit int64) {
	c.readLimit = limit
}
...
...
...
```
今日のAcrobat　Error：有効期限が切れているか、または認証されていません。

#機材(equipment)
Windows 10 pro
word 2016
Acrobat Acrobat PRO DC 2015

#経緯(issue)
MS Wordで色調整しようと思って作業していて、最終的にPDFで出すため、PDFを作成した。

カラープリンタの傍に行って、印刷しようと思ったら、PDFになっている方がページをまたいで文字がでていることがわかり、修正した。

修正後、PDF出力しようとしたらエラーがでた。


![acrobaterror.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/ce03d573-e553-65bd-14c1-d38c66e08b18.png)

なんで？

プリンタの傍に行ったとき、ネットワークを外したのがいけないのだろうか。

ネットワークにつないで試しても同じ。

Wordをたちあげなおしても同じ。

Windowsを再起動してみる前に記事を保存

#解決(fixed)

ネットにつないでOSを再起動したらエラーがでなくなった。

まだ、WordとPDFのページずれの確認はまだ。


#未解決(unsolved)

やったとおもってPDFを見たら、Wordからずれた印刷物になっている。

なおして、再度PFDにしようと思ったら、また上記のエラーがでた。

経緯に戻る。無限ループからいつ脱出できるのだろう。

#続報(follow up)
ネットにつないでOSを再起動したらエラーがでなくなった。

まだ、WordとPDFのページずれの確認はまだ。

２度目ががうまくいくかどうか、未確認。

p.s.

ずれもだめだったし、直してPDFにしようとしたまたエラーになった。

#追加情報(additional information)

再起動しても、Word, Acrobatが起動してしまうと、印刷でエラーになる。

２度あったような気がする。最初は再起動わすれたかなと思った。



#考察(consideration)

ネットにつながっていないことは直接的な要因ではなさそう。

再起動すれば、１回は出力するので毎回再起動することで暫定解決(work around)。


p.s. 
同時に機材を４台使って作業しており、仕事の時間としては無駄を含むが、再起動の時間すべてが待ちになっているわけではない。

#参考資料(reference)

印刷調整の罠
https://qiita.com/kaizen_nagoya/items/312900f695587bd33e27

#文書履歴(document history)
ver. 0.01 初稿 20190903 午前9時
ver. 0.02 解決 20190903 午前10時
ver. 0.03 未解決 20190903 午前11時
ver. 0.04　続報 20190903 約　正午 
ver. 0.05 考察 20190903 午後１時　予定
ver. 0.06 追加情報 20190903 午後２時
Softether起動用スクリプト

SoftEtherの起動用スクリプト(Ubuntu 14.04)です。

いつも/opt/softetherにコピーして下記スクリプトを使っています。

```/etc/init.d/softether
#! /bin/sh
### BEGIN INIT INFO
# Provides:          softeather
# Required-Start:    $network
# Required-Stop:
# Should-Start:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: 
# Description: 
### END INIT INFO

BIN=vpnbridge
PATH=/opt/softether/
 
case "$1" in
  start)
    cd ${PATH}
    ./${BIN} start
    ;;
  stop)
    cd ${PATH}
    ./${BIN} stop
    ;;
  *)
    echo "Usage: softether {start|stop}" >&2
    exit 1
    ;;
esac
 
exit 0
```

起動設定は下記のコマンドで

>sudo update-rc.d softether defaults
俺はどうしても Node.js で .env ファイルを使いたい！

## 概要
Node.jsで、.envを使いたい！

## 前提
Node.jsでの開発環境があること

## 手順
### パッケージをインストール  
.envを使うために、このパッケージを使用する  
[dotenv](https://www.npmjs.com/package/dotenv)

```
$ npm install dotenv --save
```

### .envを用意
.env を作成して、下記を記述

```
SAMPLE_KEY1=No1
SAMPLE_KEY2=No2
SAMPLE_KEY3=No3
```

### 対象ソースでパッケージを `require`

```
require('dotenv').config();
```

## 動かしてみよう

### .env の値を取得
```
console.log(process.env.SAMPLE_KEY1):
console.log(process.env.SAMPLE_KEY2):
console.log(process.env.SAMPLE_KEY3):
```

## 最後に
GitHubでソース管理してるなら
`.gitignore` に、 `.env` の追加を忘れずに！
IT Oeration Management ノススメ

#まとめ
AI や サーバレスなどのIT の在り方、AWS/Azure/GCP などのIT サービス、多様性あるIT 活用は万全でしょうか？
社員稼動をIT 運用に割かれて、開発等の本業の割合が逆7:3 になったりしてませんか？
本業へ集中できて初めて、「IT を活用している」と言えます。
"投資するポイントはどこか" 経営と現場がズレていると、IT活用は盛んになるものの、社員がその運用に追われて本業が出来ないといった事態になってしまいます。
"本業：IT運用 = 7:3" に向けて、IT Operation Management をオススメします。

#IT Operation Management とは
"本業は何か？" を改めて見直す３つのポイントを紹介します。
###１．IT 活用の"北極星" を決め、IT 化する範囲を決める
　　　ポイント：IT のことを考えるのは後。まずは、会社としてあるべき姿を決めましょう
　　　目的(例)：オリンピックを機に在宅ワークで、"ライフワークバランスを強化" する。
　　　目標(例)：在宅ワークに向けたIT 環境(リモートデスクトップサービス、インターネット接続、端末)を整える

###２．社員が集中すべき、IT 運用点を決める
　　　ポイント：どんなリスクを受け入れられないか？それ以外は、サービス化や運用代行にお願いして、運用ポイントを集中させましょう
　　　目的(例)：外部攻撃あるいは社員による情報漏洩を防ぐ
　　　目標(例)：ウィルス、データコピーを監視して、怪しい動きはブロック。社員から確認を行う

###３．開発あるいは次の開発展望を決める
　　　ポイント：IT だけでは出来ない、会社の方針をIT活用ビジョンへ転換する本業に集中する
　　　目的(例)：ライフワークバランスのライフ部分を強化して、IT 活用で会社の魅力向上で離職率低下＋新卒希望率向上を狙う
　　　目標(例)：IT 活用のライフ活用事例を調査する

#昨今の"声"
サーバレス化やSaaS化したい、、、けど、見積もると高すぎる、とお声掛け頂きます。
オンプレミスベースのサービスをすぐにサーバレス化やSaaS 化すると再開発と運用ルール策定に追われて、
「お金はかかってるけど、社員のIT運用稼動が増えそうだ」となっています。

なぜこのようなことが起きるのか？
一つは、経営陣へIT活用のインプットは十分できていますか？
課題報告や費用効果の報告だけで、経営陣との時間を過ごしていませんか？
"投資するポイントはどこか" 経営と現場がズレていると、IT活用は盛んになるものの、社員がその運用に追われて本業が出来ないといった事態になってしまいます。
それを避けるため、IT Operation Management が、今、重要になっています。

ストレッチ目標として、
5分でよいので、上司（できれば経営陣）との打合せで、現場の声とIT 活用事例を紹介するようにしましょう。

#今後
勉強会の議題として取り上げていきますので、是非、一緒に議論していきましょう。
【Python】辞書を利用して関数をまとめて実行する

Pythonの関数と辞書のを使い方を新たに知ったのでまとめます。
こういうことができる、という一例なのでかなり遠回りなコードになると思います。

## やりたいこと

```python:func.py
def self_introduction(name: str, age: int, hobby: str) -> str:
    """
    名前、年齢、趣味の自己紹介
    """
    return '私の名前は{}、{}才。趣味は{}です。' .format(name, age, hobby)


def cal_bmi(weight: int, height: int) -> int:
    """
    bmiを計算して返す関数
    """
    return weight / (height ** 2)
```

上のような引数を結合して文字列を返すだけの関数と、よくある体重と身長からbmiを計算し返す関数を書いたファイル`func.py`を用意します。これを別ファイルから参照し利用することを考えます。

```python:func_excu.py
import func as fn

intro = fn.self_introduction('diagonal-m', 23, '読書')
print('自己紹介:', intro)

bmi = fn.cal_bmi(60, 170)
print('bmi:', bmi)
```

```:実行結果
自己紹介: 私の名前はdiagonal-m、23才。趣味は読書です。
bmi: 0.0020761245674740486
```

これと同じ結果になるようなものを辞書を利用して書いていきます。



## 辞書を利用して関数を呼び出す

```python:dict_excu.py
import func as fn

func_dict = {
    '自己紹介': {
        'func': fn.self_introduction,
        'args': {
            'name': 'diagonal-m',
            'age': 23,
            'hobby': '読書',
        }
    },
    # 以下のように短く書くこともできる
    'bmi': dict(func=fn.cal_bmi, args=dict(weight=60, height=175))
}

for func_name, func_cont in func_dict.items():
    result = func_cont['func'](**func_cont['args'])
    print(f'{func_name}: {result}')

```

```:実行結果
自己紹介: 私の名前はdiagonal-m、23才。趣味は読書です。
bmi: 0.0019591836734693877
```

`func_dict`にキーに`'自己紹介'`、さらに辞書を値として`'func'`をキーに、関数型を値とした辞書と、`'args'`をキーにそれぞれさらに引数を値にとった辞書型で設定しています。`'bmi'`の方も同様のことをしています。

このようにfor文で一括で実行することができます。



## 補足

```python
def cal_bmi(weight: int, height: int) -> int:
    """
    bmiを計算して返す関数
    """
    # return weight / (height ** 2)
    print(weight / (height ** 2))

if __name__ == "__main__":
    cal_bmi(60, 170)  
	print(cal_bmi) # 関数名の()なしは関数ポインタとなる
	x = cal_bmi
	print(type(x))
	x(60, 170)
	x(90, 150)
```

```:実行結果
0.0020761245674740486
<function cal_bmi at 0x00000252C8969D90>
<class 'function'>
0.0020761245674740486
0.004
```

関数名の()なしは関数ポインタとなり変数に代入するとその変数を関数として使えます。
【C#】サブモニタのみフルスクリーンでスクリーンショットを撮りたい

スクリーンショットがクリップボードにコピーされるやつ
丁度いいのがなかったので自作

```c#
// 何かしらのイベント
private void button_Click(object sender, EventArgs e)
{
    Screen p = Screen.AllScreens[0];     // プライマリ
    Screen s = Screen.AllScreens[1];     // セカンダリ（今回撮るのはこっち）
    int x = s.Bounds.X;
    int y = s.Bounds.Y;
    int w = s.Bounds.Width;
    int h = s.Bounds.Height;

    using (Bitmap b = new Bitmap(w, h))
    using (Graphics g = Graphics.FromImage(b))
    {
        g.CopyFromScreen(new Point(x, y), new Point(0, 0), b.Size);
        Clipboard.SetImage(b);
    }
}
```
CocoaPods でビルド時に `Command PhaseScriptExecution failed with a nonzero exit code` が発生


# 環境
* macOS Mojave：10.14.6
* Xcode：10.3

# 試したこと
Mac アプリで CocoaPods で Realm を入れてビルドしてみたら、`Command PhaseScriptExecution failed with a nonzero exit code` エラーが発生してビルドできなくなってしまったので調べてみました。

先人の方が同じような問題が発生したので、いくつか試したところ問題なく解決できました。

* CocoaPods バージョンアップ
* Project を再度 CocoaPods で update
* プロジェクトのクリーン（Command + K）

# CocoaPods のバージョンアップ

## CocoaPods のバージョンを確認
```sh
$ pod --version
1.5.3
```

## CocoaPods のバージョンアップ
Install 先を `/usr/local/bin` に変更してたので、 `-n` オプションでパスを変更

```sh
$ sudo gem install -n /usr/local/bin cocoapods
Successfully installed xcodeproj-1.12.0
Fetching: fourflusher-2.3.1.gem (100%)
Successfully installed fourflusher-2.3.1
Fetching: ruby-macho-1.4.0.gem (100%)
Successfully installed ruby-macho-1.4.0
Fetching: cocoapods-1.7.5.gem (100%)
Successfully installed cocoapods-1.7.5
Parsing documentation for xcodeproj-1.12.0
Installing ri documentation for xcodeproj-1.12.0
Parsing documentation for fourflusher-2.3.1
Installing ri documentation for fourflusher-2.3.1
Parsing documentation for ruby-macho-1.4.0
Installing ri documentation for ruby-macho-1.4.0
Parsing documentation for cocoapods-1.7.5
Installing ri documentation for cocoapods-1.7.5
Done installing documentation for xcodeproj, fourflusher, ruby-macho, cocoapods after 7 seconds
4 gems installed
```

## CocoaPods のバージョンが最新（1.7.5）か確認
```sh
$ pod --version
1.7.5
```

# Project を再度 CocoaPods で update
```sh
$ pod update
Update all pods
Updating local specs repositories

CocoaPods 1.8.0.beta.2 is available.
To update use: `sudo gem install cocoapods --pre`
[!] This is a test version we'd love you to try.

For more information, see https://blog.cocoapods.org and the CHANGELOG for this version at https://github.com/CocoaPods/CocoaPods/releases/tag/1.8.0.beta.2

Analyzing dependencies
Downloading dependencies
Using Realm (3.17.3)
Using RealmSwift (3.17.3)
Generating Pods project
Integrating client project
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 2 total pods installed.

[!] Automatically assigning platform `osx` with version `10.14` on target `NSTableViewSample` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.
```

# ビルド
念の為、プロジェクトをクリーン（Command + K）します。 
その後、ビルドして実行した（Command + R）ところ問題なくアプリが起動しました。
Visual Studio Code で OCaml を使えるようにする話

# 概要
[Ocaml for Windows の Graphical Installer](https://fdopen.github.io/opam-repository-mingw/installation/) を用いて既に OCaml や Cygwin をインストールしている Windows 10 端末に，Visual Studio Code で OCaml のコードを編集する環境を作ってみた.
![ocaml_on_vscode.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478774/c741f9ff-48ff-2072-eac1-26658476d41a.png)

# 詳細
## Visual Studio Code のインストール
[Visual Studio Code のサイト](https://code.visualstudio.com/)からインストーラーをダウンロードし，実行する．

## 拡張機能 OCaml plugin の導入
Visual Studio Code を起動し，Extensions から OCaml という名前のプラグインをインストールする．`OCaml` と検索すれば出てくるはず．

## 使用するシェルを Cygwin に変更
Visual Studio Code のデフォルトのシェルは PowerShell になっており，OCaml を使うには Cygwin に変更する必要がある．これを行うには次のようにする．

1. `File > Preferences > Settings` を開く．
2. 検索窓で `terminal.integrated.shell.windows` と入力する．
3. `Edit in settings.json` という項目が表示されるはずなので，それをクリックする．
4. `terminal.integrated.shell.windows` のパスを Cygwin の置かれている場所に変更する．

```json:settings.json
{
 "terminal.integrated.shell.windows": "C:\\OCaml64\\Cygwin.bat"
}
```
以上で OCaml のプログラムが書けるようになった．

### おまけ: 複数のシェルを切り替えられるようにするには？
上記の `terminal.integrated.shell.windows` を複数個設定することはできない．複数のシェルを切り替えられるようにするには，例えば[こちらの記事](https://qiita.com/FluffyHernia/items/d2f37a1e90df7b453637)が参考になる．

# 参考
- [OCaml for Windows - Installation](https://fdopen.github.io/opam-repository-mingw/installation/)
- [Visual Studio Code - Code Editing. Redefined](https://code.visualstudio.com/)
- [hackwaly/vscode-ocaml: An extension for VS Code which provides support for the OCaml language.](https://github.com/hackwaly/vscode-ocaml)
- [vscodeで複数のシェルを切り替えながら使う方法 - Qiita](https://qiita.com/FluffyHernia/items/d2f37a1e90df7b453637)
webarenaでubuntu その43

#概要

webarenaでubuntu18.04やってみた。
plunkerで画像をbase64してみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b23fac97-e4b0-a9c2-9e0c-c5d44cd473ef.png)


#成果物

https://embed.plnkr.co/0fMQzyJ7PHdNlwKEp1Bf/

以上。
pandasでCSVを読み込む際の工夫

データ分析をする際、CSV形式でデータが保存されている場合、pandasで `read_csv` 関数により、データをロードする。

pandasでは、値が欠けているセルを自動的に検出し、NaNを入れてくれる。

データに欠損値があるかどうかをロード後に確認してもいいが、データロード時に利用できる様々なオプションがある。

- keep_default_na
- na_values
- na_filter

である。

以下サンプルCSVである。`Favorite`のカラムには何らかの趣味を示す文字列が入って欲しいが、ダミーとして欠損値や0にしている。

```
"Name","Gender","Favorite"
"Alice","F","Guitar"
"Bob","M","Music"
"Carol","F",
"Cary","M","Nothing"
"Dave","M",0
```

オプションの指定がない場合は以下のようになる。

```py
pd.read_csv("./test/users.csv")
```

|  | Name | Gender | Favorite |
|--:|:--|:--|:--|
| 0 | Alice | F | Guitar |
| 1 | Bob | M | Music |
| 2 | Carol | F | NaN |
| 3 | Cary | M | Nothing |
| 4 | Dave | M | 0 |

## keep_default_na

これはデフォルトではTrue指定されているもので、NaNのような欠損値のリストを使用するかどうかを指定するものだ。

`False`にすると指定しないためNaNが利用されない。

```py
pd.read_csv("./test/users.csv", keep_default_na=False)
```

|  | Name | Gender | Favorite |
|--:|:--|:--|:--|
| 0 | Alice | F | Guitar |
| 1 | Bob | M | Music |
| 2 | Carol | F |  |
| 3 | Cary | M | Nothing |
| 4 | Dave | M | 0 |

## na_values

`na_values` は、利用者側で欠損値となる値を決めることが可能だ

```
pd.read_csv("./test/users.csv", na_values=[0]) # この場合0に欠損値リストが利用される。
```

|  | Name | Gender | Favorite |
|--:|:--|:--|:--|
| 0 | Alice | F | Guitar |
| 1 | Bob | M | Music |
| 2 | Carol | F | NaN |
| 3 | Cary | M | Nothing |
| 4 | Dave | M | NaN |

`keep_default_na` との併用も可能だ。

```py
pd.read_csv("./test/users.csv", keep_default_na=False, na_values=['', 0])
```

|  | Name | Gender | Favorite |
|--:|:--|:--|:--|
| 0 | Alice | F | Guitar |
| 1 | Bob | M | Music |
| 2 | Carol | F | NaN |
| 3 | Cary | M | Nothing |
| 4 | Dave | M | NaN |

`Nothing` という趣味がないということを意図してそうな入力も一応欠損値にできる

```py
pd.read_csv("./test/users.csv", keep_default_na=False, na_values=['', 0, "Nothing"])
```

|  | Name | Gender | Favorite |
|--:|:--|:--|:--|
| 0 | Alice | F | Guitar |
| 1 | Bob | M | Music |
| 2 | Carol | F | NaN |
| 3 | Cary | M | NaN |
| 4 | Dave | M | NaN |

## na_filter

欠損値を判定し、読み込むかどうかをきめるものだ。

```py
pd.read_csv("./test/users.csv", na_filter=True)
```

|  | Name | Gender | Favorite |
|--:|:--|:--|:--|
| 0 | Alice | F | Guitar |
| 1 | Bob | M | Music |
| 2 | Carol | F | NaN |
| 3 | Cary | M | Nothing |
| 4 | Dave | M | 0 |

```py
pd.read_csv("./test/users.csv", na_filter=False)
```

`False`の場合データをそのまま読み込む。

|  | Name | Gender | Favorite |
|--:|:--|:--|:--|
| 0 | Alice | F | Guitar |
| 1 | Bob | M | Music |
| 2 | Carol | F |  |
| 3 | Cary | M | Nothing |
| 4 | Dave | M | 0 |


## まとめ

読み込み時にこのようなオプションを駆使することで、前処理の手間も少し改善できるだろう
HugoでGravater登録画像を表示するサンプル

自分用の備忘録。Gravaterに登録した画像をHugoから呼び出す。自分のメルアド公開が前提。

# config.toml

```toml
[Params]
gravatar = "alkn203@gmail.com"
```

## partial(html)
```html
{{ with .Site.Params.gravatar }}<div><img src="https://www.gravatar.com/avatar/{{ md5 . }}"></div>{{ end }}
```
【備忘録】未経験から半年で学習してきたこと（Java）

###未経験から半年で学習してきたこと（２）
会社で私はJavaを学習しています。
文書作成において簡潔にわかりやすい文を書くように上司は命じました。
それを意識して私は今回も書いていきます。

###条件分岐

条件分岐とは条件に合致するかしないかで処理が決まる文です。
条件分岐には2種類の文があります。

- if文

if文は１つの条件に対しTrueの場合、Falseの場合違う処理を行う文です。
たとえば、「明日晴れの場合、散歩します」「明日晴れではない場合、散歩しません」のように、「明日晴れの場合」という条件でTrue・Falseの２つの場合を考えます。

- switch文

switch文は複数の条件に対し処理がある文です。その条件で指定した値が何かによって、異なる処理を行います。たとえば、「明日の天気が」「晴れの場合、散歩します。」「曇りの場合、家にいます」「そのほかの場合、何もしません」のように、「天気」に対し「晴れ」「曇り」「そのほか（晴れ、曇り以外）」で違う処理をしたいときに使うのがswitch文です。

##条件分岐をjavaで書いてみよう
上記は概要を説明してきました。実際にjavaを使ってif文、switch文のプログラムを書いてみます。

#if文
```java:test1.java
class test1{
    public static void main(String[] args){
       int a = 10;
       if(a > 7){
          System.out.println("7より大きい");
       }else if(a >  5 &&  a <= 7){
          System.out.println("5より大きく7以下です");
       }else{
          System.out.println("それ以外だよ");
       }
    }
}
```
if文の場合、if文、if-else文、else ifを使った文の3種類あります。
今回のプログラムはelse ifを使っています。
使い方は以下の通りです。
　if(条件式1){
　　#条件式1がTrueの場合の処理を書く
　}else if(条件式2){
   #条件式2がTrueの場合の処理を書く
　}else{
　　#Falseの場合の処理を書く
  }
・条件式1は(a > 7)となっています。
この場合、int型の変数 aが7より大きい場合　という意味です。
・条件式2は(a > 5 && a <= 7)となっています。
条件式2では「&&」という論理演算子を使っています。
これは「a > 5」という条件式と「a <= 7」という条件式がどちらもTrueではないと「#条件式2がTrueの場合の処理を書く」の処理を行いません。
また、「a <= 7」という条件式があります。
「a < 7」だと「変数aの値は7より小さい。」ということになります。しかし、「a <= 7」だと「変数aの値は7以下です。」ということになります。

この条件式は次のswitch文でも使用します。

#switch文
```java:test2.java
class test2{
   public static void main(String[] args){
      int a = 10;
      switch(a){
            case 5:
              System.out.println("5");
              break;
            case 10:
              System.out.println("10");
              break;
            default:
              System.out.println("５でも10でもないよ");
              break;
      }
}
}
```
switch文の書き方は以下の通りです。
　switch(条件){
     case 値1:
　　　　　#値1のときの処理を書く
　　　　　break;
     case 値2:
         #値2のときの処理を書く
　　　　　break;
     default:
         #defaultのときの処理を書く
　　　　　break;
   }
ここで注目したいのは「条件」と値1、2は同じ型であることが必要です。今回のプログラムでは変数aはint型でした。そのため、case 値1, 2ともにint 型でそろえています。
もう１つ注目したいのはdefaultです。defaultは値1, 2以外の値のときどうなるのかを書いています。このdefaultはあってもなくてもよいです。

###まとめ
今回条件分岐とif文、switch文の違いがわかるようにそれぞれの特徴を紹介しました。
自分の学習のためにも書きましたが、指摘などあればコメントしてください。ここがわかりにくいときも修正していきます。

つたないブログとなりましたが、今回は条件分岐についてまとめました。次回は繰り返し文、繰り返し制御文についてアウトプットを用意します。

読んでいただきありがとうございました。
不公平な「あみだくじ」の代わりに「とけいくじ」はいかがですか？


「あみだくじ」は当たりくじの直上付近が有利と言われていて、要するにくじを選ぶ順番によって有利不利が決まる不公平なくじであることが知られている。そんな不公平な「あみだくじ」に代わる手軽で公平なくじ引きの方法を閃いたので、記載しておく。
おそらく既出だと思われるが、ググっても正式名称がわからないので、この記事では一旦「とけいくじ」と呼称する。


### 先に具体例

抽象的な手順を見ても混乱すると思われるので、先に具体例を書いておく。


 アリス、ボブ、キャロル、デイヴ、エレンの5名は仲良く円卓を囲んでショートケーキを食べていた。しかし、ショートケーキは8等分されており、3つのショートケーキが余ってしまった。とても美味しいショートケーキだったので、誰が余ったショートケーキを食べるかで揉めてしまった。話し合いでは決まらないので、「とけいくじ」で決めることにした。
 アリス達は時計回りにアリス、ボブ、キャロル、デイヴ、エレンの順で円卓に座っていた。とりあえず余った3つのショートケーキをアリス、キャロル、エレンの前に置いた。
 次にアリス達は他のみんなには見えないように手元の紙に好きな数字を書いて伏せた。全員が数字を書き終わったところで、一斉に書いた数字を明かした。アリスは5、ボブは2、キャロルは7、デイヴは9、エレンは4と書いていた。
 アリス達は書いてある数字分、つまり27回分ショートケーキを時計回りにぐるぐると隣に回していった。ショートケーキが目の前に来たボブ、キャロル、エレンはショートケーキを食べられる事が決まり幸せそうだった。アリスとデイブは羨ましそうにそれを見ていた。


### 抽象化した手順

1. くじ引きに参加する人数を$n$人、$i$番目の参加者を$p_i$とする($i=1,2,\cdots,n$)。
2. 当たりの数を$m(\le n)$個、$j$番目の当たりを$w_j$とする($j=1,2,\cdots,m$)。
3. 各当たりを$1,2,\cdots,n$のいずれかの番号で一意に採番し、当たり$w_j$に採番された番号を$m_j$とする。
3. 各参加者は任意の整数を決める。この段階では他の参加者に決めた数字は明かされない。参加者$p_i$が決めた整数を$z_i$とする。
4. 参加者全員が数字を決めた段階で、各参加者は決定した整数を明かす。
5. この時、$i \equiv m_j + \sum_{k=1}^{n} z_k \mod n$となる$i,j$について、参加者$p_i$が当たりくじ$w_j$に当選する。


### 余談

この「とけいくじ」の恐ろしいところは1人でも偏りなく整数を決める参加者がいると、他の参加者の決める整数にどんな偏りがあっても、全体としての当選確率に偏りがなくなる事だ。
AWSのRDS(PostgreSQL)でシングルAZをマルチAZへ変更した際の所要時間

## 概要

シングルAZからマルチAZへの変更時にはレプリカを作成するためにマスタのIO負荷が高まる。そのため負荷がどの程度継続するか調査した。

## 結論

ストレージ容量は320G〜500Gで、完了までだいたい8分〜9分程度かかる。