OmniAICreator/Qiita-1.07M huggingface dataset:
Catalinaへダウングレード

Big Sur にしたところ、XcodeでmainStoryBoardが消えていて
前のバージョンをGitからダウンロードしてもなぜか古い状態のままで、
何もかもBig Surのせいと思いたかったので、カタリナに戻しました。
その過程でつまづいたところのメモです。

工場出荷状態にして、OSを再インストールしようとしたら、
選択肢がBig Surしかない。
![4C104754-0748-45F4-BD59-A06C65E47B14.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295432/461e03b1-02aa-6537-4da8-0a05b1ca4ad7.jpeg)


いろいろな解決法がありましたが、以下のサイトの方法がすぐにダウングレードできました。



macOS Big Sur からCatlinaに戻す（ダウングレード）方法
https://810miru.com/mac/2730/

まずNGの例ですが、macOS Big Sur にアップデート後、通常通り、Catalinaにダウングレードしようと再起動後に「command + R」でディスクの初期化&OSのインストールを行いましたが、この際インストールできるのは macOS Big Sur しか選択できませんでした。

では、どのようにmacOS Big Sur にアップデートしたmacOSをCatalinaにダウングレードするかというと再起動をしたタイミングで「shift + option + command + R」キーを押しつづけると、地球儀？マークがグルグルしてOSをダウンロードすることで、Mac に当初搭載されていた macOS か、それにいちばん近い現在も提供されているバージョンがインストールできます。



↑上記サイトの著者の方、大変助かりました。
ありがとうございました。
TrelloのButlerで正規表現を使う


TrelloのButlerでトリガーの条件に`regex:`と付けると正規表現が使えるようです。
例えば次のようなButlerのルールを作るとhogeで始まりfugaで終わる添付ファイルが追加されたら、カードタイトルを添付ファイル名にリネームするようになります。

> when an attachment containing "regex:/^hoge.+fuga$/" is added to a card, rename the card to "{attachmentname}"

ヘルプには記載が無いのでいつ駄目になるか分かりませんが、とりあえず現時点（2020/03/05）では動作します。

（参考）

https://community.atlassian.com/t5/Trello-questions/Trello-Butler-is-useless-for-us-unless-there-is-an-OR-condition/qaq-p/1220364
Databricksにおけるmatplotlibの日本語対応

:::note info
**2021/8/5追記**
以下の記事にあるように、ノートブックのセルで`%pip install japanize-matplotlib`とするか、クラスターライブラリとして`japanize-matplotlib`をインストールし、`import japanize_matplotlib`するだけで解消できます。
:::

https://qiita.com/uehara1414/items/6286590d2e1ffbf68f6c

- - -

サンプルノートブックは[こちら](https://github.com/taka-yayoi/public_repo/tree/main/matplotlib)からダウンロードできます。

Databricksでmatplotlibを使用する際も、日本語が文字化け(□になる)する現象に遭遇します。なお、Databricksビルトインの可視化機能では文字化けは発生しません。

これを解決するには以下の対策が必要です。

[matplotlibの日本語文字化けを解決する - Qiita](https://qiita.com/katuemon/items/5c4db01997ad9dc343e0)

しかしながら、日本語フォントをインストールしても、クラスターを停止するとフォントファイルが削除されてしまうため、追加の対策が必要です。Databricksでは、init scriptに日本語インストール処理を追加します。

# init scriptによる日本語フォントのインストール

* 以下のスクリプトを実行すると、DBFSの `/databricks/scripts/japanese-font-install.sh` にinit scriptが作成されます。
* Clustersにて、日本語フォントを使用するクラスターにinit scriptを指定してください。
![](https://sajpstorage.blob.core.windows.net/workshop202103-r-mlflow/Screen%20Shot%202021-02-21%20at%2011.12.15.png)

**参考情報**
* [Cluster node initialization scripts — Databricks Documentation](https://docs.databricks.com/clusters/init-scripts.html)
* [Configure clusters — Databricks Documentation](https://docs.databricks.com/clusters/configure.html#cluster-log-delivery) init scriptの動作をロギングすることができます

```py
# init script格納ディレクトリの作成
dbutils.fs.mkdirs("dbfs:/databricks/scripts/")
```

```py
# init scriptの作成
dbutils.fs.put("/databricks/scripts/japanese-font-install.sh","""
#!/bin/bash
apt-get install fonts-takao-mincho fonts-takao-gothic fonts-takao-pgothic -y""", True)
```

```py
display(dbutils.fs.ls("dbfs:/databricks/scripts/japanese-font-install.sh"))
```

# 動作確認

```py
import matplotlib 
import matplotlib.font_manager as fm 
originalFilelist = fm.findSystemFonts()

import numpy as np
import matplotlib.pyplot as plt

# インストール済みフォントの表示
originalFilelist
```

```py
# 日本語フォントの存在を確認
fm.findfont('TakaoGothic')
```

## 日本語フォントのテスト

```py
%matplotlib inline

plt.ion()
fig2 = plt.figure()
axl = fig2.add_subplot(1,1,1)
data1 = np.arange(1001)
matplotlib.rc('font', family='TakaoGothic')
line1, = axl.plot(data1[:], label="あああtest Value")
axl.legend(loc="best")
csfont = {'fontname':'TakaoPMincho'}
hfont = {'fontname':'TakaoPMincho'}
display(fig2)
```

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Sublime Text で Package Control が動かなくなった場合の対処

## 症状

Sublime Text 3.2.2, Build 3211

- コマンドパレットに `install package` と打ち込んでも候補が出てこない
- `remove package` など他のコマンドも出てこない
- package control 自体はインストールできているはず・・・
  - 以前 emmet をインストールしたときは普通に動いてたんだけどなぁ！？

## やったこと

ignored_packages の確認
https://qiita.com/TTT00x/items/380e2b67e8bfdbd4eb99

→ 直らず。そもそも ignore されているわけではなかった。

--

Package Control の再インストール

1. メニューの [Prefernces]-[Browse Packages…] をクリック
2. `Installed Packages/Package Control.sublime-package` を削除
3. メニューの [Tools]-[Install Package Control…] をクリック

で無事に直りました。
Angularの状態管理ライブラリNgxsについて簡単にまとめます

先日、Vue.jsの状態管理ライブラリであるVuexの記事を書きました。

この流れでAngularのまとめもしてみようと思います。

# NgXs４つの概念
- Store...Stateの状態などActionの呼び出しや状態のSelectも行う。グローバルコンテナ
- Actions...状態を変化させるActionとそのメタデータを定義するクラス
- State．．．状態を定義するクラス
- Selects...状態の特定の断面を取り出す関数


## Actionの定義
Ngxsの公式サイトのサンプルコードを見ながら理解を深めて行きたいと思います。

以下は
Animalを追加するActionを定義しています。

```ts
export class AddAnimal {
  static readonly type = '[Zoo] Add Animal';
  constructor(public name: string) {}
}
```

## Actionの呼び出し
ZooComponent内で先程定義したAddAnimalを`dispatch`（呼び出し）しています。


```ts

import { Store } from '@ngxs/store';
import { AddAnimal } from './animal.actions';

@Component({ ... })
export class ZooComponent {
  constructor(private store: Store) {}

  addAnimal(name: string) {
    this.store.dispatch(new AddAnimal(name));
  }
}
```

また、以下のように記述することで、複数のActionを同時にdispatchすることができます。

```ts
this.store.dispatch([new AddAnimal('Panda'), new AddAnimal('Zebra')]
```


## Stateの定義

```ts
import { Injectable } from '@angular/core';
import { State, Action, StateContext } from '@ngxs/store';

export class FeedAnimals {
  static readonly type = '[Zoo] FeedAnimals';
}

export interface ZooStateModel {
  feed: boolean;
}

@State<ZooStateModel>({
  name: 'zoo',
  defaults: {
    feed: false
  }
})
```

`@State`デコレータにより、Sstateクラスであることを宣言し、引数として渡された`ZooStateModel`のデータを保持します。


```ts
Component({ ... })
export class ZooComponent {
  // Reads the name of the state from the state class
  @Select(ZooState) animals$: Observable<string[]>;
```

コンポネントからは`@Select`デコレータによりStateからデータを呼び出すことができます。


AngularのNGXSについて簡単にまとめたみました。

多分間違っている箇所あると思うので、見かけた方はご指摘くだされると嬉しいです。
AirflowのSecrets Backendsを読み解く

* 個人的に調べたのでメモ

# Airflow Secrets Backendsとは

Airflowが利用する設定周り、Config、Variables、ConnectionsをAirflow外部で管理するための機能
管理画面からは見れない、実行時に毎回取りにいく形になる

## AWSをSecrets Backendsとして調べてみた

AWSの外部接続サービスとして、SSMとSecretsManagerが用意されている。

https://airflow.apache.org/docs/apache-airflow-providers-amazon/stable/secrets-backends/index.html

利用可能バージョンは、SSMは`1.10.10`、SecretsManagerは`1.10.11`から可能となります。

## 利点

- 管理画面、Airflow CLIなどで毎回設定を追加しなくて良くなる
  - 一つのリポジトリを複数人で開発する場合、追加、変更を意識する必要がなくなる

## 欠点

- Secretの管理費、取得回数による費用が増える
 - [AWS料金表](https://aws.amazon.com/jp/secrets-manager/pricing/)
 - 一ヶ月使った例
     - Connection 10 個 (シークレット 10 × 0.40/month = 4$)
     - 一日1000回 API (コール 1000 × 30 × 0.40/10000コール = 1.2$)
     - 合計 5.2$

## 設定方法

### airflow.cfgの設定(Airflow1.10.10以降の場合)

SecretsManager(1.10.11)を利用する場合は以下のように設定

```
[secrets]
backend = airflow.contrib.secrets.aws_secrets_manager.SecretsManagerBackend
backend_kwargs = {"connections_prefix": "airflow/connections", "profile_name": "default"}
```

- connections_prefix
  - default: `airflow/connections`
  - SecretsManagerのシークレット名のprefixを設定する
  - SecretsManager側では、`airflow/connections/{connection name}` として設定する
  - 呼び出し側では、aws_hook(などのhook)の引数としてaws_conn_idに`{connection name}`を設定してと実行する
  - 実行時に、`airflow/connections/{connection name}`でprofile_nameのアカウントから値を取得して利用することができる
- profile_name
  - default: None
  - SecretsManagerで値を取りに行くアカウント情報
  - なければ環境変数、インスタンスロールとか見に行くはず
- variables_prefix
  - default: `airflow/variables`
  - 試してないのでコード参照

### airflow.cfgの設定(Airflow2系の場合)(試してはいない)

Airflow SecretsManagerを利用する場合は以下のように設定

```
[secrets]
backend = airflow.providers.amazon.aws.secrets.secrets_manager.SecretsManagerBackend #ここのproviderのパッケージの位置が2.0から変更されている
backend_kwargs = {"connections_prefix": "airflow/connections", "profile_name": "default"}
```


### SecretsManager側の設定

- airflow.cfgの`[secrets]`で設定されたアカウントのSecretsManagerに`airflow/connections/{connection name}`のシークレット名でSecretsValueを登録する
- SecretsValue
  - プレーンテキストで、URI形式で記述する必要がある(キー、バリューでは設定できない)
  - Connection-TypeがAWSの場合(`アクセスキー`と`シークレットキー`の場合、最後`@`を忘れずに)
        - `aws://AKIAIRI1111111111:xxxxxsxadgfasdgsdfgofdsgfa@`
  - Connection-TypeがAWSの場合(`AssumeRole`を利用する場合(Extraの使い方))
        - `aws://?role_arn=arn%3Aaws%3Aiam%3A%3A240057002457%3Arole%2FWebIdentity-Role`

### 最後に

- 思ったほど参考となる資料がなかった
- 設定をみるとわかるようにConnectionsしか確認していない
- Configを状況に応じて変更する運用などが見えてきていない
- 個人メモなので間違いあれば指摘ください

### 参考資料

[Apache Airflow](http://airflow.apache.org/)
[AWS](https://aws.amazon.com/jp/)

### コード

[SecretsManagerのSecret Backendsの仕組み](https://github.com/apache/airflow/blob/1.10.11/airflow/contrib/secrets/aws_secrets_manager.py)
[Connection-TypeAWSの仕組み](https://github.com/apache/airflow/blob/1.10.11/airflow/contrib/hooks/aws_hook.py) 

### 設定

[SecretsManagerのSecretsValueの設定例](http://airflow.apache.org/docs/apache-airflow-providers-amazon/stable/connections/aws.html)
Anacondaマスターになろう(省略Ver)

今回の記事では、「Anaconda」の基本的な使い方をみていきます。

「Anaconda」は仮想環境を作成できるものです。

仮想環境とは、自分のPCの上に仮想的なPCを作成するようなものです。

詳しくはこちらなどを参考にしてください。

「Anaconda」は簡単に仮想環境を作成しつつ、色々なことができるので初学者にとっては特におすすめです。

より詳しく見たい方はこちらを参考にしてください。

[Anacondaマスターになろう](https://www.cardenema.com/?p=203)

では早速みていきましょう。

## Anacondaのインストール

[こちら](https://www.anaconda.com/products/individual)からインストールしてください。

## 基本的なコマンド

### 仮想環境の作成

```zsh
# conda create -n 環境名 python=python-version
conda create -n cardene python=3.8
```

### 仮想環境の確認

```zsh

conda info -e
```

### 仮想環境の有効化

```zsh

# conda activate 環境名
conda activate cardene
```

### 仮想環境に切り替え

```zsh
# conda activate 環境名
conda activate cardene
```

### 仮想環境から抜ける

```zsh
conda deactivate
```

### 仮想環境の削除

```zsh
# conda remove -n 環境名 --all
conda remove -n cardene --all
```

## 最後に
今回はAnacondaで仮想環境を作成する手順をみてきました。

基本的な使い方のみ解説してきたので、今後記事のアップデートをしていきます。

一緒にAnacondaマスターになっていきましょう！

それでは！
HoloLens 2、認証なし、警告表示なしでデバイスポータルにアクセスして効率をあげたい

# 追記
* 2021/3/23 調査不足でした。現在、再調査中です。

# 環境
* Windows 10
* Chrome 88.0.4324.190 / Microsoft Edge バージョン 88.0.705.81
* HoloLens 2 (USB 接続)

# ~~うまくいくURL~~

* 暗号化された通信ではないので注意が必要。127.0.0.1の場合は、外にまったく出ないと思ってよいのだろうか。

http://user:password@127.0.0.1:10080
http://user:password@localhost:10080


# ~~うまくいかなないURL~~

https://user:password@127.0.0.1:10080
https://user:password@localhost:10080

# おまけ
* System - Preferences で Sleep時間を長めに設定しておくとよいかもしれない。

![ss04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083912/ead57013-a082-39a6-7719-5b7a2427c43f.png)
Rで重回帰分析のステップワイズで特定の変数を残したい

Rを使って重回帰分析したあと、ステップワイズ法で変数選択をしてモデルの最適化を図ることはよくある。
その時に、理論的にある変数は必ず残したい、ということがある。そんな時の方法。

```r
r.lm1 <-lm(`sQ1-1`~f1+f2+f3+f4+f5+f6+f7+`fQ5-1`+`fQ5-2`,
                na.omit(dataset[c("sQ1-1","sQ1-2","f1","f2","f3","f4","f5","f6","f7","fQ5-2","fQ5-1")]),
                )
summary(r.lm1)
summary(step(r.lm1, scope=list(lower=`sQ1-1`~`fQ5-1`+`fQ5-2`, upper=r.lm1),trace=FALSE))
```

ポイントは、`scope=list(lower=****,upper=****)`というところ。ここのlowerの方に、残しておきたい変数だけのモデル式を設定しておくとよい。
Blockchain 基礎知識

# ノード
 - P2Pネットワークに接続されている``個々のコンピュータ端末``
 - ルーティング, ``ブロックチェーンデータベース``, マイニング, ウォレット

# ICO
 - 仮想通貨（暗号資産）の新規発行による``資金調達方法``の1つ
 - ``Initial Coin offering``の略

# ECR20
 - ICOで使われるトークンの技術的な``統一規格``
 - ``Ethereum Request for Comments：Token Standard #20``の略

# Ganache
 - ``プライベートチェーン``構築サービス
 - ``ローカル``でスマートコントラクトのテスト実施可能

# Truffle
 - スマートコントラクト開発の``フレームワーク``
 - ``アプリケーション開発``に特化

# 参考文献
 - [ノード（Node）](https://bitcoin.dmm.com/glossary/node)
 - [「ERC20」とは？初心者向けに仮想通貨の専門用語を解説！](https://bitdays.jp/money/blockchain/cryptocurrency/cryptocurrency_other/12881/)
 - [ICO](https://bitflyer.com/ja-jp/glossary/ico)
 - [OpenZeppelinとTruffleを使ったトークン開発方法](https://block-chain.jp/ethereum/token-with-truffle-openzeppelin/)
初学者のJavaScript　配列をクリックで変更する

##クリックにより配列（画像）を順番に表示する

```javascript
let current = 0;
const array = ['A','B','C',...]
   function changeArray(num){
     if (current + num >= 0 && current + num < array.length) {
      current += num;
      document.getElementById('arrayA').src = array[current];
     };
   };

  document.getElementById('A').onclick = function() {
    changeArray(-1);
  };
  document.getElementById('B').onclick = function() {
    changeArray(+1)
  }
``` 

配列arrayに含まれている要素（画像）をクリックによって変更するため、A,Bをクリックするたびに関数changeArrayを呼び出している。クリックした際に引数を持たせており、変数currentとif文内で計算、その結果を配列番号として参照し順番に要素を取り出すようにした。

また、実行範囲を
``current + num >= 0 && current + num < array.length``
とすることで、配列に存在する要素の数以上に処理を行わないようにしている。

## さいごに
プログラミングの初学者です。その日に学んだことを学習の一環としてアウトプットしていますより深く学習していきたいと考えておりますので、ご指摘等いただけますと幸いです。

参考図書：確かな力が身につくJavaScript「超」入門　第２版　著者：加納祐東
Qiita Daily Survey memo 2021.03.05

# Qiita Daily Survey memo 2021.03.05
Qiita の記事を可能な限り毎日読むために、読んだmemoを公開することでモチベーションを維持しようという試み。

## [【Windows 10 なら追加費用なしで利用可能】Power Automate Desktop for Windows 10 の利用開始手順](https://qiita.com/maekawawawa/items/9edbd4c33b780fb2b8ec)
Maekawa(maekawawawa)さんの記事
windows10 ユーザであれば、追加費用なしで Power Automate Desktop が利用可能になったため、インストールしてみた、という記事になります。
私は Power Automate Desktop を知りませんでした…。
しかし、（記事作成はさぼってましたが！ましたが！！）昨日(3/4)と今日(3/5)ランキングに記事があったので「どうやらっょっょツールっぽい…？」ということで調べてみました。
こちらもmaekawaさんの記事ですが、こちらに機能が列挙されているようです。
[【Power Automateの新しいRPA機能】Power Automate Desktopで出来ること（全33機能の紹介）](https://qiita.com/maekawawawa/items/e171240843e56d98be56)
「こういうことやりたいからプログラム組んで」と言われればできますが、ぽちっと押すだけで自動化できるのは破壊力半端じゃないですね…。
インストールも、インストールツールを落としてきて、利用規約読んで、あとはぽちぽちだけっぽいのでとっても楽です。
試してみたい…。と、maekawa さんが、トライアルと操作方法を記事にまとめてくださっているので、こちらでお勉強したいと思います！
[【Power Automateの新しいRPA機能】Power Automate Desktopのトライアル開始手順](https://qiita.com/maekawawawa/items/7460ea11601f880d8a90)
[【Power Automateの新しいRPA機能】Power Automate Desktopの操作方法(ExcelとWebブラウザ操作の自動化)](https://qiita.com/maekawawawa/items/ba6a4e8e8c72bd549e0a)


## [Power Automate Desktop 無償化にあたっての検証](https://qiita.com/vicugna-pacos/items/968888bf228fa1fd59b1)
vicugna-pacos さんの記事。
Power Automate Desktop 無償化でどこまでできるの？というのを検証してくださった記事になります。
使い方まだわかっていないのですが、クラウド上で動作する「クラウドフロー」から、デスクトップフローを実行するには有償版が必要とのこと。
逆に、作った人の分（デスクトップフローというそうです）は、実行できそう…なのかな…？
他の人に渡したり、とかのボタンは見当たらないとのこと。
「こういうの便利だから作ってみた！使って使ってー！」ができたら便利だとは思いますが、いったん自分の作業を自動化するだけでも威力半端じゃなさそう…。
検証ありがとうございます！！


## [カフェでプログラミングしてる風（でも何もやってない）Java（クソ）コード](https://qiita.com/3S_Laboo/items/660883a0184dabaea65b)
3S_Laboo さんの記事。
記事の概要まとめるのが難しかったので引用で…！
>今日は、カフェでMacを使っている時に周りから
「お、この人Macで何かやってるな。何か難しそうな事をしているからエンジニアなんだな。素敵だな。」
と思わせる素敵な（Kuso）プログラムを用意しました。

クスッと来てしまうような内容の記事でしたが、着眼点がすごくおもしろかったです。
また、組み合わせたり、速度を切り替えたりで、もっと「それっぽく」できそうだなと思いました。
まさに「無駄に洗練された無駄のない無駄な動き」を目指して…！


## [転職のために開発を始めたい方へのアンチパターン](https://qiita.com/tomotakasg/items/15e845ceb90ed71efc1f)
tomotakasg さんの記事。
転職ポートフォリオに書けるGitリポジトリない…という方向けに、こういうのは避けた方がいいよ、という記事になります。
最後のコメントが特に参考になりました。
自分視点で「やらなきゃやらなきゃ！」になってましたが、企業側に立ってみればそんな細かいところまで見るものではなく、「お、よさそうねー」くらいのものですよね。
Qiita Survey でやってみたいネタがたまって（積み重なって！！）いるので、1個ずつ手を付けて行こうと思いました。


## [Kaggle初心者の1.5歩目(初心者向けコンペ紹介)](https://qiita.com/abe_yu/items/e58fae1fee185a909318)
abe_yu さんの記事。
Kaggle を始めたばかりの人向けに、こんなサイトがあるよ、こんなコンペがおすすめだよ、を紹介してくださっている記事です。
ありがたやぁ……！！
Kaggle に限らず、他のコンペも紹介してくださっており、視野が広がります。
業界知っている方が、ビギナー向けに「これおすすめだよ」してださるのは、ほんっとうに助かります…ありがとうございます…！！
…Kaggle の刺激を受ける記事が続いているため、そろそろ so heavy 腰を上げる時…？
【ubunutu】swapの無効化

<h1>背景</h1>
swapがfullになってPCがフリーズする事が多々
swapを無効にすれば解消される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/e48f99df-5c4c-5fc9-01f3-87f3da6fa263.png)


<h2>swapの無効化</h2>
swapをoffにする

```
sudo swapoff -v /swapfile
```

以下のラインをコメントアウト
```
sudo gedit /etc/fstab
# /swapfile swap swap defaults 0 0
```

swapファイルの削除

```
sudo rm /swapfile
```


再起動
```
sudo reboot
```
LINQ For Cpp

# 概要
* C++で使えるLINQライブラリでネイティブに近い速度が出ます。
* また遅延実行を行う事によってネイティブより早く動いたりもします。
* Github Actionsで随時パフォーマンス測定しています。参考にどうぞ
  https://harayuu9.github.io/LinqForCpp/

# 環境
C++17以上
VC++, clang, gcc

# 導入
githubリポジトリのReleaseからダウンロードして導入します。
https://github.com/harayuu9/LinqForCpp
最新のReleaseの**LinqForCpp.zip**をダウンロードして展開します。
**Linqフォルダ**もしくは**SingleHeader/Linq.hpp**をプロジェクトに入れます。

Linqフォルダを要れた場合は**Linq/Linq.h**
SingleHeaderを要れた場合は**Linp.hpp**をインクルードします。

## Linq.h vs SingleHeader/Linq.hpp
どちらも使える関数は同じですがSingleHeaderじゃないほうがデバッグビリティが良いのでおススメです。

# サンプル
といってもLINQなので使える関数は他の解説に投げつけます。
https://qiita.com/nskydiving/items/c9c47c1e48ea365f8995

## 基本

``` main.cpp
#include "Linq.h"
// もしくは
#include "Linq.hpp"

int main()
{
    // std::begin(arr), std::end(arr)を呼べるコンテナであればSTLでも配列でも自作コンテナでもなんでも使えます
    std::vector<int> arr = { 0, 3, 6, 1, 60, 35 };

    // コンテナに対して "<<" 演算子でLinqします。
    auto strArray = arr
        << linq::Where( []( const int val ) { return val > 10; } )
        << linq::Select( []( const int val ) { return std::to_string( val ); } );

    // マクロを使うことでより簡単にC#に近い形で掛けます
    auto macroStrArray = arr
        << WHERE( val, val > 10 )
        << SELECT( val, std::to_string(val) );

    // linq::ToVector(), linq::ToList() で
    // std::vector,std::listに変換できます
    auto str = strArray << linq::ToVector();

    // 範囲Forで回せます
    // もしLinqの結果をコンテナで受け取る必要のない場合 
    // linq::ToVector()でコンテナ化するより高速に動作する事が多いです
    for ( auto&& val : strArray )
    {
        std::cout << val << " ";
    }
    // {"60", "35"}
}
```

## Allocation
STLをデフォルトのAllocatorで使えるプロジェクトはここは読み飛ばしても大丈夫です。
**Linq/Allocator.h**を書き換えることで独自のAllocatorを差し込むことが出来ます。(ToVector()等以外にも内部でAllocationを起こす関数があるので注意してください)
Allocator.hのサンプルを書いておきます。

``` Allocator.h
#pragma once
#include <cstdlib>

namespace linq {

// custom Allocator
template<class T>
struct Allocator
{
    using value_type = T;

    Allocator() {}

    template <class U>
    Allocator(const Allocator<U>&) {}

    T* allocate(const std::size_t n)
    {
        return static_cast<T*>(::operator new(sizeof(T)*n));
    }

    void deallocate(T* p, const std::size_t n)
    {
        ::operator delete(p, n);
    }

    template <class U>
    bool operator==( const Allocator<U>&) const
    {
        return true;
    }

    template <class U>
    bool operator!=(const Allocator<U>&) const
    {
        return false;
    }
};
}
```

# 最後に
足りない機能や高速化についてはIssueかPRしたください。
kintone REST API：GETのURL文字数制限を回避

#問題
Google Apps Script で kintone REST API を実行する際、
GET の query が長くなるなどで下記エラーとなることがあります。
Exception: Limit Exceeded: URLFetch URL Length.

Google Apps Script では URL の長さは 2kB に制限されているようです。
https://developers.google.com/apps-script/guides/services/quotas

#回避案

カーソルを用いたレコード一括取得で回避する例です。

カーソルAPIの本来の目的は、大量のレコード取得を高速に行うことだと思いますが、
https://developer.cybozu.io/hc/ja/articles/360028843531

query を POST でリクエストできることを利用しました。
https://developer.cybozu.io/hc/ja/articles/360029152012


以下は typescript（clasp）での実装例ですが
公式ドキュメントの方が分かりやすいかと思います。

```KintoneApi.ts
type Method = GoogleAppsScript.URL_Fetch.HttpMethod;
type Payload = GoogleAppsScript.URL_Fetch.Payload;
type Options = GoogleAppsScript.URL_Fetch.URLFetchRequestOptions;

export default class KintoneApi {
	private host = 'foo-host';
	private user = {
		id		: '',
		password: ''
	};
	constructor(userId: string, password: string) {
		this.user.id = userId;
		this.user.password = password;
	}

	private fetch(endpoint: string, method: Method, payload?: Payload) {
		const options: Options = {
			method	: method,
			headers	: {'X-Cybozu-Authorization': Utilities.base64Encode(this.user.id + ':' + this.user.password)},
		};
		if (method != 'get') options.contentType = 'application/json';
		if (payload) options.payload = JSON.stringify(payload);
		const resp = UrlFetchApp.fetch(`https://${this.host}.cybozu.com/k/v1/${endpoint}`, options);
		return JSON.parse(resp.getContentText());
	}

	public getByCursor<T>(appId: number, query: string, fields?: string[]): T[] {
		const payload: Payload = {
			app		: appId,
			query	: query,
			size	: 500
		};
		if (fields) payload.fields = fields;
		const cursor: {id: string} = this.fetch(`records/cursor.json`, 'post', payload);

		try {
			type CursorResp = {records: T[], next: boolean};
			const ret: CursorResp = {records: [], next: true};
			while (ret.next) {	//GASでは非同期とならない
				Utilities.sleep(1000);
				const resp: CursorResp = this.fetch(`records/cursor.json?id=${cursor.id}`, 'get');
				ret.records.push(...resp.records);
				ret.next = resp.next;
			}
			return ret.records;
		} catch (err) {
			try {
				Utilities.sleep(1000);
				this.fetch(`records/cursor.json`, 'delete', {id: cursor.id});
			} catch (delErr) {
				// do nothing
			}
			throw err;
		}
	}
}

```


```exec.ts
import KintoneApi from 'path/to/KintoneApi';

const kintone = new KintoneApi('fooId', 'fooPassword');
const records = kintone.getByCursor<any>(0 /* appId */, 'very long query string over 2kB...');
```
Nand2Tetrisの旅にでた


『コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方』という本の読書ログを書きました。
今回はまえがき、イントロダクションまでです。



[コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方 | Noam Nisan, Shimon Schocken, 斎藤 康毅 |本 | 通販 | Amazon](https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E2%80%95%E3%83%A2%E3%83%80%E3%83%B3%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-Noam-Nisan/dp/4873117127)





## 本書を手にとった理由

もともとコンパイラとかOSをつくることに憧れがあり、[低レイヤを知りたい人のためのCコンパイラ作成入門](https://www.sigbus.info/compilerbook)に一度チャレンジしたのですが、早々と挫折してしまった今年の初夏、、、
上記Cコンパイラづくりのslackコミュニティに『コンピュータシステムの理論と実装』を経て参加してる方がいたので、わたしもそうすることにしました。なので本書で力をつけて、Cコンパイラづくりに再チャレンジしたいというのが理由です。



## 本書の概要

* コンピュータ・サイエンスの入門書としてかかれたもの。主に欧米の大学で使用されてきた教科書。
	* 原書の出版は2005年。邦訳は2015年。
* 本書を通して、読者はコンピュータをゼロからつくる。それによってコンピュータを深く理解する。
	* ゼロからつくる = 論理ゲートだけを用いてコンピュータの構築を行う。
* 全12章。章はそれぞれ自己完結(独立)しており、好きな章から取り組んでもよい。
	* 最初はNANDという単純な電子ゲートから、そして最終的にTetris(テトリス)がつくれるそう。なので本書は『Nand2Tetris』と呼ばれることもあるそう。
* 本書でコンピュータサイエンスに関する基本的なことは説明されているらしいので、ある程度プログラミングに関する知識があれば、初学者でも大丈夫そう。
*  公開オンライン授業(Coursera)もあった。
	* [Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course) - ホーム | Coursera](https://www.coursera.org/learn/build-a-computer/home/welcome)




## まえがき、イントロダクションまで読んでの感想

* 聞いたこともない単語や、難しそうだなと思うところもあるが、ワクワクする。
	* 特に「イントロダクション:こんにちは、世界の下側」には知的好奇心をとても掻き立てられた。読み物としても面白い文章だった。
		* "抽象化"おもしろそう。
* 今のところすべての章を読みたい野心はあるが、挫折しそうな気がする。わたしはCコンパイラをつくりたいので、ひとまずコンパイラに関係ありそうな章を一通り読むことを目標にする。
* 本書は今年購入した本の中で、最も心待ちにしていた本のひとつだった。にも関わらず、年末までなかなか取りかかれず。今回のアドベントカレンダーに参加しなければ積ん読期間はもっと伸びていただろう。きっかけに感謝。

* 最後に特にいいなあと思った文章。
> 現代のコンピュータシステムは巨大な氷山のようなものであり、人の目が届くのは、その表面だけである。<中略>しかし、もしあなたが、その表面の下に隠れている未開の地を探索したいと思ったならば、それはとても幸運なことである！そこには魅力的な世界が待ち受けている。
そして、その世界はコンピュータサイエンスで最も美しいアイデアと技術から作られている。
まえがきより


* "コンピュータサイエンスで最も美しいアイデアと技術"を確認したい！
EC-CUBE4 プラグイン開発 PluginManager の状況別実行関数

EC-CUBE4 プラグイン開発では、 **PluginManager** でプラグインのインストールや有効時の処理を記述します。
管理している状態は以下の4つです。

- install (インストール時の処理)
- uninstall (アンインストール時の処理)
- enable (有効化時の処理)
- disable (無効化時の処理)

インストールを行った時にはもちろん、**install( )** が実行されるわけですが、例えば、 **有効時にアンインストールした場合**　と **無効時にアンインストールした場合** は、どのような挙動を取るのでしょうか？

以下にまとめました。

## 実行コマンド

EC-CUBEに実装されている、開発用のプラグイン操作コマンドを使用しました。

```php
bin/console eccube:plugin:install
bin/console eccube:plugin:uninstall
bin/console eccube:plugin:enable
bin/console eccube:plugin:disable
bin/console eccube:plugin:update
```

## 状態別実行関数とその順序
順番に実行される関数を表記します。

```php:インストール時
install()
のみ
```
```php:有効化時
enable()
のみ
```
```php:無効化時
disable()
のみ
```
```php:無効化状態からアンインストール
uninstall()
のみ
```
```php:有効化状態からアンインストール
disable()
からの
uninstall()
```
```php:有効化状態からアップデート
update()
のみ
```
```php:無効化状態からのアップデート
update()
のみ
```

問題になりそうなのは、アップデート時の挙動です。
有効・無効どちらの状態でも、 **update()** しか呼ばれないため、 無効状態でフラグを **false** にし有効では **true** といった新機能を実装した場合、**プラグインの今の状態がなにか**を判定しないと、意図しない挙動となる可能性がありそうです。

例えば

```php
public function enable()
{
  // データベースの特定レコードのフィールドを true にする処理
}

public function disable()
{
  // データベースの特定レコードのフィールドを false にする処理
}

public function update()
{
  // データベースの特定レコードのフィールドを false にする処理
}
```
この場合、有効時に利用者がプラグインをアップデートすると、フィールドの値は **false** になってしまいます。

## 個人的には

この挙動から、有効時の **update( )** 時では、
**disable( )を実行してから、update( )を実行し、 enable( )が実行される** という挙動の方が、開発側の負担は少ないのかなと感じました。
動作的にも、 **disable( )** の実行時には、破壊的な処理は行わないと思いますので。
```
Vim新しく覚えたシリーズ2 (挿入ノーマルモード)

#概要
vim歴 10年でも、何となく使ってなかった(基本的)機能がいっぱいあるので、
たまに新しいことにチャレンジして記録しようと思った。

挿入ノーマルモード。
インサートモードから１コマンドだけノーマルコマンドを挟める。

(他記録は[こちら](https://qiita.com/yo314159265/items/97a823bc5d11b5f1e158))
#内容
##環境
macOS Catalina
VIM - Vi IMproved 8.1 macOS version Normal version without GUI.
##使ってみた
```:tmp.txt
word
```
①`r`で挿入モードで待機
②**&lt;C-o&gt;**(ｺﾝﾄﾛｰﾙ･ｵｰ)を押したのち、**l** (ｴﾙ)を実行(カーソルは右に1つ移動する)
③ **l** (ｴﾙ)を入力し、**&lt;C-[&gt;**を押した
できた！

```:tmp.txt(最終)
world
```

##まとめ
挿入モードで**&lt;C-o&gt;**を押すことで挿入ノーマルモードに入り、
ノーマルコマンドを１コマンド実行後、挿入モードに戻る。
##蛇足
本で紹介されていたような**zz**のような画面遷移のコマンドでも活用できそう。
#参考にさせていただいた頁・本
『実践Vim　思考のスピードで編集しよう』Drew Neil著 新丈径訳 ASCII 2014年
#感想
挿入モードで移動したくなるたびに、「emacsなら楽なのかな。。」とか思っていたのは、
私が全面的に悪かったです。
#今後
移動コマンド・画面遷移コマンドどちらでも活用していきたい。
Android App Bundle で戸惑ったこと (Unity)

# はじめに
少々時間を無駄にしたので、ここに書き留めます。

#### 環境
- Unity 2018.4.x

# 得た知見

## aabのBuild&Runでは、エラーせずとも実行されない場合がある
- aabをBuild&Runした場合、端末への転送に失敗してもエラーにならず、インストール済みのバージョンが起動されます。
    - 転送に失敗する場合は、署名が違うとか、バージョンダウンだとか、色々あります。
- なお、既にアプリが起動中だった場合は再起動されません。
    - 従って、ビルド開始時にあらかじめ旧版を起動しておけば、再起動するかどうかで成否を確認可能です。

## aabとapkでは挙動が異なる場合がある
- 同じソースでビルドしても、aabとapkでは挙動が異なる場合があります。
    - 具体的には、アセットの読み込み時に、apkには存在しない遅延が、aabでは生じることがあります。
    - apkは最初に全てロードしますが、起動を早めるために、aabでは必要になってからロードするのでしょうか。

# さいごに
- 転送に失敗していることに気付かず、特定のソースだけがコンパイルから漏れているのかと考えて、試行錯誤してしまいました。
- 挙動が異なるのは、ソースが巻き戻っているのではないかと疑ってしまいました。
Laravel + Backpack で users 以外のテーブルを管理者用に使う

Laravel の Auth の既定では users テーブル登録のユーザーが対象となります。
これを変更して別のテーブルを使用するには、config/auth.php の中の設定を変更します。
例えば、admins というテーブルのユーザーに変えるには、

    'defaults' => [
        'guard' => 'web',
        // 'passwords' => 'users',　　<--- これのかわりに
        'passwords' => 'admins',　<--これに代える
    ], // 以下略

これについては、n_oshiumiさんの記事<a href="https://qiita.com/n_oshiumi/items/a466ff2c8f20c3494538">【Laravel】usersテーブルではない別のテーブルで認証をする</a>が詳しいです。

さて、Laravel 用の管理ページ作成ツール <a href="https://backpackforlaravel.com/">Backpack</a> をインストールすると、上記の設定があっても、既定の users テーブルが Auth の対象となります

これは、Backpack の設定で Auth の既定が users になっているためで、Laravel の config.auth の設定はそのまま残っています。

Backpack の設定ファイル（config/backpack/base.php）の下記の箇所を変えることで、laravel で別テーブルの設定を再び使えるようになります（208行付近以下）

    /*
    |--------------------------------------------------------------------------
    | Authentication
    |--------------------------------------------------------------------------
    */

    // Fully qualified namespace of the User model
    // 'user_model_fqn' => config('auth.providers.users.model'),　<-- これを
    'user_model_fqn' => config('auth.providers.admins.model'),　　　<-- これに代える
    // 'user_model_fqn' => App\User::class, // works on Laravel <= 7
    // 'user_model_fqn' => App\Models\User::class, // works on Laravel >= 8

上記は、Laravel 6 の場合です。Laravel 7, 8 はそれぞれ書き方がことなりますので要注意です。

環境: Laravel 6, Backpack 4.1
覚えておきたいLinuxコマンド

# Linuxコマンドとは
PCへ操作を命令する為のコマンドです。
ターミナルでは Linuxコマンド の入力でPCに様々な命令を与えることができます。

##コマンドの使い方
ターミナルで使いたいコマンドを入力し、エンターキーを押しましょう。
結果が表示されれば成功です！！


```ruby:【例】pwdコマンドを使って現在いるディレクトリの位置を表示する
% pwd

# 下記は結果の一例です。カレントディレクトリー（現在のディレクトリ）が表示されていれば成功です！
/Users/ユーザ名
```


## Linuxコマンド一覧

|コマンド　　　|説明　|使用例　|
|:-----------|:------------|:------------|
|cd|ディレクトリ（フォルダ）移動|cd 移動したいフォルダ名|
|ls|フォルダの内容をリスト形式で表示する|ls　<br>※必ずcdで中身をみたいフォルダに移動してから使用|
|mv|ファイルを移動|mv (移動元ファイル名/フォルダ名) <br>(移動先ファイル名/フォルダ名)　|
|cp|ファイルやフォルダをコピー|cp (移動元ファイル名/フォルダ名) <br>(移動先ファイル名/フォルダ名)　|
|clear　|消さずに画面を綺麗できる|clear|
|mkdir　|フォルダを作成|mkdir フォルダ名|
|touch|ファイルを作成|touch ファイル名|
|rmdir|空のフォルダを削除|rmdir フォルダ名|
|rm|ファイルやフォルダを削除|rm ファイル名/フォルダ名|
|pwd|現在いる位置を表示|pwd|
|find|ファイルの検索|find / -name ファイル名|
|cat|ファイルの内容を表示|cat ファイル名|
|diff|ファイルとファイルの内容の違いを表示|diff 旧ファイル名 新ファイル名|
|grep|指定した文字列がテキスト内に存在した場合その行を抽出|grep "検索したい文字" * ファイル名|
|chmod|ファイルやフォルダのアクセス権限を変更|chmod 権限ファイル名|
|chown|ファイルやフォルダのオーナーやグループを変更|chown 変更したいユーザー名 変更したいファイル名|
|history|コマンドの履歴を表示|history|
|ln|ファイルやフォルダにリンクを設定|ln リンク元ファイル名　リンク先ファイル名/フォルダ名|
|man|コマンドのマニュアルを表示|man コマンド名|
|apropos|manページの内容を検索|apropos キーワード|
|less|テキストファイルを閲覧|less ファイル名|
|more|ファイルをページ単位で閲覧|more ファイル名|


## 困ったら「man」コマンド！！
「man」コマンドを使用すると、対象のコマンドの使い方や使用できるオプションを調べることができるので便利！

```ruby:【例】manコマンドは以下のように記述します
% man コマンド名
```
【Rubyエンジニア】就職までの完全ロードマップ

1ヶ月間ロードマップ

※Twitterでの発信は同時進行（内容は以下）
学習記録
備忘録
キータ記事

①Ruby学習

→HTML、CSS（テックアカデミーの無料動画）
→プロゲート（Ruby、Railsコース）

※プロゲートの内容が身についたら
→書籍（ここで同時進行ポートフォリオ作成）

ポートフォリオ作成（Docker、AWS）

→Git、GitHub学習（1時間）
チーム開発のしやすくするので、現場で即戦力になるため。
コードを一括管理してくれる。

ーーー

就職応募
※最低10社

②
Twitter
Wantedly
IT、WEB専門エージェント
（GEEKLY、ポテパン、レバテックキャリア）


ーーー

面接対策

③
なぜエンジニアになりたいのですか？
なぜエンジニアを目指すのか
エンジニアとして何をしたいのか



現在これをもとに就職活動をしています。大前提としてRubyの開発スキルは求められるので、開発環境やツールも追加していくつもりです、しかし、全てやる必要はなく、現場に出てもひたむきに学習を継続できるスキルを強調するために学習をすすめるといいと思っています。
動画を管理してまとめるのが面倒くさかったの管理ファイルを作成してみた。

# 動画を管理してまとめるのが面倒くさかったのでレポジトリを作成してみた。
以下がレポジトリ用に作成したファイル。

```xml:movie.mvx
<xml><!--scriptタグも追加できる-->
<prn0><!--1つ目の動画はprn0,2つ目はprn1...-->
<dir>D:\DATA\BGM\Ginger\探してたあの神社\Append\7010-はるかぜ神社.mp3</dir><!--参照先-->
<ext><div class="mp3"></div></ext><!--拡張子-->
<name><ja>はるかぜ神社</ja><en>The Harukaze Shine!!</en></name><!--管理名-->
<length>0:02:33</length><!--曲の長さ-->
<tag>神社アレンジ,クッキー,cookie</tag><!--ハッシュタグ-->
<licence>CC-BY-SA</licence>
<remark>Remark.httn</remark><!--追加するmarkdownテキスト-->
</prn0>
</xml>
```
Remark用ファイルも以下の様に作成。人が読む文章である。分かりやすく丁寧に書くと良い。

```markdown:Remark.httn
# 備考
!>[はるかぜ神社動画の埋め込み](D:\DATA\BGM\Ginger\探してたあの神社\Append\7010-はるかぜ神社.mp3)
## 感想
...
## ページリンク
[はるかぜ神社](https://www.nicovideo.jp/watch/sm22450507)
```

次はこのコマンドで同じ内容の管理ファイルが作成できるようにしたいと思う。

```eirn.ps1
mvprn init #管理ファイルの作成
mvprn tag 0 add @("神社アレンジ","クッキー","cookie") #0を指定しない場合全てが指定される。
mvprn name -ja 0 change "はるかぜ神社"
mvprn name -en 0 change "The Harukaze Shine!!"
mvprn licence 0 add "CC-BY-SA"
mvprn remark 0 add "Remark.httn"
```
gdriveを使ってgoogleドキュメントとローカルのマークダウンファイルを同期させて、アップロードなどを自在に行えるようにする

## 要件、目的
gdriveを使ってgoogleドキュメントとローカルのマークダウンファイルを同期させて、アップロードなどを自在に行えるようにする

## タスクフロー、未完
ログインできるようにする
gdrive listでoauthできるように
google ドキュメントなどを接続

## log
gdriveのインストール 

## 疑問点、課題点
もしこれの最初のoauthでgoogleにブロックされたのちに設定を変更して入れるようになった人がいたら教えていただきたいです、よろしくお願いいたします。

## 参考リンク
aouth関係
https://shiyotsuki.hatenablog.com/entry/2020/02/03/234507
https://support.google.com/a/answer/6260879?hl=ja

予備フローのskickaについて
https://dev.classmethod.jp/articles/skicka-google-drive-cli/
https://frudens.jp/skicka-google-drive-cli-tool-recommended/

https://nelog.jp/hackmd
https://www.google.com/search?q=%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%80%E3%82%A6%E3%83%B3+google&rlz=1C5CHFA_enJP935JP935&oq=%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%80%E3%82%A6%E3%83%B3%E3%80%80google+&aqs=chrome..69i57j0i8i30l6.5764j1j7&sourceid=chrome&ie=UTF-8
https://qiita.com/xx2xyyy/items/451f3e14211d4d3acb1e
https://uxbear.me/markdowndoc/
https://www.subthread.co.jp/blog/20160609/
https://www.google.com/search?rlz=1C5CHFA_enJP935JP935&sxsrf=ALeKk03wt4o0ci8GWxbNAolJ3r6DDmjnrQ:1614874013997&q=markdown+google%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88+%E5%A4%89%E6%8F%9B&sa=X&ved=2ahUKEwiy-Ne_gpfvAhVBUd4KHW8YCwwQ1QIwDHoECBAQAQ
https://qiita.com/mocketech/items/4cd42ac1174dec8858e7#:~:text=%E5%A4%89%E6%8F%9B%E6%89%8B%E9%A0%86%E3%81%A8%E3%81%97%E3%81%A6%E3%81%AF%E3%80%81Typora,%E3%81%A8%E3%81%84%E3%81%86%E6%89%8B%E9%A0%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82
https://www.google.com/search?rlz=1C5CHFA_enJP935JP935&sxsrf=ALeKk02EegaS6Y55D8cfAbeerZDj7fTK_A%3A1614876368872&ei=0A5BYOzaNIHnwQP627boCA&q=gdrive+cli+mac&oq=gdrive+cli+mac&gs_lcp=Cgdnd3Mtd2l6EAMyBQgAEM0COgcIIxCwAxAnOgkIABCwAxAHEB46BwgAELADEB46CQgAELADEAoQHjoECAAQEzoGCAAQHhATOgUIIRCgAToECCEQFVD9O1joQmClR2gBcAB4AIAByAGIAesEkgEFMS4zLjGYAQCgAQGqAQdnd3Mtd2l6yAEIwAEB&sclient=gws-wiz&ved=0ahUKEwjsgsqii5fvAhWBc3AKHfqtDY0Q4dUDCA0&uact=5
https://takuya-1st.hatenablog.jp/entry/2016/07/06/034412
https://rimever.hatenablog.com/entry/2019/10/18/060000_1
https://github.com/google/skicka
https://qiita.com/neustrashimy/items/5973ccefbffdbc243abc
https://github.com/prasmussen/gdrive
俺でもわかるAmazon Business SSO x509証明書更新方法

俺です。

IdPで発行していたAmazon Business SAML SSO用x509証明書の有効期限が切れてしまい
amazon.co.jpに企業アカウントを使ってログインできなくなってしまいました。
amazon.co.jpからのログインでは管理者アカウントでもSSOが強制されているので新しい証明書を更新することができません。

# amazon.co.jp からは管理者アカウントですらSSOリダイレクトされる

すでに証明書の有効期限が切れているので、SSOリダイレクト食らうとログインできません。絶望しかない。
一体どうしたら...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42755/6fb0265e-d5b0-4891-102b-b411e4b9de7d.png)


# Amazon Business管理者アカウントでパスワードログインしたいときはAmazonビジネスログインページから

一体どうすりゃいいんだって適当にググってたらbusiness用ログインページがあったので
なんとなくログイン試したらSSOリダイレクトされずログインできました。
証明書も無事更新できてめでたしめでたし。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42755/b4d5d6d3-5994-1a73-c51c-9c065fbf8ecd.png)


証明書の有効期限が切れる前に交換しよう証明書

ではまた！
非エンジニアも覚えて欲しいMacショートカットキー

#始めに
既にQiitaには数多くのショートカットキーの記事があると思います。しかし、どの記事もいい意味で体系的にまとめられたものであり、数が多すぎて覚え方や活用方法が慣れていない人にはピンと来ないと思います。

あまりショートカットキーを使いこなせていない私でもよく使うショートカットキーを厳選して共有します。
数も少ないのでぜひ全部覚えて作業効率を上げましょう。

#重要度：超高

|ショートカットキー |説明 |
|---|---|---|
|Command + C|コピー  |
|Command + V|貼り付け(ペースト)  |
|Command + A|**全てを選択:** 全てドラッグした状態になります
|Command + Z|**直前の操作を取り消し:** 消した文字や間違えて打った文字の取り消しなどができます
|Command + Y|**取り消しの取り消し:**Command+Zを押しすぎた時に使うと元に戻れます



###コピー&ペースト   `Command + C` , `Command + V`
言わずと知れたショートカットキー界の王者。説明不要。多分知らない人はいない。



###全選択   `Command + A`
使わなそうでめちゃくちゃ使うショートカットキー。
主に文字を一気に消したい時や、全部コピーしたいときに使います。コピーかDeleteとセットで使います。
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218168/afde106b-2b1a-7122-ce8b-122674ffda92.gif)


###操作取り消し   `Command + Z` , `Command + Y`
操作の取り消しは絶対に覚えた方がいいです。こいつがないと生きていけないレベル。
文字を消したけどやっぱり戻したいな…って時によく使います。他にも何かヤバい操作をしてしまった時にもCommand+Zをとりあえず押せば元通りになります。エクセルでもワードでもどこでも使えます。

Command+YはCommand+Zの取り消しです。
ブラウザで例えると、Command+Zは戻る、Command+Yは進むというイメージです。
![ezgif.com-video-to-gif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218168/de614cca-bb1e-51f0-a2c9-32694da8d3ea.gif)


#重要度:高
|ショートカットキー|説明 |
|---|---|---|
|Command + F|**検索:**検索ウィンドウを表示して一致する文字列を検索
|Command + S|**保存**  |
|Command + Shift + Control + 4|**スニッピング:**選択範囲をスクショしてクリップボードに保存
|入力中の`Shift+矢印キー`　|**ドラッグ:**矢印キーの方向にドラッグ
|入力中の`Command+矢印キー`　　|**最端移動:**矢印キーの方向に最端移動
|入力中の`Tab`|**次のテキストボックスに移動**

###検索   `Command + F`
ネットサーフィンしているときに「このキーワード書いてある部分どこだよ！」ってなるときに便利なのが検索。pdfやエクセル,ワードでも大活躍してくれます。エクセルワードで使うときは必ず**置換**もセットで使いこなせるようにしよう。基本的に検索を開けば置換も一緒に出てくれます。
![ezgif.com-video-to-gif (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218168/7833b01a-fa6c-38d3-0fd1-590aab359521.gif)

###保存   `Command + S`
誰しも一度は経験をしたことがある「保存のし忘れ」。私も論文を保存し忘れて泣く泣く修復作業をしました。そんな忘れん坊さんはCommand+Sを押しまくろう。ワード、エクセル、パワポ、テキストエディタ何でも使えます。


###選択スクショをクリップボードへ保存  ` Command + Shift + Control + 4`
地味に知らない人が多い超便利スクショ。スクショを一々フォルダに保存しないで画像を使って軽く説明したい時に便利。
Command + Shift + Control + 4 使ってペースト(Command+V)すれば、選択スクショが簡単に貼り付けられる。
Slack, Twitter, ワードによく使う。Gyazoを使う理由が多分なくなる。

ちなみに` Command + Shift + 4`で通常の選択範囲スクショになります。

###最端移動&ドラッグ    `Command+矢印キー`, `Shift+矢印キー`
数行の文字を消したい時や最端に移動したい時に使います。Finderでもファイル複数選択したい時に`Shift+矢印キー`が便利です。
最端移動&ドラッグのショートカットキーは同時に使えます。

![ezgif.com-video-to-gif (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218168/ab0cbe63-bc2a-d4e2-e72f-af42e7536fe8.gif)


###次のテキストボックスに移動  `Tab`
ログインする際にIDとPasswardを打ち込むと思いますが、`Tab`を使えばIDを入力した後にそのままパスワードを打ち込めるようになります。
地味に便利なのでぜひ覚えましょう。
ちなみに`Shift + Tab`で前のテキストボックスに移動です。
![ezgif.com-video-to-gif (4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218168/b7f0b2b5-4270-50d3-5525-459a91d60330.gif)
Formオブジェクトの概要

# Formオブジェクトとは
Formオブジェクトとは、1つのフォームからのデータ送信で複数のモデル操作、テーブルに保存しない情報にバリデーションを設定したい場合に使います。

モデルに似た機能を持ったクラスを作り、バリデーションやデータを保存する処理を記述して実装します。
実装手順はこんな感じです。

1.modelsディレクトリ直下にファイル作成、クラスを定義
2.include ActiveModel::Modelの設定
3.attr_accessorで保存したい複数のテーブルのカラム名を属性値として扱えるように記述
4.バリデーションを記述
5.データをテーブルに保存する処理を記述
6.コントローラーのnew、createアクションなどでFormオブジェクトのインスタンスを生成
7.フォーム作成の部分をFormオブジェクトのインスタンスを引数として渡す形に変更

以下はコードの一例と内容についてです。

```ruby:qiita.rb

class OrderPurchase  #OrderモデルとPurchaseモデルの処理
  include ActiveModel::Model
  attr_accessor

   #ここにバリデーションなどの記述をする

  def save
   #ここにデータを保存する記述をする
  end
end

```

①include ActiveModel::Model
ActiveModel::Modelをincludeすると、バリデーションなどの機能が使えるようになります。
Railsガイドにも記載がありました。
[Railsガイド](https://railsguides.jp/active_model_basics.html)

②attr_accesor
attr_accesorでは、モデルに対応するテーブルに設定したカラム名以外の属性を扱う時に使用します。
ゲッターとセッター（データの取得と更新）をこの記述だけでできるようになります。

①でモデルの機能が使えるようしているので、②でバリデーションを設定したい属性を指定できるのだと思います。


# おわりに
プログラミング初心者が備忘録としてまとめたので、間違い等あるかもしれません。
新たにわかった事や、間違いがあれば随時更新します。
Go moduleを使ってプロジェクトを複数パッケージに分割する

## 初めに
golangやlambdaに入門したくて、[GoとSAMで学ぶAWS Lambda](https://www.amazon.co.jp/Go%E3%81%A8SAM%E3%81%A7%E5%AD%A6%E3%81%B6AWS-Lambda-%E6%8A%80%E8%A1%93%E3%81%AE%E6%B3%89%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-%E6%9D%89%E7%94%B0-%E5%AF%BF%E6%86%B2-ebook/dp/B07LGNGDHF)を読み進めてみました。
しかし、本書ではパッケージの依存管理にdepを使っていて、最近主流になってきたGo moduleを使っていなかったので、これを使ってlambdaのプロジェクトを複数パッケージに分割してみようと思います。

## ディレクトリ構成
aws samで出来るlambdaを考えます。（samについての解説は省略します）
dynamoDBに`Name`をフィールドにもつ`Person`を保存してみます。

以下のように`handler`(lambdaのエントリーポイントになるところ)、`db`(DBに接続するところ)、`model`(DBから取り出したデータをパースする構造体の置き場)の３つに分けてみました。
ディレクトリ構成はテキトーなのでご了承ください（笑）

```
.
├── template.yaml
├── db
│   ├── db.go
│   └── go.mod
├── go.mod
├── handler
│   └── main.go
└── model
    ├── go.mod
    └── model.go
```

## 実装


まずは`handler/main.go`とルート直下の`go.mod`です
ここはdbのパッケージに依存しています。

```go:handler/main.go
package main

import (
    "github.com/masamichhhi/my-project/db"
)

func main() {
    db.PutPerson()
}
```

```go:go.mod
module github.com/masamichhhi/my-project

go 1.14

require github.com/masamichhhi/my-project/db v0.0.0-00010101000000-000000000000

replace (
    github.com/masamichhhi/my-project/db => ./db
    github.com/masamichhhi/my-project/model => ./model
)
```

この`replace`を書くことで、相対パスで指定したディレクトリを好きな名前でインポートできます。

次に、`db`です
ここでdynamoDBに接続する処理を書きます。
公式のSDKよりも簡単にdynamoDBを使える`guregu/dynamo`を使います。

```go:db/db.go
package db

import (
    "os"
    "fmt"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/guregu/dynamo"

    "github.com/masamichhhi/my-project/model"
)

var (
  Region = os.Getenv("REGION")
)

func PutPerson() {
    creds := credentials.NewStaticCredentials(os.Getenv("AWS_ACCEESS_KEY"), os.Getenv("AWS_SECRET_ACCEESS_KEY"), "") 

	sess, _ := session.NewSession(&aws.Config{
		Credentials: creds,
		Region:      aws.String(Region)},
	)

	newPerson := model.Person{Name: "Gopher"}
	db := dynamo.New(sess)
	table := db.Table("person-table")

	err := table.Put(newPerson).Run()
	if err != nil {
           fmt.Println("エラー発生")
	}else{
         fmt.Println("成功！")
    }

}
```

```go:go.mod
module github.com/masamichhhi/my-project

go 1.14

require (
    github.com/github.com/masamichhhi/my-project/model v0.0.0-00010101000000-000000000000
)

replace github.com/masamichhhi/my-project/model => ../model
```

最後に`model`です。

```go:model/model.go
package model

type Person struct {
    Name string  `dynamo:"name"`
}
```

```go:model/go.mod
module "github.com/masamichhhi/my-project/model"

go 1.14
```

これでパッケージを分割できたと思います！


## 参考
[Go moduleのローカルパッケージに多層の依存をもたせられない
](https://teratail.com/questions/324121)↑(僕の質問に答えてくれた方、ありがとうございます🙇‍♂️)
AzureシステムマネージドIDを使ったVM→Blobへのアップロード

AzureシステムマネージドIDを使って、Storage AccountのキーやSASを使わずに、PowerShellでファイルアップロードする手順を試したので残しておきます。

# VMのシステムマネージドID有効化
* Portalの、Azure VMの左バーより[ID]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/6c3db513-25cd-e12c-4fa4-64f30e7e4c9d.png)

* [システム割り当て済み]をOnにして保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/0e94d5d3-60be-9d45-8351-3d92392b9289.png)

* 確認メッセージが出るので[はい]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/623834d6-33ca-84a3-882c-f387547d2d9a.png)

# StorageAccountへのロール割り当て
* Onになると[Azureロールの割り当て]ボタンが表示されるので選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/fef11a4a-4519-72e9-f4db-0ea6c86dad33.png)

* [ロールの割り当ての追加]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/42edf8de-a75a-ff4b-ef8f-d9354e4d5c50.png)

* [スコープ]に今回は[ストレージ]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/8dfd24be-5d34-bcf8-c8cc-5d2864dd5891.png)

* [リソース]に対象のストレージアカウントを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/7bb65ece-363f-69c2-90fb-75c2cbb510ed.png)

* [役割]に[ストレージBLOBデータ共同作成者]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/6568cf52-7339-8fd4-0448-49d93d5942a9.png)

# Azure PowerShell インストール
ここからはWindows Serverでの操作になります。

* Azure PowerShellがインストールされていない場合は、 [Azure PowerShell をインストールする](https://docs.microsoft.com/ja-jp/powershell/azure/install-az-ps?view=azps-2.8.0) を参考にインストールします。

# Blobアップロード
* AzureシステムマネージドIDでログインします。

```powershell
Connect-AzAccount -Identity
```

* ストレージコンテキストを取得します。

```powershell
$ctx = New-AzStorageContext -StorageAccountName "ストレージアカウント名" -UseConnectedAccount
```

* ファイルアップロードします。

```powershell
Set-AzStorageBlobContent -File "ソースファイル" -Container "ストレージBLOBのコンテナー名" -Context $ctx
```

# 注意点
* システム割り当てマネージドIDは1つのリソースにつき1つに限定されています。今回のような1つの仮想マシンに対して、1つのストレージアカウントというケースではこれでよいです。
* 1つの仮想マシンで複数のストレージアカウントへのアップロードが必要というようなケースでは、ユーザー割り当てマネージドIDを使う必要が出てきます。

以上

# 更新：ユーザーマネージドIDの手順を書きました
[AzureユーザーマネージドIDを使ったVM→Blobへのアップロード](https://qiita.com/shingo_kawahara/items/0c2afba18c2a72d10db8)
PHPUnitでHTMLコードカバレッジを出すまで(Docker使用)

# はじめに
以下記事の【phpunitを少し使ってみる】までは行っている前提で話します。

https://qiita.com/sachiko-kame/items/a7534d71f2155b06111d


最終的表示までのものgithubにあげているのでもしよかったら見てください。
どこに何を書けばいいかもここのファイル等見てもらった方が早いかもです。

https://github.com/sachiko-kame/samplePHPTest/tree/main

最終的な見た目は以下のような感じです。

| ![スクリーンショット 2021-03-04 23.20.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/fbf904d4-3a68-43a4-48be-a4e602b1f03c.png)
|:-:|

|![スクリーンショット 2021-03-04 23.20.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/feac50b0-3c6f-6d57-07fb-48a0a254d09e.png)
|:-:|


#上記の【phpunitさわるまで】以降にすること箇条書き
※HTMLでコードカバレッジを表示するのに必要な設定

https://phpunit.readthedocs.io/ja/latest/textui.html

- 【step1】 tokenizer(拡張モジュール)追加
- 【step2】 Xdebug(拡張モジュール)追加
- 【step3】 php.iniの設定、反映(Xdebug(拡張モジュール)有効化)
- 【step4】 phpunit.xml(コードカバレッジ出力のための設定ファイル的なもの)の作成
- 【step5】 メソッドの修正
- 【step6】 最後に出力コマンド

###【step1】 tokenizer(拡張モジュール)追加

Dockerfileに以下追記
※ですがもしかしたらこれいらないかもしれないです、、すでに入ってる的なログ出てた気がするので念のため書いておきます、、

```:Dockerfile
RUN docker-php-ext-install tokenizer
```

###【step2】 Xdebug(拡張モジュール)追加

Dockerfileに以下追記。すでに記述してある処理はそのままで。
ちなみに『apt-get』使用でインストール出来なかったのでこのインストールの方法で行っています。
peclのインストールがwget
インストールしたpeclでxdebugをインストールするという感じです。

インストール方法は以下の記述参考
https://pear.php.net/manual/en/installation.getting.php

peclでインストールできるもの以下
https://pecl.php.net/package-stats.php

```:Dockerfile
RUN apt-get update \
&& apt-get install -y \
wget

# コードジェネレーターで必要
RUN pecl install xdebug
```


###【step3】 php.iniの設定、反映(Xdebug(拡張モジュール)有効化)
xdebug使えるようにするためphp.iniを自分で作成してDockerの環境に反映するをしました。

ちなみに`extension=xdebug.so`の記述書け！は以下リンク先に書かれていたもので
http://xdebug.org/docs/install

`xdebug.mode=coverage`の記述書け！は失敗ログで言われたものです。

```
Warning:       XDEBUG_MODE=coverage or xdebug.mode=coverage has to be set
```

Dockerfileに以下追記

```:Dockerfile
COPY html/php.ini /usr/local/etc/php/conf.d
```

php.iniを以下場所に作成

```html/php.ini
extension=xdebug.so

xdebug.mode=coverage
```

###【step4】 phpunit.xml(コードカバレッジ出力のための設定ファイル的なもの)の作成

:sun_with_face:『docker-compose.yml』ある場所で`$ docker-compose up --build -d`を叩きます。

:sun_with_face:**以下コマンド今使用しているコンテナIDの確認を行う**
`$ docker ps`

:sun_with_face:**コンテナ内に以下コマンドで入る、 ※『1999d283b4f9』は上記で出力したコンテナIDを使用してください**
`$ docker exec -i -t 1999d283b4f9 bash`

:sun_with_face:phpunit.xmlの作成コマンドを打つ、そして聞かれた内容に答えていく

`$ vendor/bin/phpunit --generate-configuration`


###【step5】 メソッドの修正
テストメソッド上の何のテストをするかを記述(`@covers`の部分)
これないと`This test does not have a @covers annotation but is expected to have one`と言われます。

```.php
    /**
     *  @covers sample\Sample::a
     **/
    public function testA()
```

全体
https://github.com/sachiko-kame/samplePHPTest/blob/main/html/TEST/SampleTest.php

###【step6】 最後に出力コマンド
これで『TestResult』フォルダ内に無事index.htm等々作成出来て表示に問題がなければOKです！
うまくいかない場合『phpunit.xml』が同じでない可能性が高いと思うので以下と見合わせていただければと思います。
https://github.com/sachiko-kame/samplePHPTest/blob/main/html/phpunit.xml

`$ vendor/bin/phpunit --coverage-html TestResult`

#参考
https://tech-blog.rakus.co.jp/entry/20200908/docker
https://docs.docker.jp/engine/reference/builder.html#copy
その他所々にリンク貼ってます！
STM32F103C8のArduinoでの液晶,AQM0802Aで「A」を表示


1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり


```c++


#include <Wire.h> //I2C library

#define I2Cadr  0x3e  // 固定

int     ii;           //ループカウンター
char    data_read[2]; //i2cバッファー

//初期レジスター
char INIT_com[]={0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41};

//i2c書き込みルーチン
void i2c_led_w(char *buff1){
  Wire.beginTransmission(I2Cadr);
  Wire.write(buff1[0]);
  Wire.write(buff1[1]);
  Wire.endTransmission();
  delay(2);
}//i2c_led_w

void setup()
{  
  delay(3000); //液晶の為のウエート

  Wire.begin(); //F103 PB6(SCL) PB7(SDA)

  //液晶の初期化
  for(ii=0;ii<11;ii++){
    i2c_led_w(&INIT_com[ii*2]);
  } //for

} //end setup

void loop()
{

}//loop



```

![103_aqm0802_ar_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8a3e1265-e39e-dd77-6d8c-63145c3ace7a.jpeg)
gurobiでxorを表現する。

gurobiという数理最適化ソルバーでxorを表現できなくて困ったのでメモ。

https://www.gurobi.com/documentation/9.1/refman/py_python_api_details.html
のAPIを眺めると、現状、abs_,and_,or_,max_,min_の五種類しか論理記号がない。

このmax_とmin_を使うことでxorを表現できる。

```python
from gurobipy import *

for i in range(2):
    for j in range(2):
        m=Model()
        m.setParam("outputflag",0)
        a=m.addVar(vtype="b")
        b=m.addVar(vtype="b")
        xor=m.addVar(vtype="b")

        c=m.addVar(vtype="b")
        d=m.addVar(vtype="b")

        m.addConstr(c==max_(a,b))
        m.addConstr(d==min_(a,b))
        m.addConstr((xor==1)>>(c-d==1))
        m.addConstr((xor==0)>>(c-d==0))        
        
        m.addConstr(a==i)
        m.addConstr(b==j)

        m.optimize()
        print("(a:",i,"b:",j ,")  xor:",round(xor.X))
```

```
#out
(a: 0 b: 0 )  xor: 0
(a: 0 b: 1 )  xor: 1
(a: 1 b: 0 )  xor: 1
(a: 1 b: 1 )  xor: 0
```

以上のように、xorを表現することが出来た。
【Python】ウラムの螺旋を描画する


# ウラムの螺旋とは
[ウラムの螺旋 - Wikipedia]
(https://ja.wikipedia.org/wiki/%E3%82%A6%E3%83%A9%E3%83%A0%E3%81%AE%E8%9E%BA%E6%97%8B)
素数の分布を以下の様なルールに従って可視化したものです。

1. 自然数を反時計回りに螺旋状に並べます。
![img_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121857/c822e207-41a4-f0a7-70e1-7e0b36dc1f21.png)

2. 素数のマス目のみ塗り潰します。
![img_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121857/3d14ca74-753f-8e2c-e7fc-dd390a12ddf4.png)

3. これを繰り返していくと、不思議なことに斜め方向に格子状のパターンが浮かび上がってきます。
![ulam_spiral1-100000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121857/b7c2db88-5db2-3620-67c1-cc403bb0ed18.png)

# 実装
素数判定には様々なアルゴリズムがありますが、今回は自前で実装は行わず、[sympy.sieve](https://docs.sympy.org/latest/modules/ntheory.html)を使用しています。
list型として扱えるので、素数判定は以下のように1行で書けます。

```Python
n in sieve
```

以下、実装です。

```UlamSpiral.py
import cv2
import numpy as np
from sympy import sieve


def ulam_spiral(start_num, end_num, prime_color=(0, 0, 0), back_color=(255, 255, 255)):

    # 始点を(0, 0)として、螺旋の座標リストを作成する
    pos = [(0, 0)]
    # 螺旋は右に1、上に1、左に2、下に2、右に3、上に3、左に4、下に4…と進む
    count = 1
    while len(pos) < (end_num - start_num):
        for c in range(count):
            pos.append((pos[-1][0] + 1, pos[-1][1]))  # 右に進む
        for c in range(count):
            pos.append((pos[-1][0], pos[-1][1] - 1))  # 上に進む
        for c in range(count+1):
            pos.append((pos[-1][0] - 1, pos[-1][1]))  # 左に進む
        for c in range(count+1):
            pos.append((pos[-1][0], pos[-1][1] + 1))  # 下に進む
        count += 2
    pos = pos[:end_num - start_num]  # 不要な末尾を削除

    # 最小座標を取得し、左上が(0, 0)となるよう補正
    min_x = min([p[0] for p in pos])
    min_y = min([p[1] for p in pos])
    pos = [(p[0]-min_x, p[1]-min_y) for p in pos]

    # 背景画像を作成
    max_x = max([p[0] for p in pos])
    max_y = max([p[1] for p in pos])
    img = np.zeros((max_y+1, max_x+1, 3), np.uint8)
    img[:] = back_color

    # 開始番号から順番に素数判定、素数の場合はposの座標に従い色を変更
    for n, p in zip(range(start_num, end_num), range(len(pos))):
        if n in sieve:
            img[pos[p][1], pos[p][0]] = prime_color

    # 画像出力
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    cv2.imwrite('ulam_spiral' + str(start_num) + '-' + str(end_num) + '.png', img)


def main():
    start_num = 1
    end_num = 100000
    prime_color = (0, 255, 0)
    back_color = (0, 0, 0)
    ulam_spiral(start_num, end_num, prime_color, back_color)


if __name__ == '__main__':
    main()

```

# オイラーの素数生成多項式
実装は、螺旋の開始番号/終了番号を変更できるようにしています。
開始番号を41にすると、中心から斜め方向に連続して素数が現れ、長い直線のパターンが出てきます。
中心から斜め方向のマス目の値は、$x^2 + x + q 　(x≧0, q:開始番号)$ で表される整数となりますが、この式はオイラーの素数生成多項式と等しいです。
オイラーの素数生成多項式では、$q=41$のとき、$x$が$0$から$39$までの間連続して素数が出続けるので、ウラムの螺旋で比較的長い直線のパターンが出るのも納得です。
![ulam_spiral41-50000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121857/9b7ff0a4-11e2-9685-5a7f-bc6741d1fc0b.png)

# さいごに
実装に関して、少し注意事項と感想です。

- 螺旋の最も外側の列は、正しく描画されない可能性があります。終了番号end_numが螺旋のどこの位置で終わるか分からないためです。(そこまで厳密な図が欲しいわけではなかったのでご愛嬌ということで)
- 螺旋の座標リストを作る部分があまり綺麗ではないです。他にもっと良いやり方があれば知りたい…
- 引数指定で無駄にカラフルな図を出力できます。折角なのでデスクトップにしてみましたがチカチカするのでおすすめしません。