OmniAICreator/Qiita-1.07M huggingface dataset:
計算量オーダーを考えることは、ボトルネックを考えることだ

とてもみじかい記事です

# 要約
「**計算量オーダー** $O(N)$」[^1] は
計算量そのものを表現する以上に
**速度的ボトルネック**の特定/解消に役立つ、実用的な考え方だぜ[^2]

## どういうことなの
プログラミングにおいて、ある処理にかかる計算量は、**オーダー記法**によって表現されるのが一般的でしょう。

$O(N)$
このように表記される類のもの

基本情報技術者試験の出題範囲でもあるように、知識領域としてはメジャーで、概要を知っている方が多数のはず。


### 『計算量オーダーは処理の計算量をおおまかに表現するものである』

オーダー記法による計算量表記の説明として、上記は正しいでしょうし、このように案内されることは多いように思います。
一方で、**この表現が何に役立つのか** という実用的な側面についての説明は、あまり多くないように見受けます。このせいで、実用されない「物置にしまった知識」になるケースが、それなりに発生しているのではないかと勝手に推察しています[^3]。

### 計算量オーダーを考えることは、(速度的)ボトルネックを考えることだ
オーダー表記で計算量を表現する場合、
①一連の処理を構成する**部分処理の計算量**を把握し
②**もっとも遅さに貢献**する具体的な処理を特定する
というプロセスを踏みます。

いいかえれば、『計算量オーダー』には **算出の過程に、プログラムのボトルネックを検証する視点を含む** という側面があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353793/f174fc37-52ff-a4c0-c918-2d561238dbb0.png "javaのソースです")
この側面をふまえれば、計算量オーダーの算出をとおして **ボトルネックを発見するまなざし**を養う ことや
>計算量算出 -> ボトルネック箇所のプログラム修正 -> 計算量算出(改善結果チェック) -> ボトルネック修正...

のような **プログラムの改善サイクルを静的に回す** ことが可能になります。

『計算量オーダー』はたしかに計算量の表現自体でしかありませんが、
利用を通してプログラムのボトルネックへの解像度が上がり、具体的なアクションにも繋がりうる という点で、**身近で実用的なメリットのある考え方**なのです。

# むすび
計算量オーダーってみんな学ぶわりにあまり使われてないな…という印象があったので
でもじつは競プロみたいな尖った環境でなくても便利に使えるんだぜ！という**雰囲気**を発信したいだけの記事でした。

個人的にも、計算量オーダー知ったのはエンジニアなりたての頃だった筈なのに
実用レベルまで消化して使役してこれなかった反省があったので
知識の整理ついでに、誰かの理解をブーストしえる素材として書き起こしました。

知識の引き出しハードルが低くなれば本望です。知識は使ってナンボだとおもいます


[^1]: この記事では「計算量オーダー」という言葉を「オーダー表記による計算量表現」の意味で使っています。また、「計算量オーダー」を象徴的に表現する記号として O(N)を使っています。オーダー記法での計算量表記 != O(N) です。ほんらいN部分には、N^2だのNlogNだの、表記対象の処理の計算量を表現する数式が入ります。

[^2]: 「計算量を把握する目的は速度改善のためのみ」ではなく、とうぜんほかの側面からも用いられえます。たとえば、計算量が多ければ往々にしてメモリ消費量も多くなるでしょうから、メモリ消費量改善にも用いられえます。ただ速度改善の文脈で引き合いに出されることが経験上多いので、今回は速度に限定して書いています。

[^3]: 競プロガチ勢は物置どころか枕元に置いて毎日一緒に寝るらしいです
tailscale + corednsで名前解決できるプライベートなネットワーク

![diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/61a218c1-6085-0e34-3925-ad2ca5d25311.png)


# 問題

1. 公開したくないサーバーがある
1. ユーザー数は複数いる
1. ユーザーはプログラマーではない（操作は簡単でないとだめ）
1. サブドメインを使いたいのでtailscaleのmagicDNSでは不十分


# 解決

1. tailscaleでプライベートなネットワークを作る
1. tailscale内で機能するDNSを動かす
1. ユーザーはプライベート内のサーバーに`test.domain.dev`みたいな感じでアクセスできる

## coredns

dockerでサクッとDNSを動かしたかったのでこれを使った。


```yml:docker-compose.yml（参考）
version: '3.1'
services:
  coredns:
    build: .
    container_name: coredns
    restart: on-failure
    expose:
      - '53'
      - '53/udp'
    ports:
      - '53:53'
      - '53:53/udp'
    volumes:
      - './config:/etc/coredns'
```

`./config`に`Corefile`を入れて設定。

### 参考
https://qiita.com/nomunomu0504/items/8bd03343072146e8bf27

## tailscale

これは[説明通り][1]にインストールすれば大抵どの端末でも使用可能。
あとはDNS->NameserversにcorednsのホストIPを入れる。

![Tailscale.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/fa819a75-eea0-1560-d09d-c11a51a1a629.png)


## 困ったところ

corednsを動かしてるホストはUbuntu 20.04.2 LTSで`systemd-resolved`というのが127.0.0.53でDNSの53番ポートでLISTENしていた。

この辺りに全然詳しくないが、[これ][2]を読むと歴史的な背景から`/etc/resolv.conf`があらゆるプログラムから書き込まれる可能性があり、これの全体の調和を取るために`systemd-resolved`というデーモンが管理している様子。

これがあると自前のDNSを動かすには...?と訳がわからない事になりそうだったので、[53版ポート使われないように設定した][3]。

これであとはtailscale側でnameserversにDNSのIPを入れればいいだけかと思ったが、どうもubuntuではまだ`/etc/resolv.conf`が`This file is managed by man:systemd-resolved(8). Do not edit.`とあり、ルーターからのDNSを引っ張って来て尚且優先順位がそっちのほうが上...となっていた。

```:/etc/resolv.conf
# こういう感じ
nameserver 192.168.0.1
nameserver 240b:353:fe7b:cd00:ae9e:12ff:30a0:2b40
# Too many DNS servers configured, the following entries may be ignored.
nameserver 102.3.4.5    # <- これがcoredns
nameserver 8.8.8.8
nameserver 8.8.4.4
```

仕方がないので`/etc/systemd/resolved.conf`のDNSを`127.0.0.1`にして自分をまずは参照するようにした。
（MacやRaspberry Piだと素直にtailscaleのnameservers = /etc/resolv.conf）

```:/etc/resolv.conf（macなど）
# 素直にtailsacleの設定と同じ
nameserver 102.3.4.5
nameserver 8.8.8.8
nameserver 8.8.4.4
```


[1]: https://tailscale.com/download
[2]: https://tailscale.com/blog/sisyphean-dns-client-linux/
[3]: https://www.linuxuprising.com/2020/07/ubuntu-how-to-free-up-port-53-used-by.html
【TypeScript】TypeScript の Generics型のUtility



# Generics型のUtility
* TypeScriptのみに存在する、Generics型のUtilityが存在します
* コンパイルすると削除されるが、コンパイル中に型チェックを行ったり型チェックを緩めたりできます
    * Partial型
    * Readonly型  など

```ts
interface CourseGoal {
  title: string;
  description: string;
  completeUntil: Date;
}

//CourseGoalオブジェクトを返す関数
function createCourseGoal(title: string, description: string, date: Date,): CourseGoal { 
  return { 
     title: title,
     description: description,
     completeUntil: date,
   };
}

```

* ここで、TypeScriptでは、新しいオブジェクトを作成して、存在しないプロパティを追加することができません

```ts
function createCourseGoal(
  title: string,
  description: string,
  date: Date,
): CourseGoal {
  let courseGoal = {};  //新しいオブジェクトプロパティを追加することができない！
  courseGoal.title = title;
  courseGoal.description = description;
  courseGoal.completeUntil = date;
  return courseGoal as CourseGoal;
}


//CourseGoalの型には、{}をセットできない
  let courseGoal: CourseGoal = {};  
```

#Partial型
* そこで、 Partial<T>型を使うことで、最終的にはT型になるが、途中は、独自の型をくるんで任意のoptionalのプロパティに変更します
* 空のオブジェクトをセットして、プロパティをセットできます！

```ts
function createCourseGoal(
  title: string,
  description: string,
  date: Date,
): CourseGoal {
  let courseGoal: Partial<CourseGoal> = {};  //CourseGoalの型には、{}をセットできない
  courseGoal.title = title;
  courseGoal.description = description;
  courseGoal.completeUntil = date;
  return courseGoal as CourseGoal; // CourseGoalにキャストして返す
}
```

#Readonly型
* 値を追加しないようにしたい時に使います

```ts
//読み取り専用の文字列を宣言
const names: Readonly<string[]> = ['Cat', 'Dog'];
//names.push('Bird');  //コンパイルエラー
//names.pop();  //コンパイルエラー
```
vue3 #appより上の要素にcssをつけたい

vue初心者です。

##はまったこと
vuecliを使ってsfcプロジェクトを作成。
html,bodyにheight:100%を指定したいが何故かcssが反映されない。

##やってしまっていたこと
① ↓vue.config.jsでプロジェクト全体で使いたい共通scss(common.scss)を読ませるようにした。

```
module.exports = {
  css: {
    loaderOptions: {
      sass: {
        prependData: `
          @import "@/assets/scss/common.scss";
        `,
      },
    },
  },
};
```

② ↓common.scssに共通のcssを記述

```
html {
  font-family: ~~~
  height: 100%;
}
body {
  height: 100%;
}
#app {
  height: 100%;
}
```

③↓App.vueのstyleをscopedにする

```
<style lang="scss" scoped>
.home{
}
</style>
```

これをすると、③のscopedが影響しているのか、common.scssに記述した#appより上の階層のhtmlやbodyのcssが適用されなくなった。

##解決するには
- App.vueでscopedを使わない。
- htmlやbodyなど、#appより上の階層の要素のcssはApp.vueに記述する。

↓App.vue

```
<style lang="scss">
html {
  font-family: ~~~
  height: 100%;
}
body {
  height: 100%;
}
#app {
  height: 100%;
}
</style>
```

↓common.scssにはhtml,body以外のa要素のスタイルなどを書く

```
a,
a:hover,
a:active,
a:visited {
}
```

これとは違う、vueプロジェクトならこうしておきな！っていうベストプラクティスがあるのかもしれません。
勉強中です。
違う方法を覚えたらまた改めて記事にしたいです。
つっこみがありましたらコメントいただけますと嬉しいです。
pi picoでmicropython その28

#概要

picoでmicropythonやってみた。
練習問題やってみた。

#練習問題

ステッピングモーターを回せ。

#サンプルコード

```

import time
from machine import Pin
from rp2 import PIO, StateMachine, asm_pio
@asm_pio(out_init = (PIO.OUT_LOW, PIO.OUT_LOW, PIO.OUT_LOW, PIO.OUT_LOW), out_shiftdir = PIO.SHIFT_LEFT)
def tic():
   pull()
   mov(isr, osr)
   pull()
   mov(y, osr)
   label("loop0")
   mov(osr, isr)
   out(pins, 4)    [1]
   out(pins, 4)    [1]
   out(pins, 4)    [1]
   out(pins, 4)    [1]
   out(pins, 4)    [1]
   out(pins, 4)    [1]
   out(pins, 4)    [1]
   out(pins, 4)
   jmp(y_dec, "loop0")
   label("loop1")
   jmp("loop1")
sm = StateMachine(0, tic, freq = 2000, out_base = Pin(22))
sm.active(1)
sm.put(0x8a462319)
sm.put(10)
time.sleep(1)
sm.active(0)
sm = StateMachine(0, tic, freq = 2000, out_base = Pin(22))
sm.active(1)
sm.put(0x8913264a)
sm.put(10)
time.sleep(1)
sm.active(0)



```

以上。
突然、業務上必要に駆られたひとのための、Go言語入門

表題のとおりです。とにかく要件を満たすためだけにGoを触らないといけないかもしれない人のために最低限の情報だけ集めた。

https://www.tohoho-web.com/ex/golang.html#about

> Google が開発したプログラミング言語です。「Go言語」や「Golang」と表記されます。
UNIX、B言語(C言語の元)、UTF-8の開発者ケン・トンプソンや、UNIX、Plan 9、UTF-8の開発者ロブ・パイクによって設計されました。
静的型付け、メモリ安全性、ガベージコレクションを備えるコンパイル言語です。
シンプル、高速、メモリ効率が良い、メモリ破壊が無い、並行処理が得意などの特徴を備えています。
メモリ破壊が無く、並行処理を得意とする、進化したC言語という側面があります。
Linux、Mac OS X、Windows、Android、iOS で動作します。


## 入門

### インストール
https://golang.org/doc/install

```
C:\workspaces\go>go version
go version go1.16.4 windows/amd64
```

https://qiita.com/tenntenn/items/0e33a4959250d1a55045

https://qiita.com/tfrcm/items/e2a3d7ce7ab8868e37f7


## 簡単にはじめる

https://golang.org/doc/tutorial/getting-started

チュートリアルにしたがい `go mod init example.com/hello` 

```
C:\workspaces\go>go mod init example.com/hello
go: creating new go.mod: module example.com/hello
go: to add module requirements and sums:
        go mod tidy
```

同じ階層に `hello.go` 作成

```hello.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}
```

- go.mod
- hello.go

という、ファイルが存在する状態。


## 実行

```
C:\workspaces\go>go run .
Hello, World!
```

## exe化

```
C:\workspaces\go>go build hello.go

C:\workspaces\go>hello
Hello, World!
```

hello.exe として実行できる。


## チートシート

https://qiita.com/jca02266/items/56a4fb7b07b692a6bf34

https://qiita.com/yakimeron/items/937e65b59ee8fd16a824

### 文字列操作

https://qiita.com/tchnkmr/items/b3d0b884db8d7d91fb1b

### ファイル操作

https://qiita.com/knt45/items/557ee65c46a685ea4f59


## 学習リソースまとめ

https://awesome-go.com/

https://zenn.dev/ytakaya/articles/ff6321bad0cbea


## その他ちょっとしたもの

https://golang.org/pkg/compress/gzip/

https://zenn.dev/kou_pg_0131/articles/go-gzip-compress-and-decompress

https://qiita.com/nakaryooo/items/2d0befa2c1cf347800c3

```args.go
package main

import (
    "flag"
    "fmt"
)

func main() {
    flag.Parse()
    var name string = flag.Args()[0]
    fmt.Println(name)
}
```

https://qiita.com/yu19991013/items/ae4f6e0ebd59dfb9bc3d


以上。参考になればさいわいです。


## 補足: Go言語、最近どうなの

コミュニティは賑わっていそう。

https://blog.golang.jp/

2021年5月、16位。

https://www.tiobe.com/tiobe-index/

これ以降は、[突然、業務上必要に駆られたひとのための、Go言語入門 - おかわり - Qiita](https://qiita.com/e99h2121/items/cd5a015028d3ad66d032)
HTML+CSSでトグルスイッチ

HTMLとCSSでシンプルなトグルスイッチを作ります。

# デモ
<p data-height="256" data-theme-id="0" data-slug-hash="xxqOzWe" data-default-tab="result" data-user="ys-j" data-embed-version="2" data-pen-title="xxqOzWe" class="codepen"></p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

# 解説
## HTML
HTMLはシンプルにいきます。セマンティックなHTMLを心がけます。

```html
<label><input type=checkbox>Click Me</label>
```

楕円部？が`<input>`本体、中の●が`<input>`の::before (pseudo-element)です。
普通のチェックボックスも使う場合は`<input>`は`class=toggle`などにします。

## CSS
次にCSSです。

```css
/* おまじない */
* {
  box-sizing: border-box;
}
body {
  color: #0c0c0d; /* 黒 */
  font-size: 16px;
  line-height: 1.4;
}

/* ここから本文 */

/** ここは下とまとめても問題ないですが、基本的にはページ内でinputのデザインは揃えたほういいと思います */
input {
  border: 1px solid #0c0c0d4d;
  color: #737373; /* グレー */
  display: inline-block;
  margin: 0 4px;
}
/* 楕円部 */
input[type="checkbox"] {
  -webkit-appearance: none;    /* 消してもOK */
  appearance: none;            /* 元々あるチェックボックスを非表示にする */
  background-color: #0c0c0d1a; /* 楕円の色=文字色alpha10% */
  border-radius: 8px;          /* heightの半分 */
  height: 16px; 
  width: 32px;                 /* heightの2倍くらい */
}
input[type="checkbox"]:hover {
  background-color: #0c0c0d33;
  border-color: #0c0c0d7f;
}
input[type="checkbox"]:active {
  background-color: #0c0c0d4d;
}
input[type="checkbox"]:focus {
  box-shadow: 0 0 0 1px #0a84ff inset, 0 0 0 1px #0a84ff, 0 0 0 4px #0a84ff4d;
}
input[type="checkbox"]:checked {
  background-color: #0060df; /* 青 */
  border-color: #0060df;
}

/* 中の● */
input[type="checkbox"]::before {
  background-color: currentColor; /* ●の色=グレー */
  border-radius: 6px;             /* heightの半分 */
  content: "";                    /* おまじない */
  display: inline-block;          /* おまじない */
  height: 12px;                   /* 楕円部のheightより2px小さいくらい */
  margin-left: 1px;               /* 楕円部と●のすき間 */
  margin-top: 1px;                /* 楕円部と●のすき間 */
  transition: margin-left .2s cubic-bezier(.07, .95, 0, 1); /* ヌルっと具合は調整 */
  width: 12px;                    /* heightに合わせる */
}
input[type="checkbox"]:checked::before {
  background-color: #ffffff; /* 白（楕円部の色と調整） */
  margin-left: 17px;         /* ●を右へ移動 */
}
```

サイズはpx単位で合わせていますが、状況に応じてem単位にしてもいいと思います。
ただしユーザーエージェントに依りますが`<input>`では1emが周りより小さくなるので、別途`font-size`を指定する必要があります。（もしくは`rem`を使う）

最後の`margin-left`は
楕円の`width`32px − 左右`border`2px − 始めの`margin-left`1px − ●の`width`12px = 17px
にしています。`box-sizing`や各サイズを変更した場合は調整します。

コピペされる方は色その他装飾は適宜変更してください。（変数にして`:root`で定義するなど）

## おまけ

要らないとは思いますが、万が一スイッチの中にテキストを入れる場合は`::after`に書きます。

```html
<label><input type=checkbox class=text data-text-off=OFF data-text-on=ON>On/Off Text</label>
```
```css
input[type="checkbox"].text {
  position: relative;
}
input[type="checkbox"].text::after {
  content: attr(data-text-off); /* カスタム属性を使わず直接"OFF"でもOK */
  font-size: 8px;               /* 調整 */
  position: absolute;
  right: 2px;
  top: 2px;
}
input[type="checkbox"].text:checked::after {
  color: #ffffff;
  content: attr(data-text-on); /* カスタム属性を使わず直接"ON"でもOK */
  left: 2px;
  right: auto;
}
```

# まとめ
シンプルイズベスト
Unity概要(入門者向け)

# Unity概要(入門者向け)

## 目次
- Unityとは
- ゲームエンジンとは
- 特徴
  - マルチプラットフォーム対応
  - Asset Store
  - ノンプログラミングによる開発
- おすすめ学習コンテンツ

## Unityとは
Unityはユニティ・テクノロジーズが提供しているゲームエンジンです。
ゲーム開発の際に使われるライブラリや素材などのさまざまな機能を一元的にまとめて提供しています。

## ゲームエンジンとは

ゲームを開発する際によく使用する機能を一つにまとめて使いやすくしたもの(IDE)で、
(3D描画処理、物理演算、衝突判定、サウンド入出力など)といった高レベルな実装スキルが求められる主要な処理があらかじめ組み込まれています。

またUnityが他のゲームエンジンと異なるのは、オブジェクトの配置や照明の設定、必要な機能の追加といった
基本的なことをUnityエディタで視覚的に行えるように設計されていることです。

つまり、Unityエディタからパラメータを変更するだけで、簡単にゲーム内のオブジェクトの動きや見え方を変更することができます。

これにより、複雑なプログラムを書くことなく、比較的簡単にゲームを作れるようになります。

## 特徴

### マルチプラットフォーム対応

- Windows、Mac、Linuxなどのデスクトップ
- iOS、Android
- PlayStation 3/4/、Xbox 360、Wii U

などのコンソールゲーム、そしてプラグイン（Unity Web Player）がインストールしてあるWEBブラウザーなど幅広く対応しています。

そのため、Unityを利用して開発したゲームはあらゆるプラットフォームでプレイすることが可能です。
開発者や初心者はプラットフォームごとの差異を極力意識することなく開発を進めることが可能です。

### Asset Store
Unityではゲームで使う素材のことをアセットと呼んでおり、開発者は各種アセットが販売されているアセットストアが利用できます。

キャラクターモデルやテクスチャ、オーディオ、スクリプト、エディタの拡張機能などが簡単に入手できるので、効率的にゲーム開発を行うことができます。

有料販売だけでなく、無料配布されているものも多数存在します。

また、自分のアセットを販売することも可能です。

[Unityのアセットストアに関するクイックガイド（公式）](https://unity3d.com/jp/quick-guide-to-unity-asset-store)

### ノンプログラミングによる開発
Asset Storeを使用することで簡単なゲームであればプログラムを記述しなくても開発ができます。
ただし、細部にこだわる場合には、C#、JavaScriptなどを使ってのプログラミングが必要になります。

## おすすめ学習コンテンツ

### 学習サイト
- [UnityLearn](https://learn.unity.com/)
- Udemy
  - [ユニティちゃんが教える！初心者向けUnity講座](https://www.udemy.com/course/unity-chan-tutorial-01/)
- おもちゃラボ
  - [【Unity入門】60分で作るシューティングゲーム](https://nn-hokuson.hatenablog.com/entry/2016/07/04/213231)

### 書籍
- [Unityの教科書 Unity 2020完全対応版　2D＆3Dスマートフォンゲーム入門講座](https://www.amazon.co.jp/dp/B089PWG14S?tag=iritakas0c1-22&linkCode=ogi&th=1&psc=1)
※2021年06月15日（火）に2021年verが発売されます。

- [UnityではじめるC# 基礎編 改訂版](https://www.amazon.co.jp/dp/4295200794/ref=as_sl_pc_qf_sp_asin_til?tag=kiramex-22&linkCode=w00&linkId=5bca2d034447e130c4e533e0c594e06e&creativeASIN=4295200794)
Simulaterの中に指定したファイルが存在するか確認してある場合ない場合条件分岐させる方法


            do {

                let fileManager = FileManager.default
                let filePath = "ファイルを置いたパス"
                let fileURL = filePath.appendingPathComponent("sample.pdf")

                //ファイルがある場合
                if fileManager.fileExists(atPath: fileURL.path){

                ファイルがある場合の処理

                }else{

                ファイルがない場合の処理

                }
                                
            } catch let error as NSError {
                print("error",error)
            }
　
例えばファイルパスが

/Users/****/Library/Developer/CoreSimulator/Devices/0000/1111/2222/3333/4444/5555/sample.pdf

みたいに長くても全然オッケーです。
　
ダメな例↓

                if fileManager.fileExists(atPath: fileURL)　← .pathなし

　
上記で条件分岐しても何故か返ってくる値がおかしいってなってかなり詰まってたんですが、pathをつけることで解決しました。

同じ問題を抱えて悩んでいる方の参考になれば幸いです。
　

参考記事: [swift] ファイルの存在確認方法
https://www.fixes.pub/program/17881.html
GetElement example with findall and search in python3

## source

```python
import re

def getElement(src, name, attribute=""):
    e = ""
    print("==findall==")
    ret = re.findall('<'+name+"(>| [^>]+>)([^<]+)<", src, re.S)
    print(ret)
    if ret[0:1]:
        ret = ret[0:1]
        print(ret)
        for i in range(len(ret)):
            print(ret[i])
            print(ret[i][1])
    print("==search==")
    ret = re.search('<'+name+"(>| [^>]+>)([^<]+)<", src, re.S)
    if ret:
        print(ret.group(2))
    else:
        print("could not search")
    #print(ret.groups(),ret.group(1),ret.group(2))

str = """
<span>333</span><a href="/entry" title="タイトル" class=entry-page" label="entry-info"><span>615</span>favs</a>
"""

getElement(str, "span")
```

## result

```
==findall==
[('>', '333'), ('>', '615')]
[('>', '333')]
('>', '333')
333
==search==
333
```

## memo

* findallはタプルのリストがかえる。
* groupを使う場合、if ... is not None を使って判定する。

### links

* https://qiita.com/ymko/items/327de0a224dde2ee62e5
* https://www.javadrive.jp/python/list/index3.html
[Rust]代数学でアプローチ(ARC119-C)

https://atcoder.jp/contests/arc119/tasks/arc119_c

https://atcoder.jp/contests/arc119/submissions/22674628

代数学で考えること自体がヒューリスティックと言われればそれまでですが、その後はかなり素直にいけたので紹介させていただきます。

#解法の着想

代数学で考えることになったのは、たぶん問題文に $x+1$ が２回も出てきたせい。

隣り合ったビルの高さを１増やしたり減らしたりするのが、式に $x+1$ を足したり引いたりするのにしか見えなくなった。

１つ目と２つ目のビルは $1+x$ だ。

ならば、２つ目と３つ目のビルは…… $ x+x^2 $。

一般的には、$ x^k+x^{k+1} $。

_N_棟のビル群を表すには…… $f(x)≡\sum_{i=1}^NA_ix^{i-1}=A_1+A_2x+A_3x^2+……+A_Nx^{N-1}$。

これに色々な $x^k+x^{k+1}$ を足したり引いたりして、

決まった区間 $A_lx^{l-1}+……+A_rx^{r-1}$の項を消去できればよい。解けそう！！

---
決まった区間 $f_{l,r}(x)≡A_lx^{l-1}+……+A_rx^{r-1}$ を消去できるとは、

$f_{l,r}(x) = c_l(x^{l-1}+x^l)+c_{l+1}(x^l+x^{l+1})+……+c_{r-1}(x^{r-1}+x^r) …(1)$
の形で表せればよい。$c_i$は整数。

右辺は $1+x$ で括ることができて、

$f_{l,r}(x) = (1+x)(c_lx^{l-1}+c_{l+1}x^l+……+c_{r-1}x^{r-l}) …(2)$

ここで $x=-1$ を代入すると、

$f_{l,r}(-1)=\sum_{i=l}^rA_i(-1)^{i-1} = 0$ これが必要条件。

逆に$f_{l,r}(-1) = 0$であれば多項式f(x)は必ず1+xで因数分解できるので式(2)の形になり、それを展開すると式(1)の形で表すことができる。

つまり、題意は$\\{ [l, r]: \sum_{i=l}^rA_i(-1)^{i-1} = 0 \\}$ を満たすl, rの組み合わせが何通りあるかという問題と同値であることが示された。

---
ここからあとは[editorial](https://atcoder.jp/contests/arc119/editorial/1850)の方針と同じ。

```rust:AC
use std::collections::HashMap;

fn main() {
	proconio::input! { n: usize, a: [i64; n], };
//	let mut cuma = vec![];
	let mut cuma = vec![0];
	for (i, &x) in a.iter().enumerate() {
		let s = if i&1==0 {1} else {-1};
		cuma.push(cuma.last().unwrap() + x * s);
	}

	let mut cumcnt = HashMap::new();
	for x in cuma {
		match cumcnt.get_mut(&x) {
//			None => { cumcnt.insert(x, 1); }
			None => { cumcnt.insert(x, 1u64); }
			Some(rcnt) => { *rcnt += 1; },
		}
	}

	let mut ans = 0;
	for (_x, cnt) in cumcnt {
		ans += cnt * (cnt - 1) / 2;
	}

	println!("{}", ans);
}
```

実際には色々な勘違いもあり、時間内にACは取れなかった。実戦終了後に修正して提出したが、それもコメントアウトで示したようなミスがあり、いずれにしてもACは無理だったと思う。
リリースビルドのみオーバーフローチェックなしの罠にまた嵌った。
実戦の後半時間は脳が既にオーバーヒーしていて熟考は無理だし、リラックスすると脳も休憩に入って何も浮かばなくなるし、一から考えようとすると脳内がカオスになるし。

---
繰り返しになりますが、なるべくヒューリスティックでない解法として紹介させていただきました。
今後ともよろしくお願いします。
tigについて

以前、自社向けにtigについてのナレッジ共有を行ったことがあったので、こちらにも書いておこうと思います。
コマンドを駆使しなくても簡単にGitの操作を行うことができるので個人的にすごく使いやすいなと思ってます。


# tigの導入方法
Macの場合、homebrewが入っていれば下記コマンドでインストールできます。
今回homebrewの導入については割愛します。
`$brew install tig`

WindowsではGit for Windows 2.14.2以降のバージョンであれば、勝手に使える様です。

# 基本操作
###j,k
↑↓キーと同じでカーソル移動をするときに使用します。

サブビューを開いているときに↑↓キーを使用するとメインのビューのカーソルが動いてしまうので、サブビューのカーソルを動かす時はj,kを使用します。
jでカーソルを一行下へ移動、kでカーソルを一行上へ移動です。

###Enter
サブビュー表示

###Ctrl+D
カーソルを複数行分下へ移動

###Ctrl+U
カーソルを複数行分上へ移動

###q
開いているビューを閉じる

###Q
tigを閉じる

###h
キーバインドの設定を開くことができます。
ここで好きな様にカスタマイズすることができます。

# コミット
実際にtigを使用してコミットしてみます。

① リポジトリへ移動して、コマンドライン上にて、`$tig`を入力
そうすると下記の様にコミット履歴の見れる画面へ遷移するかと思います。
過去のコミットの修正を見たい時は、見たいコミットにカーソルを合わせて「Enter」をすれば変更を確認することができます。
![スクリーンショット 2021-05-14 0.31.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948599/8c057c68-1810-67c7-b4a2-cbea5a55eec5.png)

② ①で開いたビューで「s」を入力すると下記画面へ遷移。作成・変更・削除されたファイルが表示されます。ここでaddしたい変更を選んでいきます。
![スクリーンショット 2021-05-17 0.35.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948599/32851a5e-dce0-cfc9-7927-6676da5366e7.png)


③ addしたいファイルにカーソルを合わせて「u」を入力。変更箇所を確認したいときはカーソルを合わせて「Enter」を押下(addしたファイルにカーソルを合わせて再度「u」を入力するとaddをやめることができます)
![スクリーンショット 2021-05-17 0.38.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948599/2d0d6cb5-91df-ec8e-7f45-d03361a8eed9.png)

一行だけaddしたい場合は、「j」と「k」を使用してサブビューのカーソルを操作してコミットしたい行に合わせて「1」を入力すると一行だけできます。

さらに
![スクリーンショット 2021-05-17 0.49.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948599/1e7a0d0a-4999-812d-774b-1c9237fe510a.png)
上図の様な文字に囲われている範囲(おそらく関数ごとに出てる)のみをコミットしたい場合は、その範囲内にカーソルを移動して「u」を入力するとその区間だけをaddできます。

④ addした画面にて「shift」+「c」を入力するとコメントを入力するビューが表示されます。「i」を入力して挿入モードへ切り替えてコメントを入力します。
![スクリーンショット 2021-05-17 0.56.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948599/f1ce9e8b-389f-7349-7cb4-fb7c9a47fb03.png)



⑤ 入力が終わったら「esc」を押下し、「:wq」を入力して閉じます。

⑥ 元のコマンドライン画面に戻って下の図の様に出るので「Enter」を押下すればコミットが完了です。
![スクリーンショット 2021-05-17 0.58.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948599/6f5f3b22-69d9-d27c-db9e-9a341fe800a4.png)


# TODO
キーバインド設定を自分好みにカスタマイズできるみたいなのでやってみようと思っています。
[tigの公式](http://jonas.nitro.dk/tig/tigrc.5.html)
その際はまた別で記事を起こそうと思います。
GitHubのリポジトリ名に大文字があると、GitHub Pagesによる静的ページのビルドに失敗する


2021年5月に確認しました。
2020年7月ごろはビルド成功していました。

# 発覚の経緯
2021年5月にリポジトリを更新したところ、
GitHub Pagesのビルドに失敗しました。
その前の更新は2020年7月で、そのときはビルド成功していました。
リポジトリを作成したのは2016年でした。そのときにリポジトリ名に大文字を使い、以降そのままにしていました。

- 気づくのに時間がかかりました。
 - ビルド失敗の原因が表示されなかったため
 - 公式ドキュメントや規約で、大文字NG、というものが見つからなかったため
 - リポジトリ名の入力欄で大文字がエラーとならないため
 - 検索しても事例が見つからなかったため

# 対策
GitHubのリポジトリ名を小文字にします。
GitHub Pagesのビルド失敗自体はこれで解決しました。

なお、リポジトリやpagesのURLをよそから参照している場合、
追々はそれらも修正していくことになります。

# 関連
[GitHub Pagesで「404エラー」時に確認すべき7つのこと](https://qiita.com/yuuta_s/items/6b05c2173a48e13a1373)
[【GitHub Pages】404 Not Foundになってしまう場合](https://qiita.com/tanaShoe/items/d3b4e0d17e79a9b42187)
Git Hub　リポジトリとのやりとりコマンド

#Git Hubとのやりとりをする際に使うコマンド

####記載コマンドの種類一覧
`remote` リモートの中身を確認する。
`remote add` 複数のリモートを持ちたい時。
`featch` リモートからローカルのリポジトリに情報を落としてくるだけのコマンド。
`merge` 情報を統合する時に使うコマンド。
`pull` fetchとmergeを同時に行うコマンド。
`show` リモートの詳細を表示してくれる。
`rename` リモート名の変更行う。
`rm` リモートの削除を行う。
- - -

##リモートの中身を確認する時

```ruby:remote
git remote
#remoteの名称が表示される

git remote -v
#対応するURLを表示
```

##リポジトリを複数持つ時に使うコマンド

```ruby:remote_add
git remote add <リモート名> <リモートURL>

例：↓↓↓
git remote add tutorial https://github.com/user/repo.git
# tutorialというショートカットでURLのリモートリポジトリを登録できる
```
手順としては自分のgithubホームページに行って、
新しいリポジトリを作成
使い方としては、バックアップ用や別のリポジトリで開発したい時など
リモートリポジトリとして運用することが多い

##リモートから情報を取得する方法

**大きく分けて二つの方法があるが、**
使い分けすることが大切で、
ここも間違えると大変なことになることもあるので注意して使う

###fetchを使って取得する

```ruby:fetch
git fetch <リモート名>
git fetch origin
```
このコマンドで行われていることで注意しなきゃいけない点は、
"リモートリポジトリ"から"ローカルリポジトリ"に情報が落ちてきているだけで
ワークツリーには何も影響が起きていないという点です
実際は、ローカルリポジトリの中の
**remotes/リモート名/ブランチ名に保存されている**

##ローカルリポジトリの情報をワークツリーに反映させたい時 ~> その1

```ruby:merge
git merge <リポジトリ名>／<ブランチ名>
git merge origin/master
#こうすることでoriginリポジトリのmasterブランチの情報をマージすることができる
```
中身を一応確認したい時は、`ls`コマンドなどや`cat`コマンドを使って確認したりすればOK

###ローカルリポジトリの情報をワークツリーに反映させたい時 ~> その2

```ruby:pull
git pull <リモート名> <ブランチ名>
git pull origin/master
#上記コマンドは省略可能で
git pull #でもOKで

#`pull`コマンドは下記のコマンドを一発で行っていることに注意
git fetch origin master
git merge origin/master
```

**基本的にはフェッチを使うのがベター**
なぜかというと、`pull`コマンドの挙動が特殊だからです
仮に現在ブランチがmasterブランチとhogeブランチの二つあったと仮定して話しを進めます。

現在、masterブランチにいるとして`git pull origin hoge`というコマンドを打ったとします
そこは、うまいことパソコンがhogeブランチに情報を統合してくれるかと思いきや、
なんと、ローカルリポジトリのmasterブランチに、リモートリポジトリのhogeブランチの情報を統合するという
挙動になってしまうからです。
ちょっと間違えてしまうと**意図しない統合**が行われしまい
大変なことになってしまう可能性もあります。

##リモートの詳細情報を表示したい時

```ruby:show
git remote show <リモート名>
git remote show origin
```
表示される情報としては、
1. fetchとpushのURL
2. リモートブランチ
3. git pullの挙動
4. git pushの挙動などがある

##リモートを変更や削除する時

```ruby:rename
git remote rename <旧リモート名> <新リモート名>
```
リモート名を変更する際に使うコマンド

```ruby:rm
git remote rm <>リモート名>
```
リモートを削除する時に使うコマンド
Gentoo Linux と Arch Linux でWRFをビルド

Gentoo Linux や Arch Linux で、WRFをビルドしようとすると、２つ問題が発生します

【現象】

１≫ ./configure が失敗します

./configure の中で
　`type ifort 2>/dev/null | awk '{print $NF}' | sed -e 's/(//g;s/)//g'`
からコンパイラのフルパスを取得するところがあるのですが
　`type ifort 2>/dev/null`
のところは、localeが日本語だと
　`ifort は /opt/intel/oneapi/compiler/2021.2.0/linux/bin/intel64/ifort です`
となります。続く処理で、最後のフレーズから()などを取り除いて取得するので
　`です`
となります。なお、localeが英語の場合
　`type ifort 2>/dev/null`
のところは
　`ifort is /opt/intel/oneapi/compiler/2021.2.0/linux/bin/intel64/ifort`
となるため、正常に動きます

２≫ ./compile em_real >& compile.log が失敗します

ログを見ると、time コマンドがときどき失敗しています
おそらく、mpif90のプロセス終了時に、出力ファイルの
書き出しが完了していないことがあるためと思われます
なぜ time が失敗するとビルドが失敗するのかはわかりませんが


【対策】

Ａ≫ 個別対応
　１≫ localeを英語にする
　２≫ WRFのコンパイル設定、configure.wrfで
　　　`FC  = time $(DM_FC)`
　　のところを
　　　`FC  = $(DM_FC)`
　　と修正する。time はコンパイル時間をログ出力するためのもので
　　無くても問題ありません

Ｂ≫ スクリプトシェルを dash に交換
　　gentoo でも archlinux でも、dash パッケージがあるので追加インストールし
　　　`rm /bin/sh`
　　　`ln -s /bin/dash /bin/sh`　　　　(gentoo)
　　　`ln -s /usr/bin/dash /bin/sh`　　(archlinux)
　　2021年5月現在、dash では、localeが日本語でも、typeの戻り値が英語で
　　なぜか２≫の問題も発生しません
　　Ubuntuでは、ver.6から、ログインシェルはbashのまま、スクリプトシェルはdashです


【確認したバージョン】
　　gentoo　　　5.10.27
　　arch linux　　5.12.3
　　WRF　　　　 4.3
webサイトをnginx上に乗せて、http接続

<h1>webサイト作り+nginxの学習</h1>

<ul>
 <li>ネスぺの学習を終えて</li>
 <li>HTMLとCSS,JavaScript,Reactを学ぶ</li>
 <li>nginxとサーバーを学ぶ</li>
</ul>

<h2>1.ネスぺの学習を終えて</h2>
入社から1年の集大成として、4月18日にネットワークスペシャリスト試験を受験した。
試験内容は午前に応用情報とネスぺの基礎問題、午後にネスぺの文章問題となっていて、
実際の試験では、例年と異なりOSPFやBGP4などのルーティングやスイッチングに焦点を当てた問題が主題された。
過去問は解けていたので自信はあったが、心のどこかで「インフラ未経験で受かるわけがない、ぼこぼこにされる」と思いながら試験に臨んだ。
しかし、思いのほか解くことが出来、「ギリギリ受かる可能性もある」と思える結果だった。
合否の結果はまだ分からないが挑戦してよかったと思う。


<h2>2.HTMLとCSS,JavaScript,Node.jsを学ぶ</h2>
ProgateでHTML&CSS,JavaScript,SQL,Node.jsを学んだ。
HTMLに関しては依然やったこともあり、JavaScriptもpythonを使ったことがあったので
スラスラ理解できた。
フロントエンドの言語を学んだ理由はネスぺで得たネットワークの知識を使って、
AWS上にシステムを作りサービスを出してみたいと思ったからで、まずはWEBサイト作りからだと思ったから。

progateで学んだあとは、Atomを使ってHTMLとCSSでwebサイトを作ってみた。
Chromeのブラウザで欲しい画を確認できたので、すごく助かった。
JavaScriptかPythonを使って、動的なWEBサイトが出来たらこれまでの学習書籍を紹介するサイトを
公開したい。下記はnginx上に静的なサイトをのっけてHTTP接続したもの(ドメインは取ってない)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1189399/5ef20bfe-7c1b-ac83-6bc5-06c7b2b2c3a6.png)

<h2>3.nginxとサーバーを学ぶ</h2>
上記のwebサイトにHTTP接続するため、
・Amazon Linuxにnginxをインストールし、起動
・htmlファイル、cssファイルをEC2にアップロード
・nginx.confのルートをアップロードしたhtmlファイルに変更
以上を実行した。

HTTPS接続したかったが、証明書を発行しようとするとACMを利用する必要があり、
料金が発生してしまう。
なので、localでJavaScriptを使った動的なサイトに変えてからアップロードしたい。

ついにエンジニアっぽいことをし始めた感がある。
PHP 文字列の中から複数の指定した文字の削除方法

phpにて、文字列の中から複数の特定の文字を削除したいときの方法をサイト等で探していたところ解決のための考え方として新たな知見であったので記録しておきます。
ここでは例として文字列(abcdefghij)から削除したい文字(c,f,g,i,)を、一旦配列($b)として受け取り
str_replaceを使って$bの文字を削除した$aを出力しています。

``` php
$a = 'abcdefghij';
$b = array('c', 'f', 'g', 'i');
echo str_replace($b, '', $a);
//出力結果 → abdehj
```

プログラミングを勉強してまだ数か月程度ですが、新たな知見や学習記録などをこれからも投稿していけたらなと思います。
オリジナルアプリ開発#4【topページの表示】

現在、転職先の企業へのアピールポイントになるポートフォリオ作成（オリジナルアプリ開発）をしています。
私は、タスク管理ツールの完成を目指しています。

今回は、仮topページの表示を行います。

##ルーティングの設定
仮トップページを「http://localhost:3000 」にアクセスしたら表示できるようにルーティングの設定をします。
rootメソッドを使用することで、Railsがルート/とすべき場所を指定できます。

```ruby:config/routes.rb
root 'top#index'
```

###追加したルーティングを確認する
「rails routes」コマンドを実行することで設定しているルーティングを全て表示できます。

```:ターミナル
rails routes
```

![オリジナルアプリ【仮topルーティング】.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210417/b0d6227f-bb09-a04a-4aae-0df495660592.png)

下記が今回設定したルーティングの情報。

```
root GET / top#index
```

##コントローラーの作成
トップページで使うコントローラーを作成します。
コントローラーの名称は先程設定したルーティングでtopと指定したので、topコントローラーを作成していきます。

```:ターミナル
rails g controller [コントローラー名]
```
```:ターミナル
rails g controller top
```
上記のコマンドを実行すると、ターミナルに下記のような実行結果が表示されます。

```:ターミナル
Running via Spring preloader in process 55767
      create  app/controllers/top_controller.rb
      invoke  erb
      create    app/views/top
      invoke  test_unit
      create    test/controllers/top_controller_test.rb
      invoke  helper
      create    app/helpers/top_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/top.scss
```

##作成したコントローラーにアクションを作成
次に作成したコントローラーにアクションを追加していきます。
ルーティングが実際に処理するのはコントローラーに作成されたアクションです。

```ruby:app/controlllers/top_controller.rb
class TopController < ApplicationController

  # 追加
  def index
  end
  # 追加

end
```

今回は仮トップページを表示させるだけで、データベースからデータを取ってくるわけではないので
indexアクションの中には何も書きません。

##トップページのビューを作成
app/views/top/ディレクトリ内にindex.html.erbを追加します。

```ruby:app/controlllers/top_controller.rb
<p>仮トップページです。</p>
```

「http://localhost:3000/ 」にアクセスします。
下記の画像のように表示されたのでうまく動作しています。

ターミナルでローカルサーバーを立ち上げていない場合は、
「rails s」コマンドで立ち上げてから「http://localhost:3000/ 」にアクセスします。

![オリジナルアプリ【仮top表示】.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210417/a8dca099-8021-cc38-5495-6a81ccec305e.png)

今回は、以上になります。
Blue Prism で Google Chrome を URL 指定でページ遷移させる

IE を操作していた時には、IE のルート要素のアクションに「移動」があって、URLをパラメーターで渡して遷移ができました。

Google Chrome では、そのようなアクションは無くなってしまいました。
![no_move_action.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/b3c7ad57-220f-ed37-04a8-cb3aad18ecc6.jpeg)

Google Chrome のオブジェクトにも、代わりの方法が用意されています！ その手順をご紹介します。

遷移元ページの BODY 要素をスパイする
-------------------------------

遷移する前のページの、BODY 要素をスパイします。iframe が含まれているページだと複数マッチしたりするので注意してください。

以下は、Google Search ページの例です。
![google_body.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/8551c806-f5dc-3053-155f-4623bec714c8.jpeg)

操作ステージで、BODY 要素のアクション「アドレスを設定」を指定する
---------------------------------------------------

先ほどのステップでスパイした BODY 要素には、「アドレスを設定」というアクションがあります。
このアクションが IE における「移動」アクションに代わるものです。

パラメーターにアドレスが指定できます。

![specify_address.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/9807c8bd-73ed-e881-027e-0dbafd95bdea.jpeg)

まとめ
--------------
上記手順で、Google Chrome でも URL を指定したページ遷移ができます。
以下はアクションの例です。

![action_sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564576/2b5cd86a-7bf2-869d-f487-4af7c3c379fc.jpeg)
No URL to redirect to. Either provide a url or define a get_absolute_url method on the Model 対処法

Djangoでsuccess_urlを設定しようとしたのですが、なかなかに錯綜してしまったのでメモ。
やるべきことはかなりシンプルなのに中々答えに辿り着けず時間がかかってしまいました。

<h2>エラー内容</h2>
DjangoでCreateReviewを使ったデータ登録後に遷移させたいページを設定してる際、やたら以下エラーが出てしまい困りました。

（エラー文）
*No URL to redirect to. Either provide a url or define a get_absolute_url method on the Model*

結果的にはただ、success_urlの書き方という話になってしまいますが、メモ。
<h2>対処法（success_urlの書き方）</h2>

####処理成功後に静的なページへ遷移したい場合
```
from django.urls import reverse_lazy

success_url = reverse_lazy("app名:urls.pyで設定したname")
```

####処理成功後urlから取得した変数を使用して動的ページへ遷移したい場合
```
from django.urls import reverse_lazy

class StoreReview(CreateView):
    template_name = "app名/example.html"
    model = Model
    fields = (
        "field",
    )
def get_success_url(self):
    return reverse_lazy(
        "app名:urls.pyで設定したname", kwargs={"pk": self.kwargs["pk"]}
        )
```

ぐぐってたらmodels.pyをいじるとか結構色々出てきたのですが
これだけ抑えておけばエラーは解消され、無事テーブルにデータ登録後の画面遷移ができました。嬉
【リンク集】量子コンピュータ関連　無料教材・チュートリアル・書籍

#1. はじめに
自身の勉強のために、量子コンピュータや量子アルゴリズムの勉強ネタとなる無料教材・チュートリアル・ブログのリンクを記載。

#2. 無料教材・チュートリアル
### 2-1. 量子コンピューティング・ワークブック
作者：東京大学素粒子物理国際研究センター（ICEPP）
リンク先：[https://utokyo-icepp.github.io/qc-workbook/welcome.html](https://utokyo-icepp.github.io/qc-workbook/welcome.html)

![スクリーンショット 2021-05-16 23.07.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509872/b328d8de-c7a3-d936-49b4-7fc11155fdfc.png)

### 2-2. 光・量子飛躍フラッグシッププログラム（Q-LEAP）
作者：国立研究開発法人科学技術振興機構
リンク先：[https://www.jst.go.jp/stpp/q-leap/](https://www.jst.go.jp/stpp/q-leap/)
![スクリーンショット 2021-05-16 23.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509872/be245e46-2ffb-0f79-0992-43105e3a19b0.png)

### 2-3.量子技術教育プログラム：オンラインコース・サマースクール
作者：QEd
リンク先：[https://www.sqei.c.u-tokyo.ac.jp/qed/index.php](https://www.sqei.c.u-tokyo.ac.jp/qed/index.php)
![スクリーンショット 2021-05-16 23.01.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509872/a3e7d943-bb7e-f627-1ab1-b1e94c42e871.png)

### 2-4. 量子コンピュータでLHC高エネルギー実験データ探索
作者：Jij inc.
リンク先：[https://tech.j-ij.com/entry/2020/10/19/235621](https://tech.j-ij.com/entry/2020/10/19/235621)

![スクリーンショット 2021-05-16 23.11.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509872/4d4c8cb1-70b6-53c1-fb2e-9830b438a2bd.png)

### 2-5. NICT NEWS 2021 No.2 通巻486 量子技術特集
作者：国立研究開発法人　情報通信研究機構
Webページ:[https://www.nict.go.jp/data/nict-news/](https://www.nict.go.jp/data/nict-news/)
PDFページ:[https://www.nict.go.jp/data/nict-news/NICT_NEWS_2021-486_J.pdf](https://www.nict.go.jp/data/nict-news/NICT_NEWS_2021-486_J.pdf)

![スクリーンショット 2021-05-16 23.24.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509872/3ba41938-e755-c1dd-ce35-3af0e3c2f26a.png)

### 2-6. Qiita「【2020年永久保存版】量子コンピュータ未経験から独学で量子プログラマーになる５つの方法」
作者：@YuichiroMinato
リンク先：[https://qiita.com/YuichiroMinato/items/50e7b606023c9e94e812](https://qiita.com/YuichiroMinato/items/50e7b606023c9e94e812)

#3. 書籍
### 3-1. 量子コンピュータによる機械学習
作者:Maria Schuld (著), Francesco Petruccione (著), 大関 真之  (翻訳), 荒井 俊太 (翻訳), 篠島 匠人 (翻訳), & その他
リンク先：[Amazon](https://www.amazon.co.jp/%E9%87%8F%E5%AD%90%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AB%E3%82%88%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-Maria-Schuld/dp/4320124626)
![スクリーンショット 2021-05-16 23.41.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509872/ffda3486-4030-12af-98af-1467ea813ab9.png)

### 3-2. 量子情報科学入門
作者:石坂 智 (著), 小川 朋宏 (著), 河内 亮周 (著), 木村 元 (著), 林 正人 (著)
[Amazon](https://www.amazon.co.jp/%E9%87%8F%E5%AD%90%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%85%A5%E9%96%80-%E7%9F%B3%E5%9D%82-%E6%99%BA/dp/4320122992/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E9%87%8F%E5%AD%90%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%85%A5%E9%96%80&qid=1621176169&s=books&sr=1-1)
![スクリーンショット 2021-05-16 23.44.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509872/ca2caac4-1a30-f400-263b-3c764db4cc17.png)


#4. まとめ
今後も更新予定。

---
改訂履歴
Rev.0 2021/05/16 新規作成
python + gnuplot でマンデルブロ集合（その１）

Gnuplotでマンデルブロ集合をなんだか書きたくなったのでPythonを利用して書いてみた。まだまだアラが目立つのでブラッシュアップは必要。決定的なのはGnuplotのset pm3dを使っても等高線がグラデーションで表現されないという弱点あり。

```python:mandelbrot_ver1.py
#!/usr/bin/env python
import numpy as np

def columns_save(data, filename='tmp.dat'):
    '''
    PyGnuplotのs関数は等高線を表示させるには力不足なので、別途空白行を出力できるsave関数を作成してデータ出力する。
    s関数のように data = [xs,ys] ではなく data= [[x1,y1],[x2,y2] ...]というようなデータ構造に変更。
    '''
    file = open(filename, 'w')
    columns = len(data)
    rows = len(data[0])
    for i in range(columns):
        if data[i] == []:
            file.write('\n')
            continue
        for j in range(rows):
            file.write(str(data[i][j]))
            file.write(' ')
        file.write('\n')
        if i % 1000 == 0 :
            file.flush()  # write once after every 1000 entries
    file.close()  # write the rest

import PyGnuplot as gp
gp.colss = columns_save

class Mandelbrot:
    #マンデルブロ集合を生成するクラス。
    scale = 2.0
    increments = 0.01
    def __init__(self):
        self._xbase = np.arange(-self.scale,self.scale,self.increments)
        self._ybase = np.arange(-self.scale,self.scale,self.increments)
        self._cbases = []
        self.mandelbrot_set = []

    def __gen_cbases(self):
        #マンデルブロ集合の土台となる複素領域を生成する関数。
        for x in self._xbase:
            self._cbases.append([])
            for y in self._ybase:
               self._cbases[-1].append(complex(x,y)) 
        return
        
    def mandelbrot(self,c):
        #マンデルブロ集合の力学系の計算をする関数。返り値は反復回数。反復回数の数に応じた等高線がマンデルブロ集合のあの絵になる。
        z = 0j
        for n in range(1,2000):
            z = z**2 + c
            if np.abs(z) > 2.0: return np.log(n)
        return 0
    
    def gen_mandelbrot(self):
        #マンデルブロ集合を生成する関数。
        self.__gen_cbases()
        for cs in self._cbases:
            for c in cs:
                self.mandelbrot_set.append([c.real, c.imag, self.mandelbrot(c)])
            self.mandelbrot_set.append([])
        return

if __name__ == "__main__":
    m = Mandelbrot()
    m.gen_mandelbrot()
    gp.colss(m.mandelbrot_set)
    gp.c("""
        #gnuplotの設定読み込み。
        set size square;
        set nosurface;
        set contour base;
        set view map;
        """)
    gp.c('splot "tmp.dat" using 1:2:3 with lines')
```
マンデルブロ集合をそのままクラスと見立てているので長くなっている。
##生成される画像
![mandelbrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62130/141d3b21-fc74-0011-76d5-d357ba8ecfce.png)
##今後の課題
* マンデルブロ集合となっているが解像度が悪い。
* ズームすると再起的に同じ図形が出てくると言うところをどう表現すればいいのかわからない。
* なんかコードが冗長
* 等高線が汚いのはcbbaseがメッシュ状になっていないからか？

上記課題をなんとかしていきたい。
ふりかえりをより良くするために考える

今までなんとなく、「ふりかえりはやったほうがいいよね」という前提で色んな現場を回ってきたが、改めてふりかえりってどうやるのが効果的なんだろう？と考えるべき機会にあったのでメモ的なものとして考えを書き出してみる。


# そもそもなぜふりかえりをやるべきか
これは、書籍「エクストリームプログラミング（第二版)」 の フィードバック の項の内容が当てはまりそう。ちょっと長いが引用。

>
最初に決まった方向性が、長期間そのまま有効であることはない。それは、ソフトウェア開発の詳細であっても、システムの要件であっても、システムのアーキテクチャであっても同じだ。経験する前に方向性を決めてしまうと、すぐにダメになってしまう。**変化は避けられないものであり、変化がフィードバックを必要にするのである**。
>
彼は「最初から正しくやる方が簡単ですよね？」と言った。もちろんそうだ。ただし、以下の３つの場合は例外である。

>
- 「正しく」やる方法がわからない場合。これまでになかった新しい問題を解決するときは、うまくいきそうな解決案が複数考えられたり、そもそも明確な解決策が存在しなかったりする。
>
- 今日は正しかったとしても、明日は間違っている可能性がある場合。コントロールや予測ができる範囲を超えた変化が発生すると、昨日の決定はあっさり無効になってしまう。
>
- 全てを「正しく」やろうとして、時間がかかりすぎる場合。解決策が完成する前に環境が変わると、その解決策は無効になってしまう
>
**一時的な完成に期待するよりも、常に改善を続けていこう**。


何もかもが決まっているウォーターフォールのような開発であれば、ふりかえりは必要ない。作ったものが仕様を満たしているかが全てだ。

逆に、システムの完成形が見えない状態で開発を続ける場合は、チームの現在位置が目指すべき方向とあっているか常に軌道修正し続ける必要がある。この時、今自分たちは何をしてきてどういう成果を得たのか？を確認するためにふりかえりを行う必要があると言える。


# ふりかえりでは何に注目すべきか
ここでもまずはエクストリームプログラミングの「ふりかえり」から引用する

>
優れたチームは単に仕事をしているだけではない。**どうやって**仕事をしているのか、**なぜ**仕事をしているのかを考えている。なぜ成功したのか、なぜ失敗したのかを分析している。自分たちのミスを隠そうとはしない。それを明らかにして、そこから学ぼうとするのである。偶然に優秀になれる人などいないのだ。

「どうやって」、「なぜ」 に注目することでどんな効果が得られるだろうか。自分としては以下があると思っている。

- 単純に結果の差分をみることよりも、継続的な改善につながる可能性が高くなる
- 理由を明らかにすることで、問題の本質に気づくことができる

例えば、あるシステムでのエラーハンドリングに間違いがあった場合、担当者がその箇所の修正をして終わりでなく、他に似たような実装がないかチェックし、事前に穴を埋めるべきではないか？といった議論をチームでできた方がいい。

また、ある機能のリリースが遅れてしまったという場合に、ふりかえりで理由を明らかにしていくと、そもそもスケジュールの組み方に問題があるのではないか？といった議論に発展させていける可能性がある。


が、特に工夫もせずKPTを実施すると下記のような状況に陥りがちだ。

- そもそも重要な課題が掘り出されず表面的な発言に終始する
- 議論がうまく発展せず、「つらい」という愚痴だけを言う場になってしまう

これをうまくやっていくための作戦として、 **理想と現実にどのようなギャップがあるかを考える** というのが有効ではないだろうか？ 例えば、

- 問題: タスクの進捗が遅れている
    - 理想1: そのタスクは本当にやるべきか
    - 理想2: タスクを進める人を増やす(ペアプロ) できた方が良さそう

KPTや1on1で課題出しをすると、問題だけが単に噴出する。それはそれで必要だが (何も出てこないのが一番良くない) 、課題を言った後で、「じゃあ理想はどうあるべき？」 「そこに近づくために何ができる？」 と考えるのが良さそう。

過去を「ふりかえり」、未来へ「むきなおる」 行為を同時に行うこと。
この「むきなおる」ためには、自分たちがどこに向かっていくべきか？をわかっていなければならない(完璧なものでなくとも).
この時に必要なのがチームとしてのマニフェストやリーンキャンバス、ミッションビジョンバリューやゴールデンサークルといったものなのかなと思うが、これがどういった観点を元に作られているか？も重要だ。
トップダウンで決められたものなのか、チームメンバーが話しあって決めたのか、それらは定期的に見直されているのか、どのような理論・思想・論文等を元に作られているのか....

この辺はまた改めてまとめたい。
競技プログラミング の 「競技」 についての考察集

# 競技プログラミングの「競技」のほう
こんにちは。競プロ歴2年目のナナメです。AtCoderのレートは水色です。

もともとパズルゲーム界隈から流れて競プロを始めました。
パズルゲームの界隈と比べたとき、競技プログラミングはプログラミングについての記事ばかりで、競技としてのコツがまとまっていないように感じました。

なので今回は自分が競プロの中で感じたコツの中でも時間をかけず低いコストでパフォーマンスを上げていけることを書いていこうと思います。
灰～水までは有効だと思います。よろしくおねがいします。

## 1.出題範囲を理解する

ABCの A 問題は、for 文を知らなくても解けるようになっているって知ってました？

A問題でforを使う問題は出ない。これを知っているだけでA問題でfor文を書いて悩むことは無くなります。
たまに、制約がキツければ500点問題だけど実は3重forループを書いても間に合うから300点問題　みたいなのが出るんですよ。
「これは式に変形してO(1)で解けるやつだ！」となって式変形を頑張ったけどなんかバグってしまって撃沈、ということを起こさないためにも、点数や制約を見て判断しましょう。
わざわざ自分で難易度を上げて解く必要はありません。

この出題範囲は、過去問を見てある程度は範囲を把握できるはずです。

>**有識者へ:点数毎の問題の範囲について昔chokudaiさんが言及してたはずなんですが、誰かわかる人いませんか！（分かり次第リンク貼ります）**

>**追記:（2022/12/23）A問題でもforを使う問題が出ましたね**

## 2.レーティングの付き方を理解する

ABの2問を2分で解いた人と、ABCの3問を90分かけて解いた人だと、後者のほうがパフォーマンスが高くなります。

始めたてでなかなかレートが上がらないと、めちゃくちゃマクロを用意したりして早解きでレートをあげよう、と思ってしまいがちですが、結局使いこなせないとWA祭りで爆死してしまいます。
この仕組を理解していれば、とにかく制限時間内に解き終わるだけの速さがあれば良い、とすこしは気が楽になるのでは無いでしょうか。
極端な難易度差でも無い限りペナルティがついてもそこまでレーティングは変わらりません。恐れず行きましょう。


## 3.ルール内でやって良いことを理解する
一般的に思い浮かぶ“テスト”とAtCoderのコンテストの違うところは、「検索が禁止されていない」ところが大きいと思います。

めちゃくちゃ賢い人が何千年もかけて作り上げた理論を０から思いつくわけなんてがないんだから。とにかく詰まったら検索。これが重要なんです。
だいたい特徴のあるものは名前がついていて、性質がまとめられています。

例えば、問題文中に111111…とあったら
「同じ数字　並ぶ　名前」で検索しましょう。
これが レピュニット数 だとわかったらあとはネット上に知見が大量にあるのでそれを読めば大丈夫です。

## 4.自分の足りない部分を理解する

解けなかった問題は放置せず、必ず復習しましょう。
コンテスト後には必ず解説が出ます。同じレーティング帯の人が解けて自分が解けなかった問題は、解説を理解してACできるところまで持っていきましょう。

解説を見てACができれば次に類題出たときにACができます。
また解説には、分からない知らない単語もバンバンあるはずなので、脳の引き出しにレパートリーとして入れておきましょう

また、自分の悪い癖にも気づきたいですね

- intでオーバーフローさせてWAを出してしまうことがあったら、以後オーバーフローしそうなものはlong long にする、
- 1-based indexing はヒューマンエラーの元なので 0-based indexing に変換する癖をつける

などなど、同じミスをしないよう防ぎましょう

## 5.AtCoderを理解する
ありがたいことに競プロのすごい人達はネット上に情報をバンバン流してくれるので、使いこなしましょう。

今現在のAtCoderの流れ（カードゲームで言うところの“環境”）は
社長の[chokudaiさん](https://twitter.com/chokudai) をフォローしておけば大体わかります。フォローしておきましょう。

また、 [AtCoder TLさん](https://twitter.com/atcoder_tl) はレーティングの色ごとにタイムラインをまとめているのでコンテスト後に自分のレート帯のタイムラインを覗いておくと自分や周りの得手不得手がわかるので、それを使って出し抜きましょう

youtubeの [AtCoderの公式アカウント](https://www.youtube.com/channel/UCtG3StnbhxHxXfE6Q4cPZwQ) では
コンテスト後の解説放送や、隔週くらいで社長が喋るあーだこーだーがあります。
[chokudaiさんのマシュマロ](https://marshmallow-qa.com/chokudai?utm_medium=twitter&utm_source=promotion)に投げるとあーだこーだーで答えてくれるので、AtCoderに直接問い合わせるほどでは…という質問はここで聞くといいですね。


## その他諸々の細かいtips
- 出題文中の"Yes" "No"はコピペして使う。"YES"と書いてしまって WA を出すな
- ABが終わったらCDEの解答人数を見ておおよその難易度を把握して取り掛かる問題を決める（たまに難易度が逆転することがある）
- よく知られていないアルゴリズムのtipsを書きまくることにより知っている人が増え、問題として出しやすくなる
- [便利リンク集](https://atcoder.jp/posts/261) に目を通して、便利だと思ったものは使う
- モニター周りの環境も整えておく 室温 飲み物 食べ物 は毎回揃えておく。よく見るページはあらかじめ開いておく
- 1,2問簡単なのでいいから作ってみて、出す側の気持ちを知る。制約や入力例の理由がわかるようになるかも… 良い問題ができたら有志によるコンテストを開いている[Yukicoder](https://yukicoder.me/)さんに出してみては
- コンテストが終わったあとに何が起こったか記録しておく。まあまあの人数が終わったあとにツイッターに結果と反省点を上げているが、これは見せびらかすと言うよりは言語化して問題点を浮き上がらせる、という部分が大きいのでは無いでしょうか。自分はキャンパスノートにまとめてます。
- たまに知らない単語が出たときはスラングの可能性があるので [競プロスラング用語集](https://kaage.hatenablog.com/entry/2020/05/04/142125) は軽く目を通しておいたほうがいいです
Power Automateで外部とのファイル共有を自動化できるか

# はじめに
だいぶ前にSharePointで外部の人と共有する設定方法を投稿しました。
[SharePointで外部の人とファイルを共有](https://qiita.com/fukasuke/items/f0f9cf435dbfaa9be5d0)
本稿ではPower Automateで同じことが出来ないか確認した際のメモです。

前の記事では、

+ 特定のサイトのみ外部と共有することが出来る。
+ 特定のファイルのみ外部と共有することが出来、ファイルを共有するための有効期限付きのパスワードを設定することが出来る。

ということが出来ました。
今回は結果から書くと、

+ 特定のサイトのみ外部と共有することが出来る。
+ 特定のファイルのみ外部と共有することが出来る。
+ パスワードを設定することは出来ない。
+ 共有の期限を設定することが出来ない（他の方法で出来る）。
+ 共有先ではメールでの認証となる。

となりました。以下ではその設定方法を記載していきます。

# 設定方法
## SharePointの設定
[前回の記事](https://qiita.com/fukasuke/items/f0f9cf435dbfaa9be5d0)を参照して外部との共有設定を行ってください。

## Power Automate
「アイテムまたはフォルダーへのアクセス権の付与」アクションを使います。「受信者」に外部のアドレスを指定することが出来ます。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/2b7a127d-f6a0-5e2d-f81a-9e35622008a9.png)
設定内容は以下。

- サイトのアドレス
    - 共有したいファイルがあるSharePointのサイト
- リストまたはライブラリ名
    - 共有したいファイルがあるリストまたはライブラリ名
- ID
    - 共有したいファイルのID
    - リストまたはライブラリ上のIDのことです。
- 受信者
    - 共有したい人のアドレスを入力。セミコロン区切りで複数アドレス指定可能。
- メッセージ
    - 任意項目。
    - このアクションを実行すると受信者に対してメールが送られますが、そのメールに何かメッセージを追加したい場合に記載します。
    - 例：『お世話になっております。ネオシステムの根尾です。お見積書をお送りします。』とか。
- 受信人への通知
    - ここは必ず「はい」。「はい」にしないと受信者にメールが送られません。

## 共有メール
「受信者」に設定したアドレス宛に以下のメールが送られます（Gmailで表示した場合)。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/51620214-4c2f-50dc-0e30-d168b965ee4c.png)
送信者はPower Automateのフローを作成したユーザのアドレスになります。
メールの「開く」をクリックすると、メーラーによっては以下のようなダイアログが表示される場合があります（下図はGmailの場合）。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/d247d5ad-191d-92c4-f25b-92085f1d1f49.png)
次に以下のような画面が表示されます。受信者のアドレスを入力し「次へ」をクリックします。ここで上記の「受信者」に設定していないアドレスを入力すると、エラーとなり、先に進むことは出来ません。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/9278af05-50b3-ac89-a010-37d4752576d9.png)
正しいアドレスを入力すると、下図のような画面になります。入力したアドレス宛にコードが記載されたメールが送られるので、そのメールに記載されているコードを入力します。
コードが記載されたメールは送信アドレスが「no-reply@sharepointonline.com」となります。Gmailでは迷惑メールとして判断されていました。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245365/b297441e-6673-bf5b-a8b8-a49e28f1a044.png)
正しいコードを入力するとダウンロード(表示)することが出来ます。

## 共有を切る
上記のPower Automateのアクションでは共有の期限を設定することが出来ないので、何もしなければ永久にダウンロード出来てしまいます。
共有の解除方法としては、

- 対象のファイルを削除、または別に移動させる。
- Power Automateの「アイテムまたはファイルの共有を停止します」アクションを使用して共有を停止する。

になります。
自動的にするには、共有した日付をどこかで保管(SharePointリストやExcel、Dataverseとか)して、共有後n日経過したファイルを削除または共有を停止させるフローを作成して日次で実行してあげれば良いと思います。

# 終わりに
この方式で認証(?)を良しとするかは置いといて、Power Automateで出来れば承認フローを走らせたり出来るので、共有先を間違えることは無くすことができるかもしれません。
[現場猫「トリプルチェック、ヨシ！」 → 統計の結果、ヨシではないことが判明](https://togetter.com/li/1589418)
FastTextで単語の類似度が出るまで

今後どこかで使いそうなのでメモ程度に

#項目
1. 学習済みのモデルを取ってくる
1. `gensim`に持ってきたモデルをロード
1. 単語のベクトル化や単語同士の類似度を出す

#1.学習済みのモデルを取ってくる
[ここから](https://fasttext.cc/docs/en/crawl-vectors.html)`cc.ja.300.vec.gz`というファイルをダウンロード。
(japanで検索すれば見つかるはず)

#2.`gensim`に持ってきたモデルをロード
```python:python
import gensim

model_path = '/content/drive/MyDrive/Colab Notebooks/fasttextmodel/cc.ja.300.vec.gz'
model = gensim.models.KeyedVectors.load_word2vec_format(model_path, binary=False)
```

#3. 単語のベクトルやそれら類似度を出す
```python:python
#ベクトルが近い単語を一括して出力
print(model.most_similar('~~~~', topn=10))

#単語同士の類似度を出力
print(model.similarity('~~~', '~~~'))
```
FPGAボード SOY2 で Lチカ ー その2(インプリまで)

## 概要

[「その１」](https://qiita.com/guinea_pig_t/items/0a5d1d594e8f0aa4adb0) からの続きです。
[SOY2](https://www.bbtech.co.jp/products/soy2/) で Lチカ、まとめる時間があまり取れずに、小出しです。。。
今回は、少しだけ進めて、インプリまでです。
([「その３」](https://qiita.com/guinea_pig_t/items/68cd1579798185c1abe5)へつづく)

## [SiTCP ライブラリ](https://www.bbtech.co.jp/products/sitcp-library/)上書き

[前回](https://qiita.com/guinea_pig_t/items/0a5d1d594e8f0aa4adb0)、SOY2出荷時ソースとSiTCPライブラリを入手しました。
SOY2出荷時ソースのディレクトリに、SiTCPライブラリを上書きします。同一ファイルは置き換えます。

## Vivado でインプリ

Vivado で、新規プロジェクトを作成

<img width=400 alt="add_source_files.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1205335/c72212e7-7763-47e1-0dde-9e42b740326d.png">

*.v と *.edf をソースとして選択します。

<img width=400 alt="add_constraint_files.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1205335/22c2dd83-c52a-a923-ce56-be7fc3fa46b1.png">

*.xdc を指定します。
制約ファイルは、SOY2.xdc, EDF_SiTCP.xdc の順番になるようにしてください。

順番が逆になってしまったときは、

<img width=400 alt="edit_constraint.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1205335/b3757947-9685-0a6d-feb2-15eb98ab83fd.png">

[Edit Constraints Sets...] にて、修正できます。

<img width=400 alt="choose_FPGA.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1205335/6ce20a3e-1602-0586-9a3a-eddcafbe3af7.png">

"xc7s25ftgb196-1" を選択してください。

[Generate Bitstream] をクリックして、bitファイルを生成します。

※ Vivado は、Docker 上で動かしています。
　　[「Xilinx の開発ツールを Docker コンテナに閉じ込める」](https://blog.myon.info/entry/2018/09/15/install-xilinx-tools-into-docker-container/) 参考にしました。

## その後は。。。

生成した bit ファイルを mcs ファイルに変換して、[SiTCP ユーティリティ](https://www.bbtech.co.jp/download-files/sitcp/SiTCPUtilityUserGuide.0.7.3.pdf)を用いて、SOY2 に書き込みます。
そして、動作確認ですが、このあたりは来週にまとめられればと思います。
【Python】Paizaのスキルチェックをローカルで実行する

## 何がしたいか
paizaの[スキルチェック](https://paiza.jp/challenges)はWeb上で完結しておりますが、ローカルのIDEやテキストエディタでコードを書きたい場合もあると思います。そこで、独自の`input()`を作ってファイルから入力できるようにします。

## フォルダ構成
フォルダ構成は以下を想定しております。`main.py`が実行するファイルで、`utils.py`に`input()`の実装を書きます。

```bash
paiza/
    in_1.txt
    main.py
    utils.py
```

## 処理内容
実際の処理は以下の通りとなります。とりあえず固定値で`in_1.txt`を渡すようにしてますが、複数ファイルを扱いたい場合はこのあたりを修正していただければ良いと思います。

```python:utils.py
import builtins
import linecache

line_num = 1

def input() -> str:
    global line_num
    target_line = linecache.getline('in_1.txt', line_num)
    line_num += 1
    return target_line.strip()

builtins.input = input
```


## 使い方
既存の`input()`をオーバーライドしているため、基本的にはpaizaで書いたコードを使用していただくことができます。ただし`import utils`だけは忘れないようにしてください。

```python
import utils

num = int(input())

(以下略)
```

## 次のステップ
この処理だけですとアウトプットが目視での検証になってしまうため、そちらも自動化する予定です。