OmniAICreator/Qiita-1.07M huggingface dataset:
Scrum Fest Sapporo Day 0 参加レポート「紙粘土スクラムから得たアンチパターン」

# Scrum Fest Sapporo Day 0 「紙粘土スクラムから得たアンチパターン」

2020/11/05に開催されたScrum Fest Sapporoでの最初の発表です。
https://confengine.com/scrum-fest-sapporo-2020/proposal/14197

# チーム参加してきました

[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html) のチーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu?slide=3)」にて参加してきました。
チーム7人中、6人で参加して、その場で実況しつつ、記事も作っています。

# 紙粘土スクラムとは？

2013年のアジャイルジャパン札幌サテライトで作成されたワークショップ。スクラムのフレームワークを使いながら、紙粘土で動物園を作ります。
4イテレーションを回しているうちに、時間が解ける感覚が味わえるそう。
子供の遊びかと思っても「普段の仕事の仕方」がはっきり出てくる。毎回ドラマが生まれていき、作っていく最中のドラマも生まれていく。
一緒に勉強しながら、楽しいなと毎回思えるワークショップ、とのこと。

# アンチパターン

## DEVのアンチパターン

### 妄想の暴走

不要なものまで作りすぎる。POの妄想まで加わるとアウト。
POが近くにいたり、ステークホルダーが近くにいても、DEVが盛り上がりすぎて、「絶対できねーだろ！」みたいな要件に膨れ上がる。実際にやってみるとできない。
紙粘土って難しいので、躍動感のあるものはなかなか作れない。

### M・U・G・O・N

話さずにただひたすらに作り続ける。見ているといたたまれない感じになる。たいていの場合にサイズや造形に難ありのものができあがる。チームとしては声が出来ないので、相談しにくい。現実のチームでも、一人が一生懸命作っているのに他のメンバーが関与しないで、スプリントレビューの時にモノができない、みたいなのがありえる。
レビューのときに全然動かない、みたいなのもある。

## SMのアンチパターン

### Shokunin Master

SMが動物を作ることに集中しすぎる。SMが開発者になってしまう。開発が得意だったり、兼任している人だとありがち。のめり込んでしまう。
POがチームに全部ちゃちゃ入れているのに、SMは作業に集中しすぎて気づかない。
初心者はしっかり

### 過保護なSM
傷害をスクラムマスターが取り除きすぎると、チームが全然成長しない。
POが無理難題を言ってきたら、「チームを守るのは自分の役目」といってがっつり守るが、チームが障害に対応できなくなってしまう。
現実にも、POとSMだけがしゃべっていて、開発者が表に出てこない、というのはよくある。SMが開発チームから離れると、開発チームが何もできなくなってしまう、というのはある。
ebacky「温室育ちではなく、野生育ちの野菜を作る」

## POのアンチパターン

### チャラオーナー

イメージトークだけで、具体的な話がない。もっともらしい話はあるけど、どこをカイゼンしたらいいのか分からない。
動物園の中だと、「もっときれいに」「もっとかわいく」みたいなことを言うけど、どこをどうすればいいのか分からない。
かわいいと思って作っているのに、「これじゃない」になる

### むしろ俺が神様です

自分の理想を基準にして、まったく妥協しない。その結果チームが死んだようなプロダクトを創り出し、価値を生み出さない。
すごい品質にこだわるPOがいて、4回もスプリントを回しているのにほとんどできなかった、いくらやってもダメだしされる、みたいな回があった。そこでは死んだ動物園が生まれてました。

謎の基準があって、チームが疲弊する、のはあるある

# オンラインもあるよ

紙粘土スクラムオンラインもどうぞ！

# 感想

- 紙粘土、すごく面白そう！COVID-19がなければ今すぐにでもチームでやってみたい題材。
- 紙粘土のワークとスクラムが似ているということがどういうことか分からなかったけれど、アンチパターンを聞いて理解しました。意識していないと普通に業務でもやってしまいそうだなと思いました。
- アンチパターンの名前付けがユニークで面白い・かつわかりやすいですね。自分が紙粘土スクラムやったらこれやっちゃいそうだな～と想像しながら聞けました。自分の普段の活動から意識できるようにしたいです
- この界隈の人はネーミングがうまい。内容は紙粘土だけどうまくスクラムの話と絡められてるなー。
- 気になるセッションだったので聞けて良かったです、おもしろかった
カリー化されたcase classは2つ目以降の引数グループの値を等価チェックに使わない

## 動作確認コード

```scala
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpec

class CaseClassEqualityTest extends AnyWordSpec with Matchers {
  case class Class1(val1: String)(implicit val val2: Int)
  case class Class2(val1: String)(implicit val2: Int)
  case class Class3(val1: String)(val2: Int)

  "カリー化されたcase class" should {
    "2つ目以降のカッコの値を等価チェックに使わない" in {
      Class1("1")(2) should be(Class1("1")(2))
      Class1("1")(2) should not be (Class1("aaa")(2))
      Class1("1")(2) should be(Class1("1")(999999))

      Class2("1")(2) should be(Class2("1")(2))
      Class2("1")(2) should not be (Class2("aaa")(2))
      Class2("1")(2) should be(Class2("1")(999999))

      Class3("1")(2) should be(Class3("1")(2))
      Class3("1")(2) should not be (Class3("aaa")(2))
      Class3("1")(2) should be(Class3("1")(999999))
    }
  }
}
```

[scala-sandbox/CaseClassEqualityTest.scala at bdf74c0f5d3b06c58c34b2e1068163fb2e319a50 · tksugimoto/scala-sandbox](https://github.com/tksugimoto/scala-sandbox/blob/bdf74c0f5d3b06c58c34b2e1068163fb2e319a50/src/test/scala/io/github/tksugimoto/scala/caseclass/CaseClassEqualityTest.scala)

## 関連
- [Strange curried case class constructor behaviour - Compiler - Scala Contributors](https://contributors.scala-lang.org/t/strange-curried-case-class-constructor-behaviour/3966)

> All the functionality of case classes only apply to the first constructor arguments group. AFAIK, that is the intended behaviour.

> ケースクラスのすべての機能は、最初のコンストラクター引数グループにのみ適用されます。私の知る限りでは、それは意図された振る舞いです。
Cで求める最小公倍数と最大公約数

C言語で書いたN個の数の最小公倍数と最大公約数を求めるプログラムです。Nは1024までにしてあります。

最小公倍数はlcm.cを、`cc lcm.c -o lcm`としてコンパイルし、最大公約数はgcd.cを`cc gcd.c -o gcd`としてコンパイルし、それぞれ、`./lcm a b c d ...`、`./gcd a b c d ...`として実行してください。

#コード：最大公約数

```gcd.c
#include  <stdio.h>
int gcd2(int x,int y) {
  int t;
  while(y!=0)
    t=x%y, x=y, y=t;
  return(x);
}

int main(int argc,char *argv[]) {
  int a[1024];          // 最大公約数を求める数の最大個数1024
  int i,d;
  for (i=1;i<argc;i++)
    sscanf(argv[i],"%d",&(a[i-1]));

  d=a[0];
  for (i=1;i<(argc-1)&&d!=1;i++)
    d=gcd2(a[i],d);
  printf("%d\n",d);
}
```

#コード：最小公倍数

```lcm.c
#include  <stdio.h>
int gcd2(int x,int y) {
  int t;
  while(y!=0)
    t=x%y, x=y, y=t;
  return(x);
}

int lcm2(int x,int y) {
    int xy=x*y;
    if (xy<0) xy=-xy;
    return(xy/gcd2(x,y));
}

int main(int argc,char *argv[]) {
  int a[1024];          // 最小公倍数を求める数の最大個数1024
  int i,d;
  for (i=1;i<argc;i++)
    sscanf(argv[i],"%d",&(a[i-1]));

  d=a[0];
  for (i=1;i<(argc-1)&&d!=1;i++)
    d=lcm2(d,a[i]);
  printf("%d\n",d);
}
```
【python】googletransの『AttributeError: 'NoneType' object has no attribute 'group'』対策【2021/01/12追記】

#<font color="Crimson">2021/01/12 追記しました</font>
#はじめに
pythonでgoogletransライブラリを使って翻訳していると、ある日
```AttributeError: 'NoneType' object has no attribute 'group```
というエラーが出てきて、それ以降これが原因で処理を失敗してしまうことが多くなりました。
しかも全く同じコードにもかかわらず、エラーが出る時と出ない時があるのです。厄介。

[py-googletransのissue](https://github.com/ssut/py-googletrans/issues/234) を見ると、Google側のせいでエラーが起きてしまうということだったので、今のところ根治はできないみたいです。
しかし一時的な対策はできるので、issueのコメントよりそれを抜粋して紹介します。

#対策
エラーが出る時と出ない時があるので、成功するまで何回もやっちゃおう！！！という方法です。ゴリ押しです。

```python
from googletrans import Translator

src = "翻訳したいテキスト"

tr = Translator()
while True:
  try:
    text = tr.translate(src, dest="en").text
    break
  except Exception as e:
    tr = Translator()
```

簡単に説明すると、前述の通りでwhileとtry-exceptを使ってエラーが出たらインスタンスを作り直ししてから再度実行します。
そしてちゃんと実行が成功したらbreakでwhileを抜けて無事終了です。

お疲れ様でした。

#2020/12/02追記
12月に入って突然上記の方法でも何故か上手くいかなくなり、無限にエラーを繰り返すようになってしまいました。
Githubを見ると、人によって(国によって)は有効な解決策があるみたいだったので試してみたところ、なんかよく分かりませんが通りました。
今回はその解決策を紹介します。
<font color="Crimson">※pipでインストールしたものは中身を確認していないので安全とは言い切れません。自己責任でお願いします。</font>

```zsh
pip uninstall googletrans
pip install git+https://github.com/alainrouillon/py-googletrans@feature/enhance-use-of-direct-api
```
従来のgoogletransライブラリをアンインストールして、githubに上がっている改善されたライブラリをインストールします。

```python
from googletrans import Translator

src = "翻訳したいテキスト"

#tr = Translator()
tr = Translator(service_urls=['translate.googleapis.com'])
while True:
  try:
    text = tr.translate(src, dest="en").text
    break
  except Exception as e:
    #tr = Translator()
    tr = Translator(service_urls=['translate.googleapis.com'])
```
以前紹介したコードを2行変えるだけで大丈夫です。
googletransのTranslatorはサービスURLをカスタマイズ(google翻訳ドメインを変更)することができ、ここではサービスURLを「translate.googleapis.com」に変更しています。
(詳しいことはよく分かりませんが。。。)

これで終わりです！
僕はこれ上手くいきましたが、人によっては効果がないこともあるみたいです。
ご参考までにどうぞ。

お疲れ様でした。

#2021/01/12追記
コメント欄にて最新バージョンのgoogletransが安定しているとのコメントを頂きましたのでそのまま掲載させていただきます。
>12/27 時点での解決策です

>4.0.0 のアルファバージョンは正常に動いてるようです

>https://github.com/ssut/py-googletrans/issues/234#issuecomment-741800500

>```zsh
pip uninstall googletrans
pip install googletrans==4.0.0-rc1
```

>```python
>>> from googletrans import Translator
>>> tr = Translator()
>>> tr.translate(text="hello", src="en", dest="ja").text
'こんにちは' 
```
Rでポアソン混合モデル実装 (ギブスサンプリング)


# 記事の目的
ポアソン混合モデルのギブスサンプリングをRで実装します。
参考：[ベイズ推論による機械学習入門](https://www.amazon.co.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%83%99%E3%82%A4%E3%82%BA%E6%8E%A8%E8%AB%96%E3%81%AB%E3%82%88%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E9%A0%88%E5%B1%B1-%E6%95%A6%E5%BF%97/dp/4061538322)

# 目次
[0. ライブラリ](#0-ライブラリ)
[1. モデルの説明](#1-モデルの説明)
[2. 推定する分布](#2-推定する分布)
[3. パラメータ初期値設定](#3-パラメータ初期値設定)
[4. 事後分布](#4-事後分布)
[5. 確認](#5-確認)

#0. ライブラリ
```R:
library(dplyr)
library(mvtnorm)
library(MCMCpack)
library(gganimate)
set.seed(100)

```

#1. モデルの説明

![IMG_0178.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/f323dcd1-b3bd-ed72-3e37-610caa084634.jpeg)


#2. 推定する分布
50が平均のポアソン分布と、80が平均のポアソン分布が1:3の割合で混合しているモデルです。

```R:
N <- 1000
s.true  <- rmultinom(N, 1, c(1/4, 3/4)) %>% apply(2, which.max)
X <- append(rpois(N, 50)[s.true==1], rpois(N, 80)[s.true==2])
NULL %>% ggplot(aes(x=X)) + geom_histogram(position = "identity", alpha=0.7)
N <- length(X)
```
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/38d3728a-ed2b-7ee5-ee79-b143390ff04b.png)


#3. パラメータの初期値設定
```R:
#ハイパーパラメータ設定
K <- 2
alpha0 <- rep(1/K, K)
a0 <- rep(1, K)
b0 <- rep(1, K)
#パラメータ初期値設定
pi <- rep(1/K, K)
s <- rep(1:K, N)[1:N]
lambda <- rep(100, K)
alpha <- {}
a <- {}
b <- {}
s.Data1 <- data.frame(s, iter=rep(0, N))
```

#4. 事後分布
```R:
max.iter <- 30
eata <- matrix(NA, nrow = N, ncol=K)
for(t in 1:max.iter){
  #sのサンプリング
  for(i in 1:N){
    eata[i, ] <- (X[i]*log(lambda) - lambda + log(pi)) %>% exp()
    s[i] <- rmultinom(1, 3, eata[i, ]) %>% apply(2, which.max)
  }
  s.Data2 <- data.frame(s, iter=rep(t, N))
  s.Data1 <- rbind(s.Data1, s.Data2)
  #lambdaのサンプリング
  for(k in 1:K){
    a[k] <- sum(X[s==k]) + a0[k]
    b[k] <- (X[s==k] %>% length()) + b0[k]
    lambda[k] <- rgamma(1, a[k], b[k])
  }
  #piのサンプリング
  for(k in 1:k){
    alpha[k] <- (X[s==k] %>% length()) + alpha0[k]
  }
  pi <- rdirichlet(1, alpha)
}
```


#5. 確認
iter15でだいたい分類できていることが分かります。

```R:
s.Data <- s.Data1 %>% filter(iter==0|iter==5|iter==15|iter==20|iter==25|iter==30)
s.Data <- data.frame(X=rep(X, 6), s.Data)
s.Data$s <- s.Data$s %>% as.factor()
s.Data %>% ggplot(aes(x=X, fill=s)) + geom_histogram(position = "identity", alpha=0.7) +
  transition_states(iter, transition_length = 2, state_length = 1)
```
>
![a5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/775500/1781f02f-6d96-cf90-24a9-f53170a6f7f6.gif)
Windows10 + XAMPPでCakePHP4を導入してみる

## 開発環境

- Windows10
- XAMPP
- Composer

## CakePHPのインストール
作業用のディレクトリを用意し、そこに移動。

```
$ mkdir cakePHP(作業用ファイル名)
$ cd cakePHP
```

[公式ドキュメント](https://book.cakephp.org/4/ja/quickstart.html)に沿って`CakePHP`を導入していく。
まずは`Composer`がアップデートされているかどうか、ターミナルに次のコマンドを入力して確認。

```
$ composer self-update
```

[公式ドキュメント](https://book.cakephp.org/4/ja/quickstart.html)には`Composer`経由で`CakePHP`をインストールできるコマンドが掲示されているが、その前に`PHP`の設定を変更する必要がある。
変更しないと以下のようなエラーが発生する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/f3e57e4b-8dc6-ddda-16ba-f48dfbde0c8d.png" width="700px">

`~/xampp/php/php.ini`をエディターで開き、**`;extension=intl`**を有効化(`;`を削除)する。

```~/xampp/php/php.ini(変更前)
;extension=intl
```

```~/xampp/php/php.ini(変更後)
extension=intl
```

変更内容を保存したら、ターミナルに戻り`CakePHP`をインストールする。

```
$ composer create-project --prefer-dist cakephp/app:4.* cms
```

インストールが終わったら、問題なく動くか確認してみる。

```
$ cd cms
$ bin/cake server
```

**`$ bin/cake server`**で開発用サーバーを起動できる。
サーバーの起動後、http://localhost:8765/ にアクセスしてみて以下のようなページが表示されたら`CakePHP`の導入完了。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218398/4de667a7-4f99-81cf-fa23-788fc04fe02e.png" width="700px">

## 参考資料

- [cakePHP クイックスタートガイド - 4.x](https://book.cakephp.org/4/ja/quickstart.html)
- [Windows への CakePHP インストール on XAMPP | IT底辺脱却ブログ](https://moewe-net.com/php/cakephp/setup-cakephp-on-xampp)
Access denied for user 'root'@'localhost' (using password: NO) エラーの対処法

## エラーの内容
`rails s` をした後、ブラウザを見てみると下記のようなエラーが発生しました↓

Mysql2::Error::ConnectionError
Access denied for user 'root'@'localhost' (using password: NO)

要するに、
パスワードがないからアクセスできないぞ！
ということです。

##エラーの解決方法
エラーの解決方法は2通りあります。
1. MySQLで設定したパスワードをdatabase.ymlにベタ書きする。
2. rootユーザーのパスワードを空にする。


個人で開発する際は1でもいいのですが、チーム開発となるとチームでパスワードを共通化する必要があり、少し面倒なので今回は2について詳しくやっていきます。1についても簡単に記載します。

##1. database.ymlにベタ書きする。

```database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: #ここにパスワードを書く
  socket: /tmp/mysql.sock
```

一番簡単な解決方法は上記の箇所にパスワードを書くことです。
しかし、GitHubなどのバージョン管理システムにプッシュするとパスワードが露出してしまうので、.envファイルでパスワードを管理し、それを.gitignoreに記載するといった対策が必要になります。
##2. rootユーザーのパスワードを空にする。

MySQLを起動させます。

```
$ mysql.server start
```

MySQLにログインします。

```
$ mysql -u root -p
Enter password: #現在のPWを入力
```

使用するデータベースを選択します。

```
mysql> use mysql;
```

パスワードを空にします。
MySQL 5.7.6でパスワードのカラム名がpasswordからauthentication_stringに変わった点に注意してください。

```
mysql> update user set authentication_string='' where user='root';
```

上記のコードが上手くいけば、変更できたことが表示されます。

```
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
```

変更が成功したらMySQLを閉じます。

```
mysql> exit
```

変更を反映させるためにMySQLを一度ストップします。

```
$ mysql.server stop
```

再び起動させます。ストップしずにリスタートでも大丈夫だと思います。

```
$ mysql.server start
```

そして、パスワードなしでログインできることを確かめてください。

```
$ mysql -u root
```

ログインできたら、もう1度MySQLを閉じてサーバーを起動させてください。

```
$ rails s
```

そしてブラウザを開いたら、、、
![スクリーンショット 2020-11-05 17.05.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787216/4324d175-3b15-0c80-dd90-4a028b3e0e7f.png)

無事エラーが解決されましたね。
お疲れ様でした！
##参考サイト
[日々の覚書](https://yoku0825.blogspot.com/2015/03/mysql-576mysqluser.html "日々の覚書")
Drone が `Error 1406: Data too long for column 'stage_name' at row 1` で落ちる時は stage name を短くすべし

掲題の通りです。

Drone CI が `Error 1406: Data too long for column 'stage_name' at row 1` というエラーで落ちるという事象が起こり、ググりましたが MySQL 周りのエラーっぽいぞということしかわからずに少し 🤔

結論としては原因は、エラー文言が示しているとおり、Stage Nameの長さでした。
公式のissueにも上がっている通り、Drone CI の  Stage Name の文字列の長さは50文字に制限されているとのことで、それを越えるとエラーが出るようです。

https://github.com/drone/drone/issues/2797

ググラビリティのために、ここにメモっておきます。
[Photoshop]文字サイズの表示をptからpxに10秒で変えてみる

初期設定ではフォントのサイズがptになっているのでpxに変更する方法をメモします。

#方法
以下に手順をまとめます。
## 1.メニューバーからPhotoshop→環境設定→単位・定規を選択

![スクリーンショット 2020-11-05 18.44.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656158/6e6c59fe-b89b-4495-103e-7999c2d4e228.png)

前は編集から変更していたのですが今はPhotohopから変更するようです。

## 2.単位・定規を選択→単位→定規・文字をpixelに変更

![スクリーンショット 2020-11-05 18.44.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656158/512e9053-79de-17cb-bdbc-6283c1ba9a40.png)

これで完了です。

cssをする時には便利ですね。

#別策
別の方法もあります。

##　対象のレイヤーを選択→メニューバーからレイヤーを選択→cssをコピー
![スクリーンショット 2020-11-05 18.54.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656158/e7febcb9-53b5-72eb-8b33-76583197595b.png)

以下のようにcssがコピーできてfont-sizeがpxで獲得できているのが確認できます。

```
.fallenworld_ {
  font-size: 200px;
  font-family: "Zapfino";
  color: rgb(39, 61, 84);
  line-height: 0.5;
  text-align: center;
  position: absolute;
  left: 861.001px;
  top: 208.801px;
  z-index: 11;
}

```

この方法では一回一回やるには時間がかかりますが、font-familyやrgbなどの他の情報も確認することができます。
個人開発でもissueやpullrequestを面倒くさがらないような工夫

## まとめ

次のような関数をつくって、できるかぎり自動化しています。

```bash
openissue() {
    branchname=`echo $1 | tr A-Z a-z | sed -e 's/ /-/g'`
    issuenumber=`gh issue create --title $1 --body "" | tail -1 | cut -d / -f7`
    git checkout -b "$branchname#$issuenumber"
}

pullrequest() {
    branch=`git branch --show-current`
    issuenumber=`echo $branch | cut -d# -f2`
    url=`gh pr create --title "$1" --body "Close #$issuenumber"`
    chrome-cli open $url
}

closebranch() {
    currentbranch=`git branch --show-current`
    git checkout master
    git pull origin master
    git push --delete origin $currentbranch
    git branch -d $currentbranch
}
```

次のように使います。

```bash
# タイトルを"Awesome feature"にしてissueを作成。
# awesome-featureブランチにチェックアウト。
openissue "Awesome feature"

# 引数をタイトルにプルリクエストを作成。
# 自動でプルリクエストのページをchromeで開くので、チェック不要ならそのままマージする
# マージすればissueは自動で閉じる
pullrequest "スーパー凄い機能を実装"

# masterブランチに切り替え。
# ローカル、リモートそれぞれのawesome-featureブランチを削除する
closebranch
```

## どうしてもｍasterで開発してしまう人に

個人開発をしていると、

* issueを立て、ブランチを切り替える
* issue単位で実装を行う
* プルリクエストを送る
* プルリクエストをマージする
* イシューを閉じる

ということを面倒くさがって、masterでとにかくなんでもやってしまうことが多くありました。

しかしコミットの管理や振り返りを考慮すると、上記の流れは個人開発でもきちんとやっておきたい。

そのために面倒な操作をできるかぎり排除してみたのが、上述のシェルです。

## 工夫のポイント

- イシューを設定したら、自動でイシュー番号を付与したブランチにチェックアウトする
- プルリクエストは、イシューを自動で閉じれるような形式で作成する
- 実装後はfeatureブランチを簡単に捨てられるようにする

次のようにしたことで、（手動で）githubを開いたり、gitコマンドを打ったりすることはなくなりました。

機能開発を並行しないシンプルな開発であれば、これで十分気持ちよくやれると思います。

## みなさんはどうしていますか

完全に独自の工夫なので、これが良い方法かどうかは自信がありません。

みなさんは何か工夫していることはありますか。よろしければ教えてください。
ノーリフトケアを導入している介護施設の一覧に関するwikiを作成してみました

ノーリフトケアを導入している介護施設の一覧のwikiを作ってみました
できる人編集お願いします。
リンク:https://seesaawiki.jp/foejaojof/d/%a5%c8%a5%c3%a5%d7%a5%da%a1%bc%a5%b8

<hr>
参考にしたサイト

<a href="https://wiki.seesaa.jp/guide/start">Wikiの作り方 - Seesaa Wiki（ウィキ）</a>
composerを入れたのに反応しない。

以下を参照してcomposerを入れました。
https://usado.jp/spdsk/2018/08/20/post-4221/
しかし、どうやっても、
```composer
bash: composer: command not found```

となった。
原因は、rootユーザでやっていたことだった。
exitで抜けてcomposerを打つと反応した。

ただ、説明をよく読まなかっただけなのですが、こういうことがあることを学びました。
Multivariate Statistical Modeling Based on Generalized Linear Models

```{r}

#spline model

#Multivariate Statistical Modeling Based on Generalized Linear Models p.176

library(dplyr)

pis=c(32,104,206,186,102,2,12,28,28,31)/100

x=c(1:length(pis))

h=c()

for(j in 1:(length(x)-1)){

h=c(h,x[j+1]-x[j])

}

D=array(0,dim=c(length(x)-2,length(x)))

C=array(0,dim=c(length(x)-2,length(x)-2))

for(j in 1:nrow(D)){

vec=c(1/h[j],-(1/h[j]+1/h[j+1]),1/h[j+1])

D[j,j:(j+2)]=vec

if(j==1){

C[j,1:2]=c(2*(h[1]+h[2]),h[2])

}else{

if(j==nrow(C)){

C[j,(j-1):j]=c(h[j],2*(h[j]+h[j+1]))

}else{

C[j,(j-1):(j+1)]=c(h[j],2*(h[j]+h[j+1]),h[j+1])

}}

}

K=t(D)%*%solve(C)%*%D

lam=1

f=rep(0.01,length(pis))

sig=rep(1,length(f))

ite=1000;eta=1

for(j in 1:ite){

f_pre=f

D=diag(c(exp(f)))

W=diag(c(diag(D^2)/sig))

y=eta*(pis-exp(f))/diag(D)+f

f=solve(W+lam*K)%*%W%*%y

print(sum(abs(f-f_pre)))

}

S_lam=solve(diag(rep(1,nrow(K)))+lam*K)

GCV=mean(((pis-exp(f))^2/sig)/((1-sum(diag(S_lam))/length(x))^2))

plot(c(1:length(f_pre)),pis,xlim=c(1,length(f_pre)),ylim=c(min(f_pre,f),max(f_pre,f)),col=2,ylab="predict",xlab="index")

par(new=T)

plot(c(1:length(f_pre)),exp(f),xlim=c(1,length(f_pre)),ylim=c(min(f_pre,f),max(f_pre,f)),col=3,ylab="predict",xlab="index")



```
やっぱり[m:]s.00でタイム入れたいよね（Googleスプレッドシート）

スイマーによるスプリント系スポーツのための表計算シリーズ第2弾。
（前回はこちら「[よくある記法のスプリットタイムをラップタイムにする](https://qiita.com/westdepth/items/7b18fe31e9e7950a7833)」）

#困ったこと
記録会のタイムを入力していたらこんな感じ↓になった。
![gss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311217/3199725d-cf33-dc61-9288-4f7ce29f0aac.png)
数字の解釈が見事にバラバラ。
（1時間超えてミリ秒取る種目ある？？てつっこみは置いといて）

###例1. ただの数字になる
``12.34``→``12.34``（数字）
12秒34（のつもり）なのに、「あーはいはい12.34ね」と言われる。
表示だけするならそれでもいいけど、ラップタイムを計算したかったらこれではダメ。ちゃんと時間扱いになってる数字とは計算できない。~~100m1分未満で折り返せる人ばっかじゃないんですよ~~

###例2. 文字列扱いになる
``1:23.45``→``1:23.45``（文字列）
**文字列** です。計算なんてできたものじゃない。しようもんなら当然``#VALUE!``です。

###例3. 秒より下が表示されない
``1:23:45.67``→表示``1:23:46``、内部``1:23:45.67``
実はこれが一番マシで、ちゃんと時間扱いになってる上に小数点未満も内部に持っています。
数式バーにも秒以下四捨五入の数字が入っているので、一見すると小数点以下が強制的に丸められてしまったように見えますが、表示形式から``hh:mm:ss.00``を指定するとちゃんと復活します。



#解決方法（両方必要）
###手順1. 正しい書式で入力する
まずは例1,2について、きちんと時間（差）として認識させる必要があります。
そのためには、例3と同様に``h:m:ss.00``で入力します。
そこまで遅くないという人もインド人に感謝して0で埋めてください。
![gss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311217/87523c25-cd61-9815-ef1e-b3b6e378870e.png)
これで時間形式の数値になりました。

###手順2. 表示形式を変更する
表示形式を変更することで小数点未満が表示できます。
正直手順1さえできればこの問題はほぼ解決してますし、表示形式の変更なんてみんな知ってることでしょうが、手順として備忘も兼ねて書いておきます。
（私は例3で小数点未満が消えてしまったと思い込んで表示形式変更せず右往左往してましたが、こんなやつそうそうおらんやろ……）
「表示形式」→「数字」→「表示形式の詳細設定」→「カスタム数値形式」で
``m":"ss"."00``です。
ここはお好みで、1時間超える競技の人なら``h":"m":"ss"."00``、ミリ秒以下要らなければ``h":"m":"ss"``、分単位を必ず2桁出したければ``h":"mm":"ss"."00``、などなどカスタムしてください。


#しかし面倒だ
長くて数分の競技なのに毎回時間から入れるとか面倒極まる
入力するときは最初に入れたようなフォーマットでササっと入れたい
後からなんかこう、いい感じにしてほしい
まあそうなりますよね。これです。

| パターン | 数式 |
|:-----------|------------|
|例1|``=IFERROR(("00:00:"&[入力したセル])*1)`` |
|例2|``=IFERROR(("00:"&[入力したセル])*1)``|
|例3|不要|

![gss3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311217/9107d6c0-a13b-9478-3af5-5bc57325265f.png)

いちいち人力で例1-3を判別するのはあまりにダサいので、まとめるとこれ↓（入力したセルをB2とする）
``=IF(ISNUMBER(B2),IF(B2>1,IFERROR(("00:00:"&B2)*1),B2),IFERROR(("00:"&B2)*1))``
これでついにいろんなパターンのタイムがすべて時間差として扱えるようになりました。
あとは足しても引いてもお好きなように！

<details><summary>いちおう解説しておくと、こういうことです。</summary>
数値である→例1か例3
　1より大きい→例1
　1未満　　　→例3
数値でない→例2
※日付形式になっている場合、内部では24時間を1とする浮動小数で評価されています。</details>


#参考
だいたいここに書いてありました。感謝。
[How to Format Time to Millisecond Format in Google Sheets](https://infoinspired.com/google-docs/spreadsheet/format-time-to-millisecond-format-in-google-sheets/)

#蛇足
（ミリ秒って言ってるけど小数点以下2桁なので厳密にはセンチ秒かもしれない）
MATLABで条件演算子的なことをする方法【解説あり】

# やり方
`if_ = @(bool,t,f)feval(@(list,index)list{index},{f,t},uint8(logical(bool)+1));`
とする。
するとそれ以降、
`if_(true, "はい", "いいえ")`は`"はい"`、
`if_(false, "はい", "いいえ")`は`"いいえ"`になる。

# Q1. え？ｗ関数で十分なんじゃないの？わざわざ変数で作るなしｗｗｗ
A. MATLABの仕様で、ライブ スクリプトとかでは関数を定義できません。
(作った瞬間ライブ関数に変化し、ライブ スクリプトの外部からも呼べるようになってしまいます。pythonでいうJupyter Notebookのようにはいかないのです。)
ライブ スクリプトでしか使わない簡単な処理で、わざわざ関数を別ファイルで作りたくない時などに重宝するかと。

# Q2. コード解説
A. 外側から順に解説します。  

## Q2-1. `@(A, B, ...)X`ってなによ
A. まず`@(A,B,...)X`というのは「即時関数」といって、pythonでいうラムダ式みたいなものです。
たとえば、`f = @(x)a*x+b;`とすると、`function y=f(x); y=a*x+b; end` したのと同じになります。
つまり、今回のコードは次に等価です。

```matlab:if_.m
function rtn=if_(bool,t,f)
    function anony_rtn=anonymous(list, index) % matlabでは関数内関数が可能
        anony_rtn = list{index};
    end
    rtn = feval(anonymous(list, index),{f,t},uint8(logical(bool)+1));
end
```

## Q2-2. いつの間にか謎が`feval`だけになってる
A. `feval(f,A,B,...)`は`f(A,B,...)`を返却します。
つまり、次と等価なわけです。

```matlab:if_.m
function rtn=if_(bool,t,f)
    function anony_rtn=anonymous(list, index)
        anony_rtn = list{index};
    end
    rtn = anonumous({f,t}, uint8(logical(bool)+1)));
    % uint8(logical(bool)+1))はboolが偽なら1に、真なら2になる
    % →cell配列{f,t}のインデックスにすれば、偽のときf、真のときtが取り出せる
end
```

## Q2-3. feval要らない子じゃね？
A. `feval`は一見無駄な存在に見えますが、即時関数`@()`とめちゃくちゃ仲良しです。
2人の友情は、**関数を作れなかったはずのライブ スクリプトに革命をもたらします**。  
例えば`feval(@(x)hoge, 1)`は何と等価でしょうか？
`(@(x)hoge)(1)`と等価に思えますが、MATLABでは実はこういう書き方が出来ません。
`anonymous = @(x)hoge; anonymous(1);`と**2文**も書かなくてはならず、しんどいです。
そのしんどさを軽減し、**1文**で済ませてくれるのが`feval`ってわけです。  
しかも1文で済んでるってことは、こいつを丸ごと即席関数の戻り値にすることもできるってことです。  
だから事実上、
`@(x)feval(@(x)feval(@(x)feval(@(x)feval... , var),fuga), hoge)`
みたいに「即席関数←→feval」を間接再帰的に繰り返すことで、
**複数の処理を即席関数1つですませることも可能**なのです。可読性は著しく下がりますが。  
**可読性さえ諦めれば、ライブスクリプトで関数作りたい/使いたい放題です！**

というわけで「fevalは要らない子」なんていったら即時関数に怒られます(笑)。


# 謝辞
昨日、メモ代わりにこの記事を投稿しました。そりゃもう「やり方」の章だけで。  
今日の朝見てみたら通知が来ていたので「スパムとみなされて消されでもしたのかな」と思ったら、LGTMが3つも来てて大喜び。  
慌てて記事の内容をまだマシにした次第です。  
LGTMしてくれたみなさん、ありがとうございます。
Express4とtypescriptでreq.userを使えるようにする


ミドルウェアで次のようにユーザー情報をいれようとしました。

```
app.use((req, res, next) => {
  req.user = hogehoge;
});
```

怒られました。

```
Property 'user' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs>'
```

いろいろ調べた結果、globalにExpressのrequestを拡張すればよいことがわかりました。
https://stackoverflow.com/questions/37377731/extend-express-request-object-using-typescript/58788706

## やり方

###  `@types/express/index.d.ts` というフォルダとファイルを作る。
名前は必ずこれである必要あり。フォルダの場所はアプリルートでも、srcフォルダ以下でもよい。

```
// req.user が使えるようにする。
declare namespace Express {
  export interface Request {
      user: any;
  }
}
```
### tsconfig.jsonを編集する
typeRootsを追加。自分で先程追加した@typesの場所と`node_modules/@types`を追加。この場合はsrc/以下に作ったのでsrc/@typesとなっている。

```
"compilerOptions": {
  "typeRoots": ["src/@types", "node_modules/@types"],  
  ...
}
```

これでうまくいきました。
MySQLで勝手に（暗黙的に）インデックスしてくれるケース

「勝手にインデックス貼られるのってどういうときだっけ？」となったときのメモ

- カラムにプライマリーキーを設定（Primary Key）
- カラムにユニーク制約を設定（Unique Key）
- カラムに外部キーを設定（Foreign Key）
Apacheをインストールしたらするべきこと

webサーバとしてApacheをインストールした後にすべき設定です。

# 環境
mac 
centOS7 (centOS6以前だとコマンドが一部異なります。以下参照)
https://www.server-memo.net/centos-settings/centos7/systemctl-enable.html

> CentOS 6 以前の場合、apache(httpd)等のサービスを自動起動させる、させないといった設定は「chkconfig」コマンドを使用していたと思いますが、CentOS 7ではサービスの管理は一部のサービスを除き「systemd」で行うといった仕様に変更となっています。
従来の「chkconfig サービス名 on | off 」のコマンドも使用できますが、「systemctl」コマンドに転送されています。

#目次
[・自動起動にする](#自動起動にする)
[・DocumentRoot以下の作業ユーザ作成](#DocumentRoot以下の作業ユーザ作成)

# インストール

```
sudo yum install httpd
```

# 自動起動にする

### 現在のApacheのステータスを確認

```
systemctl status httpd
```

```
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead) 
     Docs: man:httpd(8)
           man:apachectl(8)
```

`Active: inactive (dead) `になっているのでインストールした時点では起動していない。

### 起動する

```
systemctl start httpd.service
```

```
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-11-05 08:32:56 UTC; 9s ago
     Docs: man:httpd(8)
           man:apachectl(8)
```

`Active: active (running) `になっていれば起動できている。

### 自動起動設定にする

以下実行

```
systemctl enable httpd.service
```

確認

```
systemctl list-unit-files -t service | grep httpd
httpd.service            enabled
```

`enabled`になっていれば変更完了。
※ grepのキーワード指定を書かない場合は`service`に関する設定がずらっと表示される。

# DocumentRoot以下の作業ユーザ作成

- Apacheを導入当初は、DocumentRootに`\var\www\html`が設定されている。
- - Apacheを導入当初は、rootユーザでしかアクセスできない。
- 通常であれば\var\www\html以下にhtml,css,phpなどのwebサイトのデータを入れる。
- コーダやプログラマが\var\www\htmlよりも上の階層のファイルの設定をいじれるのは運用上よろしくないので、それらの作業者向けに`\var\www\html以下しかいじれないユーザを作る`必要がある。

### ユーザ作成

webadminというユーザを作成します。

```
useradd -d /var/www/html -u 400 -M webadmin
```
> `-d /var/www/html`は、/var/www/htmlをホームディレクトリにするという意味。`-u 400`は、uidの指定。このディレクトリ は既に存在しているので`-M`をつけることで新たにディレクトリを作成しないようにしてます。

パスワード設定します。

```
passwed webadmin
Changing password for user webadmin.
New password:(xxxx)
Retype new password:(xxxx)
passwd: all authentication tokens updated successfully.
```


### パーミッションとユーザ変更

現在の\var\www\html(DocumentRoot)のパーミッションとユーザを確認

```
ls -ld /var/www/html
drwxr-xr-x. 2 root root 6 Apr  2  2020 /var/www/html
```

webadminに変更

```
chown webadmin:webadmin /var/www/html
```

確認

```
ls -ld /var/www/html
drwxr-xr-x. 2 webadmin webadmin 6 Apr  2  2020 /var/www/html
```
これで作業者がweｂサーバにwebadminユーザで接続した場合、/var/www/html以下で作業できるようになる。
「JSでStrCmpLogicalWみたいなソートがしたい」「　(╬▔皿▔)╯<ｱ”?」 ってなった時

## 顧客「自然順にして」
言語やユーザ、OSによって解釈が分かれてくる「自然順」。
正直なコト言うと「JSでは`arr.sort()` が自然順だ！運用回避でよろしく。」とか言いたい。

が、いい感じにソートを行ってくれるやつに遭遇した。

```js
const natsort = new Intl.Collator(navigator.language, {sensitivity: 'variant', numeric:true}).compare;
```

文字列のリストを

```text
a2sample
a10sample
b10sample1
b10sample10
b1sample1
b2sample1
b10sample2
b2sample2
b1sample2
b1sample10
b2sample10
a1sample
```

`arr.sort(natsort)` とかすることで

```
a1sample
a2sample
a10sample
b1sample1
b1sample2
b1sample10
b2sample1
b2sample2
b2sample10
b10sample1
b10sample2
b10sample10
```

いい感じにソートしてくれました。

参考: [Intl.Collator - JavaScript|MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Intl/Collator)
絶対値を返すperlワンライナー

誰かがググった時にさっと答えが出てくるためのやつ。
絶対値(abs)を返すpelrのワンライナー(one-liner)

```perl
perl -pe '$_=abs($_)."\n"'
```

perl詳しくないので、もっと簡単な方法もあるかも。
composer.pharのメジャーバージョンアップのエラー対応

phpのデプロイツールdeployerやECCUBE4の標準のDockerfile等、composerを利用する場合は、基本常にウェブから最新を取得して実行するのが推奨なため、今回2020-10-24にメジャーバージョンが1から２になったため盛大にコケる。

バージョンアップの差異に引っかからずうまくいくケースもあるが、composerの命名規則や細かい違いがあるため、大抵の場合失敗する。

# 対応策
## deployerの場合
ローカルにcomposerがある場合は、それを利用する設定になっているため
単に1系のcomposerを配置しパスを通せば良い。

１系の最後
https://getcomposer.org/download/1.10.17/composer.phar

## ECCUBE4のDockerfileの場合
ローカルにあるなしに関わらず問答無用でWEBから最新を取得している。
なので、composer.pharを配置したあとにDockerfileの一部だけ書き換える

```RUN curl -sS https://getcomposer.org/installer \
   | php \
   && mv composer.phar /usr/bin/composer \
   && composer config -g repos.packagist composer https://packagist.jp \
   && composer global require hirak/prestissimo \
   && chown www-data:www-data /var/www \
   && mkdir -p ${APACHE_DOCUMENT_ROOT}/var \
   && chown -R www-data:www-data ${APACHE_DOCUMENT_ROOT} \
   && find ${APACHE_DOCUMENT_ROOT} -type d -print0 \
   | xargs -0 chmod g+s \
   ;
```

```RUN chmod 777 composer.phar
   && mv composer.phar /usr/bin/composer \
   && composer config -g repos.packagist composer https://packagist.jp \
   && composer global require hirak/prestissimo \
   && chown www-data:www-data /var/www \
   && mkdir -p ${APACHE_DOCUMENT_ROOT}/var \
   && chown -R www-data:www-data ${APACHE_DOCUMENT_ROOT} \
   && find ${APACHE_DOCUMENT_ROOT} -type d -print0 \
   | xargs -0 chmod g+s \
   ;
```

以上。

追伸
あとプラグインを入れて、そのプラグインがローカルなリポジトリからコンポーネントを引っ張っている場合は通常のcomposer installでコケる。
その場合以下参照
https://qiita.com/applexco/items/00831ba61936139e8b26
Diagramsを用いて構成図を描いてみた

## はじめに
構成図を描くのにdraw.ioを使っていたのですが、diagramsというツールを使えばコードで描けるとのことだったので試してみました。

- [Diagrams Diagram as Code](https://diagrams.mingrammer.com/)

## 環境
- Mac OS Catalina
- Docker for Mac

## ファイル構造

```bash
├── Dockerfile
└── test.py
```


## Dockerイメージをつくる
[ドキュメント](https://diagrams.mingrammer.com/docs/getting-started/installation)にはpython3.6以上かつ、[Graphviz](https://www.graphviz.org/)をインストールしておいてとあるので、そのようにDockerfileを作成。（今回はalpineを使ってみたかったのでalpineで作成しました。）


```dockerfile
FROM python:3.8-alpine

WORKDIR /app
RUN apk add --update --no-cache \
    graphviz \
    ttf-freefont \
    curl \
    bash

# フォントの追加
RUN curl -O https://noto-website.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip \
    && mkdir -p /usr/share/fonts/noto \
    && unzip NotoSansCJKjp-hinted.zip -d /usr/share/fonts/noto/ \
    && fc-cache -fv \
    && rm NotoSansCJKjp-hinted.zip

RUN pip install diagrams
``` 

あとは作成したDockerfileをビルドする。
タグはご自由に！今回は`diagrams`とします。

```bash
$ docker build -t diagrams .
```

## ファイルを準備する
[公式ドキュメント](https://diagrams.mingrammer.com/docs/getting-started/installation)を参考にしながら、ファイルを作成します。

```python
from diagrams import Cluster, Diagram
from diagrams.aws.compute import ECS
from diagrams.aws.database import ElastiCache, Aurora
from diagrams.aws.network import ELB
from diagrams.aws.network import Route53

with Diagram("Test", show=False):
    dns = Route53("dns")
    lb = ELB("ALB")
    api = ECS("API")
    redis = ElastiCache("redis")

    with Cluster("DB Cluster"):
        db_test = Aurora("test")
        db_test - [Aurora("test ro")]

    dns >> lb >> api
    api >> db_test
    api >> redis
    db_test >> redis
```


## 構成図を出力する
今回はDockerを用いているので以下のようにコンテナを起動して、コマンドを実行します。

```bash
docker run --rm -v `pwd`:/app diagrams python test.py
```

実行後、`png`ファイルが追加されます。

```bash
├── Dockerfile
├── test.png
└── test.py
```

## 作成された図
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771053/831e0319-3a52-bbbc-3357-a3aa507c845a.png)


## 最後に
構成図を描くだけであればdraw.ioとかでも問題ないですが、コードとしてGitで管理できるのは良い点だと思いました。ただ、欲しい画像がまだ無かったり、複雑なもの（AZやECSのタスク等々）を描きたい時は使いづらい感じでしたので、今後の更新とともに色々と試していこうかなと思います。


## 参考
- [Diagramsを使ってPythonでシステム構成図を描く| Developers.IO](https://dev.classmethod.jp/articles/diagrams-introduction/)
【Unity】クリックしたら音が鳴るようにする方法（自分用）

右クリックしたら音が一回鳴るようにするやり方。

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    AudioSource _audiosource;
    public AudioClip sound;

    void Start()
    {
        _audiosource = GetComponent<AudioSource>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            _audiosource.PlayOneShot(sound);
        }
    }
}
```
このスクリプトを適当なオブジェクトにアタッチ。
インスペクターに鳴らす音源をドラッグ＆ドロップ。
AudioSourceをつけるのを忘れずに。
[基本情報技術者試験]線形探索のアルゴリズムをPythonで書いてみた。

# 概要
- 基本情報技術者試験の午後の試験でアルゴリズムがあります。過去問を解いても理解ができません…。実際にアルゴリズムをPythonで書いて、理解を深めていきたいと思います。

- 前回は[配列の最大値](https://qiita.com/kuro_take/items/2130f337c45dc1695c7c)のアルゴリズムを書きました。
- 今回は**線形探索**のアルゴリズムから書いてみます。

## 線形探索
#### アルゴリズム
  - 配列の要素を先頭から末尾まで順番に取り出して、指定された値と比較する。

#### コード
```Python
# 線形探索で指定された値を見つけるSeqSearch関数
def SeqSearch(A,Length,X):
    Pos = -1
    i = 0
    # 繰り返し処理
    while i < Length and Pos == -1: # 「配列の末尾に達していない」と「見つかっていない」を意味する
        print("Pos=",Pos,"i=",i,"A[i]=",A[i]) # 途中の結果
        # 分岐処理
        if A[i] == X:
            Pos = i
        i += 1
    return Pos

print("実行結果：",SeqSearch([22,55,66,11,44,77,33],7,77))
```
#### 実行結果
```
Pos= -1 i= 0 A[i]= 22
Pos= -1 i= 1 A[i]= 55
Pos= -1 i= 2 A[i]= 66
Pos= -1 i= 3 A[i]= 11
Pos= -1 i= 4 A[i]= 44
Pos= -1 i= 5 A[i]= 77
実行結果： 5
```

# まとめ
- 線形探索はちょっと複雑
- 次回は**二分探索**のアルゴリズムを書こうかな

# 参考
- こちらの本のCHAPTER3 04線形探索を引用または参考にしました。
[情報処理教科書 基本情報技術者試験のアルゴリズム問題がちゃんと解ける本 第2版](https://www.shoeisha.co.jp/book/detail/9784798150468)
散布図のデータにラベルを付ける時，ほかのデータとラベルを避けたくないですか？

# 成果物
下図のような図が得られます．
![usage_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570966/f0b26f80-e840-89a7-b5d1-0147e6ccba36.png)

ソースコードはMATLAB Exchangeにも置きました．
https://jp.mathworks.com/matlabcentral/fileexchange/82280-calctextposinscatterplot


# 散布図にラベルを付けたい

散布図の各データ点にラベルを記入したい場合，データが密集しているとラベルが重なって読めなくなってしまいます．たとえばこんな感じ．

![usage_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570966/bd876e5f-88ca-d226-6409-82ab3edf32a6.png)


そのような場合，ラベルの位置をデータと他のラベルに応じて自動で調整したくなります．手動は現実的ではありません．ラベルとデータを線でつなぐとよりよさそうです．

ということでやってみました．

## ソースコード

``` MATLAB:calcTextPosInScatterPlot.m

function [txPos]=calcTextPosInScatterPlot(dtPos)

x=dtPos(:,1);y=dtPos(:,2);
dtPos=[x,y];

figure
scatter(x,y);
tmpAx=axis;tmpScl=tmpAx*[[-1;1;0;0] [0;0;-1;1]];
txPos=1.00*[x y];
txPosOld=txPos;
close(gcf)

for n1=1:1000
    for n2=1:size(txPos,1)
        for n3=1:size(dtPos,1)
            dv=(dtPos(n3,:)-txPos(n2,:))./tmpScl;
            if norm(dv)>0.01
                txPos(n2,:)=txPos(n2,:)-3e-6*dv.*tmpScl/norm(dv)^2;
            end
        end
        for n3=1:size(txPos,1)
            if n2~=n3
                dv=(txPos(n3,:)-txPos(n2,:))./tmpScl;
                txPos(n2,:)=txPos(n2,:)-2e-6*dv.*tmpScl/norm(dv)^2;
            end
        end
    end
    if    norm((txPosOld-txPos)./tmpScl)<1e-4
        break;
    end
    txPosOld=txPos;
    
end
end

```
### ソースコード解説
入力 `dtPos` は散布図で表示したいデータ，出力 `txPos` はラベルの位置です．

基本の発想は以下です．

1. `dtPos`および`txPos`それぞれの点の間に斥力が働いているものと仮定する．
3. 斥力に応じて`txPos`を修正する．
    4. 距離が近いほど斥力は大きいとする(ただし，近いデータがあると遠くに飛んでしまうのでそのあたりは各自調整してください)
5. 修正量が小さくなったら止める．

微調整が必要なパラメータがいくつかあって，データの分布に対してどの程度の値が適切なのかが変わりそうなので，利用時は適宜調整してください．一応各軸の画面上のスケールには対応できています(距離はデータの値そのものではなく，画面の見た目に近くなるように各軸を正規化しています)．
スケールに対応するために，一度散布図を描画したのちに`axis`で各軸の範囲を取得しています．

## 実装例
利用時にはデータとラベルの位置を破線で結ぶとわかりやすいでしょう．実装例です．

```MATLAB:usage_calcTextPosInScatterPlot.m
clear
clc
close all

plotData=[100*randn(20,1) randn(20,1)+10];
plotText=char(('A'+(0:19)')*[1 1 1 1]);
textPosition=calcTextPosInScatterPlot(plotData);

figure
hold on;

for n1=1:size(plotData,1)
    plot([textPosition(n1,1) plotData(n1,1)], ...
        [textPosition(n1,2) plotData(n1,2)],'b--')
    text(textPosition(n1,1), textPosition(n1,2), ...
        plotText(n1,:), 'HorizontalAlignment','center','fontname','メイリオ', ...
        'BackgroundColor','w');
end
scatter(plotData(:,1),plotData(:,2));

grid on;
set(gca,'FontName','arial','FontSize',12)
saveas(gca,'usage_02','png')

```
出力の見栄えを考えると，
1. データとラベルをつなぐ線
2. ラベル
3. データ
の順に描画した方がよいので，そのように実装しています．

出力例は以下です．冒頭で示したものと同じです．
![usage_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570966/36a1c1f8-f813-e3d9-0dde-6cc6cf312f6f.png)

### 雑感と個人的なつぶやき
グラフの描画だと，位置を適当に配置してくれる機能があって(`graph`に対する`plot`関数)，それも多分ここで示したように仮想的な斥力を計算してノードを配置していると想像しています．ので，散布図の場合でも公式で対応してもらえるとむっちゃうれしいなぁ…
[基本情報技術者試験]配列の最大値のアルゴリズムをPythonで書いてみた。

# 概要
- 基本情報技術者試験の午後の試験でアルゴリズムがあります。過去問を解いても理解ができません…。実際にアルゴリズムをPythonで書いて、理解を深めていきたいと思います。

- 前回は[ユークリッドの互除法](https://qiita.com/kuro_take/items/525c5e31268f22c08fcf)のアルゴリズムを書きました。
- 今回は**配列の最大値**のアルゴリズムから書いてみます。

## 配列の最大値
#### アルゴリズム
  - 配列の先頭の要素を仮の最大値とする。配列の残りの要素と仮の最大値を順番に比較して、より大きい値を見つけたら仮の最大値を更新する。

#### コード
```Python
# 配列の最大値を求めるMax関数
def Max(A,Length):
    Ans = A[0]
    # 繰り返し処理
    i = 1 # ループカウンタの初期値を1にする
    while i < Length:
        print("Ans=",Ans,"i=",i,"A[i]=",A[i])
        # 分岐処理
        if A[i] > Ans: # 新たに取り出した要素が仮に最大値より大きければ
            Ans = A[i] # 仮の最大値を更新する
        i+=1
    return Ans

print("実行結果：",Max([12,56,78,34,90],5))
```
#### 実行結果
```
Ans= 12 i= 1 A[i]= 56
Ans= 56 i= 2 A[i]= 78
Ans= 78 i= 3 A[i]= 34
Ans= 78 i= 4 A[i]= 90
実行結果： 90
```

# まとめ
- 配列の最大値は意外に難しい
- 次回は**線形探索**をのアルゴリズムを書こうかな

# 参考
- こちらの本のCHAPTER3 03配列の最大値を引用または参考にしました。
[情報処理教科書 基本情報技術者試験のアルゴリズム問題がちゃんと解ける本 第2版](https://www.shoeisha.co.jp/book/detail/9784798150468)
【WordPress】body_class();でページごとに違うデザインを適用させる方法

#何につまずいたか
WordPressでホームページ制作をしているときに、「フロントページのヘッダーにだけ適用したいcssがある場合どうしたらいいか？」ということがあったので、その解決法をまとめました。
ヘッダーに限らず特定のページにだけcssを適用させたいときに使えると思います。
ちなみに開発環境は、本番環境ではなく「Local by flywheel」を使用しています。(WordPress Version 5.2.9)
#解決方法
ヘッダーのファイル(header.php)に

```php:header.php
<?php body_class(); ?>
```
を入れることで解決できました。

入れる場所はbodyタグの中です。

```php:header.php
<body <?php body_class(); ?>> 
```

これを入れてあげることで、body要素に新たなclass属性が付与されます。

どんなクラス属性が付与されているかは、chromeのデベロッパーモード(検証モード)で確認していただければ分かります。
例えば、フロントページ(WordPressの表示設定で固定ページ表示にした)の場合

```
<body class="home  page page-id-***> <!-- ***にはidの番号が入ります -->
```

「home」というクラス属性が新たに付与されるかと思います。

そのクラス属性を使ってcssを書いてあげればフロントページのデザインだけ変えることが出来ます。

```css:style.css
body {
  background-color: white; /* homeクラスが付与されたフロントページの背景は白 */
}

body:not(.home){
  background-color: red; /* homeクラスが付与されていないその他のページの背景は赤 */
 }
```
#参考

 [テンプレートタグ/body class - WordPress Codex 日本語版](http://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/body_class)
こちらのサイトを見ていただけるとフロントページ以外にもどのようなクラス属性が付与されるのか等、記載されています。
#おわりに
フロントページのヘッダーにだけ背景画像を入れたい場面があったのですが、そのために複数のヘッダー用ファイルを作るより簡潔な方法かなと思います。
知っているとWordPressでの制作に便利だなぁと思ったので、今回備忘録をかねて初記事を書いてみました。
何か、誤りなどあれば、ご指摘いただけるとありがたいです。
【Node.js 】Node.js と npm をインストールする（Windows）

とあるツールの導入マニュアルを作った際にインストール方法をまとめたので、せっかくだし Qiita 記事に上げさせていただきます。
まぁ、既に色々な方が書いてらっしゃるで需要があるかは謎ですが・・・

でも、ひとつだけ、重要なことを書いておきます。

Windows 版の Node.js をインストールすると、
**npm も一緒にインストールされます。**

なので、npm を別でインストールする必要はありません。
マニュアルを作る上で、ひとつ工程が減ります。
ユーザもよくわからない手順がひとつ減ります。

大事なことなのでもう１回言います。

Windows 版の Node.js をインストールすると、
**npm も一緒にインストールされます。**

それでは、Windows 版 Node.js のインストール手順を説明していきましょう！

# node.js をインストールする

Windows に Node.js をインストールするには、以下のサイトから Node.js をダウンロードしてインストールを行います。
https://nodejs.org/en/

![1604563523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/ba7d3477-44e8-4f07-188c-c3429287c3d9.png)

※上図より新しいバージョンがある場合は最新バージョンをインストールします。

### インストールプログラムを起動

ダウンロードした `node-v14.15.0.msi` をダブルクリックしてインストールプログラムを起動します。
（ファイル名は最新バージョン名に変更されることがあります）

「Next」ボタンがクリックできるようになったら「Next」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/04094805-963a-e8fc-9fd7-50252c1cc289.png)

次の画面で、利用規約に同意して「Next」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/0bfa2623-4bf2-5903-bcdf-10c5ea67f066.png)

### インストール設定

標準で設定されている内容でかまわないので、インストールフォルダを選択している状態の表示画面で「Next」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/4c722ab3-54f8-d123-15c7-ffb7dd1bd31c.png)

カスタムインストール画面が表示されます。
標準の状態でインストールするので、このまま「Next」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/2c491d5a-3f67-9dca-032d-28f95a8c8113.png)

Tools for Native Modules の画面が表示されます。
インストールする必要はないのでこのまま「Next」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/28bdbb05-4532-32bf-3f04-931ad575bfa1.png)

### 管理者としてインストールします

管理者としてインストールします。「Install」ボタンをクリックします。
利用環境によっては管理者パスワードを求められることがあります。
その場合は、管理者にパスワードを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/9f1f6e80-d516-0709-ce7b-83349513ab21.png)

インストール中の画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/2ea0c12b-d934-4793-1fdb-babb84d4e401.png)

インストール完了画面が表示されたら「Finish」ボタンをクリックしてインストールを終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363367/017f20a5-252a-7ce1-84ff-8ca3165cc834.png)

# おわりに

ここまでお付き合いいただきありがとうございました。

Windows で Node.js で作ったプログラムを実行する Batch ファイルを作ったんですよ。
各モジュールもインストールする必要があるので setup 用の Batch ファイルも作って。
その際、npm install を実行してもらうので npm のインストール手順も書かなきゃー！って思ってたんですが、標準で一緒にインストールされるとかなんとか。すばらっ！(*'▽')

ちなみに Linux 系は別々にインストールする必要があって、[Mac は nodebrew ってやつを入れるみたい](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)です。
Mac 持ってないのでわかりません。サンタさん、くれないかな( ﾟДﾟ)

最後に、大事なことなのでもう一度！ヾ(*´∀｀*)ﾉ

Windows 版の Node.js をインストールすると、
**npm も一緒にインストールされます。**

ではまた！(^^)/

# 参考にさせていただきましたm(_ _)m

[MacにNode.jsをインストール](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)
FSCalendarで指定の日付をコードで選択する方法

## 概要
・FSCalendarで画面遷移した際などに、指定の日付に選択させる。
・画面遷移先での日付の指定に困ったので、Qiitaに書きます。

## コード
```swift:ViewController.swift

@IBOutlet weak var calView: FSCalendar!


override func viewWillAppear(_ animated: Bool) {
            
    let calPosition = Calendar.current
    //ここの日付の指定はInt型
    let selectDay = calPosition.date(from: DateComponents(year: 2020, month: 11, day: 5))
    calView.select(selectDay)
}

```

## 補足
・DateComponentsでの日付指定はInt型
・自分は別画面で取得した値がStringなのでIntにキャストしています。
・見やすいようにInt型で書いています。
『暗号解読』の暗号をPythonで作ってみる

下巻のp101～103の暗号化をPythonでやってみました。どれも、HELLOを暗号化します。

#1-1. 転置式の暗号化

＜入力＞
HELLO

```
s=input()
n=len(s)
l=[]
for i in range(n):
    l.append(str(bin(ord(s[i])))[2:])

m="".join(l)

odd=m[::2]
even=m[1::2]

num=len(even)

for j in range(num):
    print(even[j],end="")
    print(odd[j],end="")
print(odd[-1])
```
＜出力＞
01100010001010011001100011000110111

まずはASCIIに変換。
これはord()でOK。UnicodeとASCIIはアルファベットは同じ数字なんですね。へえ。

２進数は扱いづらいので、
str()で文字列にすれば、それぞれの位の数字を取り出せる。
str(bin(ord(s[i])))[2:]で、頭の0bを取る。

どうやって１番目の数字と２番目の数字を交換しようかなと考えたけど、
AtCoderのA問題でありそうな処理にしてみました。

奇数番目と偶数番目に分けて、交互に出力していく。

oddの方が一文字多いので、最後にodd[-1]だけ出力。
入力が偶数個のアルファベットだとまた変えなきゃいけないけど、
とりあえず今回はこれで。

#1-2. 転置式の解読
今度は逆に、01100010001010011001100011000110111をHELLOに戻してみます。

＜入力＞
01100010001010011001100011000110111

```
s=input()
even=s[:-2:2]
odd=s[1::2]

l=[]
n=len(even)
for i in range(n):
    l.append(odd[i])
    l.append(even[i])
l.append(s[-1])

m="".join(l)

num=len(l)//7

for j in range(num):
    print(chr(int(m[7*j:7*(j+1)],2)),end="")
```
基本的には暗号化の逆なので、まだ簡単でした。

２進数を１０進数に戻すのに、int('二進数表記の数字', 2)　でいいと知ったので、シンプルに記述できました。
[Pythonで2進数、8進数、16進数の数値・文字列を相互に変換](https://note.nkmk.me/python-bin-oct-hex-int-format/)

#2-1. 換字式の暗号化
まず、DAVIDをASCIIコードに変換します。
10001001000001101011010010011000100
これが鍵になります。

暗号化のルールは、
・平文と鍵の各要素が同じならば、暗号文は0になる。
・平文と鍵の各要素が異なる場合は、暗号文は1になる。
排他的論理和(XOR)ですね。

＜入力＞
HELLO
DAVID


```
s=input()
key=input()

n=len(s)

#ASCII変換
l_s=[]
l_k=[]

for i in range(n):
    l_s.append(str(bin(ord(s[i])))[2:])
    l_k.append(str(bin(ord(key[i])))[2:])
    
a_s="".join(l_s)
a_k="".join(l_k)

num=len(a_s)
cipher=[]

for j in range(num):
    if a_s[j]==a_k[j]:
        cipher.append("0")
    else:
        cipher.append("1")

print(*cipher,sep="")
```
＜出力＞
00011000000100001101000001010001011    


#2-2. 転置式の解読
今度は逆に、00011000000100001101000001010001011 を鍵DAVIDを使用して、HELLOに戻します。
暗号文と鍵の各要素が同じなら平文は0、違うなら1になります。暗号化の時と同じですね。

＜入力＞
00011000000100001101000001010001011
DAVID

```
s=input()
key=input()

n=len(key)

#keyをASCII変換
l_k=[]

for i in range(n):
    l_k.append(str(bin(ord(key[i])))[2:])
    
k="".join(l_k)

num=len(s)
l_p=[]
for j in range(num):
    if s[j]==k[j]:
        l_p.append("0")
    else:
        l_p.append("1")

p="".join(l_p)

n_p=len(p)//7

for l in range(n_p):
    print(chr(int(p[7*l:7*(l+1)],2)),end="")
```
＜出力＞
HELLO
View間でのDelegateのパターン。またNavigationLinkを使ったページ遷移のサンプルを作った。

# ViewDelegatePattern（つい習慣でViewControllerって書いちゃったけど名前的にはこっちの方がいい）
View間でのDelegateのパターン。またNavigationLinkを使ったページ遷移のサンプルにもなっている。

レポジトリはここ＞https://github.com/dropcontrol/ViewControllerDelegatePattern
この記事自体もレポジトリのREADME.mdと同じ。

## TL;DR

View間で値を渡すパターン。Viewを二つ用意。親から子へ渡すパターンと、子から親へ渡すパターンの2つを実装。値の渡し方は他にもあると思うけど、一番基本的なパターン。

## 親から子へ渡す場合

子であるSecondView.swiftに以下を追加

```
let text: String = "Not Success" //　初期値が必要
```

今回の場合親からNavigation Linkを使って呼び出してるので、destinationに登録したSecondView()の中でtextに文字列を渡している。

```
NavigationLink(
  destination: SecondView(delegate: self, text: "Sucess send message"),
  label: {
    Text("Go to SecondView")
  })
```

delegateについては以下の子から親に渡す場合で説明するが、NavigationLinkのdestination毎に遷移先のViewとそのdelegateを呼び出せる。

## 子から親に値を渡す場合

このパターンはよく使うと思う。delegateパターンで実装している。

1) 子である、SecondView.swiftにdelegateプロトコルを実装する。

```
protocol secondViewDelegate {
    func returnData(text: String)
}
```

```
struct SecondView: View {
    var delegate: secondViewDelegate?
```

2) 親に渡すdelegateプロトコルのファンクションをButtonのaction: で呼び出す。


```
Button(action: {
  self.delegate?.returnData(text: "Success!!")
  self.presentation.wrappedValue.dismiss()
}, label: {
  Text("Try delegate")
})
```

3) 親のContentView.swiftでSecondViewDelegateを追加。またNavigationLinkのdestinationでViewのdelegateをselfに設定する。このタイミングで設定できるのは便利。


```
struct ContentView: View, secondViewDelegate{
```

```
NavigationLink(
  destination: SecondView(delegate: self, text: "Sucess send message"),
```

4) `@State` でProperty Wrapperでシステムに状態監視を移譲した変数を登録

```
@State var text: String = "not change yet"
```

5) delegateファンクションでの処理を記述

```
func returnData(text: String) {
  self.text = text
}
```

## NavigationLinkでbackボタンを使わずに戻る

`@Environment` はSwiftUIの環境変数で、これを使うことでいろいろと状態の監視や変更ができる。下記をSecondView.swiftに変数を作る。

```
@Environment(\.presentationMode) var presentation
```
これでpresentationModeの環境変数が取得できてるので、

```
Button(action: {
  self.delegate?.returnData(text: "Success!!")
  self.presentation.wrappedValue.dismiss()

```
と言う感じで、`self.presentation.wrappedValue.dismiss()`を呼び出せば画面を閉じることができる。これは他の画面遷移（例えばモーダルビューなど）でも同じ。

`@Environment`についてはこちらの記事が詳しいです。
https://qiita.com/1amageek/items/59c6bb32a6627b4fb712

といった感じ。
マルチスケールシミュレーション特論



# Introduction

マルチスケールシミュレーション特論の講義内容をまとめる．


# Lecture

-   [第1回] [Qiitaの使い方を覚えよう!](https://qiita.com/midoriyanagi/items/a4f6bc82488b25ffd48e)
-   [第2回] [Rubyの基礎文法を覚えよう!](https://qiita.com/midoriyanagi/items/997cc4a6def5213f3842)
-   [題3回] [Rubyで閏年判定プログラムを作成しよう！](https://qiita.com/midoriyanagi/items/24b0986c52a5eb026056)
-   [第4回] [Rakeの使い方を学ぼう！〜gitの自動化編〜](https://qiita.com/midoriyanagi/items/9195710ecd88239a079a)
-   [第5回] [assert\_equal関数を作成する](https://qiita.com/midoriyanagi/items/b8b017efb99271752d85)
-   [第6回] [Fibonacci数列を作ろう！](https://qiita.com/midoriyanagi/items/4295b2510babe276353e)
-   [第7回] [Class化を学ぼう！](https://qiita.com/midoriyanagi/items/97f54792a9990bee6859)
-   [第8回] [Thor と Rubocop](https://qiita.com/midoriyanagi/items/85707a54664ac7943fb3)


# Assignment

-   [Roman numerals](https://qiita.com/midoriyanagi/items/ffb81f74c3def5166570)
-   [Google recruit problem](https://qiita.com/midoriyanagi/items/ef949c3f64cbded055f8)



------
 - **source** ~/prog/github/grad_members_20f/members/miyanagi/README.org
Pythonのプログラミング入門をScratchで再現チャレンジ

# この記事について

<a href="https://qiita.com/sawamur@github/items/204b93638a4f117c9cc2#ステップ6-ブロック表示部分を関数にする">[ジュニア向け] PythonとProcessingでプログラミング入門：その1 - ブロックくずしを作ろう</a>
この記事を参考に児童へPythonを教えていました。

ただ、年齢の低い児童へは導入としてScratchを教えたいなと思ったので、こちらとほぼ同じプログラムをScratchで作ってみようと試行錯誤しています。

## スクラッチのページ
👇こちら(スクラッチへ飛びます)
<a href="https://scratch.mit.edu/projects/445521901/">Scratchで再現！ 〜PythonとProcessingでプログラミング入門〜</a>

![psc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372019/8f41facb-6882-20ef-682a-fb693d7b86ae.png "こんな感じです")

processing(Python?)では左上が座標(0,0)なのに対し、スクラッチでは中心が(0,0)なので、ブロックが右側に表示されてしまっています。

[ステップ6: ブロック表示部分を関数にする]まで出来ていますが、ステップ7で辞書型が出てくるので、どうやって再現すればいいのか考え中です。


## 参考にした情報
<a href="https://qiita.com/sawamur@github/items/204b93638a4f117c9cc2#ステップ6-ブロック表示部分を関数にする">[ジュニア向け] PythonとProcessingでプログラミング入門：その1 - ブロックくずしを作ろう</a>
[OracleDB]ROWNUMについて

LIMIT句の代わりに使われる、ROWNUM句

以下のような挙動をする

#### 5件取りたい

```sql

SELECT * FROM user WHERE ROWNUM <= 5
```

* 問題なく動く。5件取得する

```sql

SELECT * FROM user WHERE ROWNUM between 0 and 5
```

* これも問題なく動く。betweenの範囲指定はOK

#### 6件目以降を取りたい

```sql
SELECT * FROM user WHERE ROWNUM >= 6
```

* エラーは吐かないが、 `結果は0件` になる

```sql

SELECT * FROM user WHERE ROWNUM between 6 and 10
```

* これも同じく、エラーなしの0件

##### なぜ？

ROWNUMは、 1を含む検索しか許容しない という仕様を持つ。そのため、6件目移行を取得したい場合は1件目を取得していないため結果が帰ってこない。

対応したい場合、副問い合わせを使うしかない。

```sql
SELECT *
(
  SELECT
    * ,
    rownum as tmp_rownum
  FROM user
)
WHERE tmp_rownum between 6 and 10
```

これだと動く。
order by と組み合わせたい場合なども副問い合わせが必要になるため、ROWNUMを柔軟に使いたい場合必要になると考えた方が良さそう。
Qiitaの書き方・練習

#見出し

- 目次
 - ←になる


- 画像を貼る
![news_gohou.png](https://4.bp.blogspot.com/-NXWtB_ZVHyU/Vt08zgFmQ2I/AAAAAAAA4g8/kUJHy-2ifhc/s800/news_gohou.png)

- コードを記載する
```ここにコードを記述する。
方法はバッククォーテーションマーク(```コード```)と記述するらしい。```

- リンクを貼る
- 
[リンクの貼り方](https://www.google.com/webhp?hl=ja&sa=X&ved=0ahUKEwjwt6PY8ursAhUqL6YKHVAPDVQQPAgI)

- 引用方法

>
```>```を記述することで引用にできます。
>>
と書くことで二重引用にすることができます。
二重引用から引用に戻すためには、改行が一回必要なようです。