OmniAICreator/Qiita-1.07M huggingface dataset:
DBに登録されているユーザリストのようなものをCSVファイルで保存するシェルのメモ

お仕事でLinux環境の作業がメインなので、練習も兼ねて
タイトルのようなシェルの中身についてメモをまとめます。

間違った箇所も散見されると思います。
ご指摘を頂けると幸甚です。
# 作業環境
- OS：Solaris10
- DataBase：Oracle 10g Standard Edition

# 今回のシェル実行コマンド
```
bash GetUserList.sh
```
# PATHの通し方(どのディレクトリでも実行可能にする)
<https://qiita.com/atelier/items/7d24ebe6f7bde5bedddc>

# 設定内容

## 「シバン」 システムにこれからシェルスクリプトを書きますと知らせるもの
```
#!/bin/sh
```

## DB設定 ユーザ名
```
DB_USER = "username"
```

## DB設定 パスワード
```
DB_PASS = "password"
```

## DB接続設定
``` 
DB_CONN = "connect $DB_USER/$DB_PASS"
```

## DBエラーチェック時の終了コード
## DB接続時にエラーが発生していたら接続を終了するための定義
```
RESULT_CODE_ERR=255
```

## ログファイル_ユーザー一覧出力先の用意
```
LIST_CSV = $CUR_DIR/UserListFile.csv
```
## ログファイル_エラーの出力先の用意
```
DB_ERR_LOG = $CUR_DIR/UserListFile_error.log
```

## 絶対パス(ディレクトリ全階層)を取得する
```
CUR_DIR = $(cd $(dirname $0) && pwd)
```


## 実行するSQLの用意

```
# catコマンドを利用して複数のユーザを出力先に一覧出力
# SYSTEMUSERテーブルからNAME,USERID,PASSWDを取得
# 取得した情報をUSERIDから昇順ソートする「ORDER BY ソートする要素名」

EXEC_SQL=$(cat <<EOF
SELECT NAME ||','|| USERID ||','|| PASSWD
FROM SYSTEMUSER
ORDER BY USERID;
EOF
)
```

## シェルスクリプト内でSQL*Plusを起動してSQLやOracleのコマンドを実行する
```
sqlplus -s /nolog <<EOF >> $LIST_CSV
```

## "「NAME」,「USERID」,「PASSWD」"を$LIST_CSVに出力する
```
echo "NAME,USERID,PASSWD" > $LIST_CSV
```

## DB接続とシステム変数の設定「SET システム変数 値」
```
# ※システム変数一覧
# <https://www.shift-the-oracle.com/sqlplus/system-variable/>

SET PAGESIZE 0
SET LINESIZE 200
SET ECHO OFF
SET HEADING ON
SET FEEDBACK OFF
SET TRIMSPOOL ON
```

## OSでエラーとなる場合終了する
```
WHENEVER OSERROR EXIT $RESULT_CODE_ERR
```

## SQLでエラーとなる場合終了する
```
WHENEVER SQLERROR EXIT $RESULT_CODE_ERR
```

# DB接続
```
$DB_CONN
```

# SQL実行
```
$EXEC_SQL
```

#SQLからログアウト
```
QUIT
```

## DBエラーチェックのif文、
## 条件式が真の場合のみ処理を行いそれ以外は処理をスキップする。
## エラー時はtee -aでログの標準出力と/UserListFile_error.logへ追記する
```
if [ "$?" -eq "$RESULT_CODE_ERR" ]; then
    echo "`date '+%Y/%m/%d %T'` ERROR:DB接続時エラー[$RESULT_CODE_ERR]" | tee -a $DB_ERR_LOG
    exit $RESULT_CODE_ERR
fi
exit 0
```

# 取得したCSVデータのイメージ

| NAME       | USERID       | PASSWD       |
|:-----------------|-----------------:|:----------------:|
|Aさん             | id01             |*******           |
|Bさん             | id02             |*******           |
|Cさん             | id03             |*******           |


>シェル勉強の引用元まとめ
>>シェルスクリプトリファレンス
https://shellscript.sunone.me/
>> 初心者向けシェルスクリプトの基本コマンドの紹介
https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337
>> LinuxでシェルスクリプトからOracleに接続する方法
https://qiita.com/tnishi91/items/3f752d58d22be9f6790c
>> シェルスクリプトで複数行のコメントアウト
https://qiita.com/kaw/items/ffdaf5d23627c0bd7e87
>> スクリプトが置かれている絶対パス取得方法
https://it-ojisan.tokyo/sh-get-path/

>SQL勉強の引用元まとめ
>> SQLで並び替え!ORDER BYについてなど
https://www.sejuku.net/blog/72918
>> SQL*Plus システム変数一覧
https://www.shift-the-oracle.com/sqlplus/system-variable/
>> WHENEVER SQLERROR コマンド
https://www.shift-the-oracle.com/sqlplus/command/whenever-sqlerror.html
CSSプロパティの記述順

## CSSプロパティの記述順は、"大きい括りから小さい括りへ"
*mozilla.org Base Styles 推奨*

**「CSSプロパティって、何から先に書いていけば綺麗なの？」
　そんな人にぜひ見て欲しい記事です！**

1. まず、要素を表示するか
 `display`

2. 要素の配置場所はどこにするのか
 `position` `float`

3. 要素のボックスモデルはどういったものにするのか
`width` `height` `margin` `padding` `border`

4. 背景はどうするか
 `background`

5. テキストなどの前景にあるものはどうするか
 `color` `font-size` `text-align` `vertical-align` etc.


引用元：　[CSSプロパティの記述順について考えてみた
](http://unitopi.com/css-order/)
Go言語初心者の備忘録

# この記事では
- Go言語初心者の私が、プログラムを書くために調べたことをまとめる
- コードについて深堀はせず、あとでコピペで使えるようにすること重視！
- 随時更新します

# build
- バイナリファイルを作成する

```
go build -o <output_binary> <go_file>
```

- バイナリファイルは作らず実行だけする

```
go run <go_file>
```

# HTTP
## Get

```go
	url := "https://google.com"

	resp, _ := http.Get(url)
	defer resp.Body.Close()

	byteArray, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(byteArray))
```

# 標準入力

```go
import "fmt"

func main() {
	var str string
	fmt.Scan(&str)
	fmt.Println(str)
}
```

# コマンドライン引数の受け取り

```go
import "flag"

func main() {
	flag.Parse()
	args := flag.Args()
}
```

# 日付を扱う

## 現在時刻の取得

```go
t := time.Now()
```

## 任意のフォーマットで文字列化

> Javaとは違って例文で書くらしい

```go
// 年月日
t := time.Now()
t.Format("20060102")
```

# 文字列を扱う

## 長さ

```golang
str := "aaaaa"
fmt.Println(len(str))      // 5
```

## 置換
```golang
str := "aaaaa"
fmt.Println(strings.Replace(str, "a", "A", 1))      // Aaaaa
fmt.Println(strings.Replace(str, "a", "A", -1))     // AAAAA
```

## 数値→文字列変換

```golang

```
githubアカウントを統合した時のメモ

## 背景
アカウントを切り替えるのが面倒なので、会社と個人のアカウントを統合した。
(会社的にok)

## step1. メールアドレスの整理
githubでは同じメールアドレスを使えないようです。
重複して登録しようとすると怒られるので、整理します。

https://github.com/settings/emails
消し去る予定の個人githubのメールアドレスを使いたかったので、個人アカウントの方に別のアドレスをまず登録し、そちらをprimaryに設定してから使い続けたいメールアドレスを削除する。

その後、統合アカウント(元会社アカウント)に先ほど空けたメールアドレスを登録し、primaryに設定する。
もともとあった会社メールアドレスはbackupに変える。
backupに変えてもnotidficationは受け取り続けると記載があるので大丈夫そう。(メールのnotificationは見ないからどっちでもいいけど)

## step2. gitconfig設定変更
```
$ git config --global user.name "統合アカウント"
$ git config --global user.email "統合アカウントメールアドレス"
```

## step3. 統合アカウントに個人macのsshの設定も追加する
まだpublic keyを発行してない人は発行してから

```
$　cd ~/.ssh # まだ鍵を発行してない人のみ
$　ssh-keygen -t rsa # まだ鍵を発行してない人のみ
$ cat ~/.ssh/id_rsa.pub | pbcopy
```

https://github.com/settings/ssh/new
ここに登録する。
一応確認。Successのメッセージが出ればOK。

```
$ ssh -T git@github.com
```

## step4. おまけ
ここでgit pushしたらエラーがでた。

``` 
remote: Permission to xxxxx denied to [旧個人github].
```
記憶にないですが、macのkeychainに設定していたらしい。

```
$ git config credential.helper
osxkeychain
```

macのApplication > Utilities > Keychain Access を開き、
検索窓でgitで検索してgithub.comで登録された秘密鍵を削除したら成功。
一応古いアカウントのssh keyも消した。


## 参考
https://qiita.com/Anorlondo448/items/b1ae955bb93f130f248a
Homesteadでvagrant upしたらhomestead.rbがない。と怒られた時に試した方法

#いろんな記事見てたどり着いた答えを書いてく

##環境
- Homestead
- Vagrant2.2.5
- Laravel5.7

##現象

自分の環境で`vagrant up`した時に以下のエラーが出た

```terminal
Vagrant failed to initialize at a very early stage:

There was an error loading a Vagrantfile. The file being loaded
and the error message are shown below. This is usually caused by
a syntax error.

Path: /Users/namizato/app/Sample/Vagrantfile
Line number: 0
Message: LoadError: cannot load such file -- /Users/namizato/app/Sample/vendor/laravel/homestead/scripts/homestead.rb
```

どうやら`homestead.rb`がないと言われてるようだった。

##試したこと

###上記のエラー文を検索したら一番最初に出てきた先輩の記事

[【Vagrant】vagrant upするとエラーが発生するようになったので修正しました、という軌跡](https://qiita.com/sola-msr/items/b36b647a12511098daac)

Vagrantをバージョンアップしてもダメなら下記を試したらいけたとのこと。

```terminal
vagrant plugin expunge --reinstall
```

しかし自分の環境じゃ変わらず。。

###ComposerのUpdate

次は`composer update`をしたら直ったよ！という記事があったので試してみる。

```terminal
composer update
```

.....自分の環境じゃダメだった。。

###Composerを入れ直す

とりあえずComposer入れ直してみるか。。くらいのつもりでやる

```terminal
 composer require laravel/homestead --dev
```

```terminal
vagrant up
```

.....イケた！？！？

という事でcomposerを入れ直したらいけました。。なぜかは分かりませんが、原因わかる人いたらコメントください( ；∀；)
Oracle 初期化パラメータファイルのバックアップ

#初期化パラメータファイルとは
Oracleの制御ファイルにはSPFILEとPFILEの二種類がある。
それぞれの特徴を記す。

|  |SPFILE|PFILE|
|---|---|---|
|保存方式|バイナリ形式|テキスト形式|
|編集方法|ALTER文|エディタ編集|
|起動中インスタンスへの変更|反映可能|反映不可|

現在SPFILEが主流で、PFILEを優先して使うことはあまりないらしい。
しかし、SPFILEに誤った値を設定してDBが立ち上がらなくなった時などには、
PFILEをエディタで編集して正しい値を設定した後、PFILEを指定して起動するなんてこともできる。

#SPFILEのバックアップコマンド
SYSDBAまたはSYSOPER権限で実行。

```
CREATE PFILE = 'HOGE_init.ora' FROM SPFILE;
```

上記コマンドでSPFILEからPFILEへ変換される。'HOGE_init.ora'の部分はフルパスで保存先を指定できる。

#PFILEからの復元
最初にSPFILEの保存先(復元先)のパスを確認する。

```
show parameter spfile
```

取得したPFILEのバックアップをSPFILEに復元するコマンド。

```
CREATE SPFILE = '$ORACLE_HOME/dbs/spflileoHOGE.ora' FROM PFILE = 'HOGE_init.ora'
```

'$ORACLE_HOME/dbs/spflileoHOGE.ora'の部分はshow parameter spfileで確認したパスを指定。

##SPFILEとPFILEの使い分け
先程も書きましたが、普段の運用ではSPFILEを使用し設定値変更もALTER文で行う。
DBが立ち上がらないなど障害発生時にはPFILEをエディタで編集してSPFILE変換して起動する。
またはPFILEを指定して起動する。
初期化パラメータファイルが原因の障害の場合はこうした使い方が可能となる。

そのためDBAは普段からのバックアップを行い障害時に備えておくべきである。
Flashair からArduinoでテキストを読み出している際、Wi-fiがストップする件について

# 作ろうとしているもの
ただいま、Flashairに書き込まれたデータを読み出して、枯山水を自動で描くマシーンを作っています。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">枯山水マシーン、砂をふるいにかけて細かくした。あと、光の当たり方がみえかたに重要みたい。<br>かなり綺麗に書けるようになったぞ。あとは制御パターンをSDから読み出せるようにせねば！ <a href="https://t.co/uVftrdpIX6">pic.twitter.com/uVftrdpIX6</a></p>&mdash; おぼぁ (@obor1994) <a href="https://twitter.com/obor1994/status/1134677803784331265?ref_src=twsrc%5Etfw">2019年6月1日</a></blockquote>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今週の進捗<br>SDカードからのパターン読み出しに対応。ついでにFlashAirをつかってるので、ウェブページを組んでインストールされているパターンをスマホなどから閲覧可能にした。web開発なれてないからちょっと手間取ったけど。<br>あとは操作とかアップロードにも対応させてもいいかもね <a href="https://t.co/5yrcWK4OTS">pic.twitter.com/5yrcWK4OTS</a></p>&mdash; おぼぁ (@obor1994) <a href="https://twitter.com/obor1994/status/1137652530068934656?ref_src=twsrc%5Etfw">2019年6月9日</a></blockquote>

### 使用しているもの
- Arduino Mega 2560
- SD基盤（自作）
- Flashair W-03 8GB （ソフトウェアV3.00.02, STAモードで使用）

# 問題

**今回の問題は単に自分の環境かもしれません。
他の人で同じような現象に悩んでいる、あるいは同じようなこと（FlashairからSD.hを利用した読み出し）をしているが動いているという方がいましたらご報告ください。**

ただ、どうもFlashairをからデータを繰り返し読むコードを実行するとFlashairのWi-fiがストップしている様子です。
今回実行しているファイル読み出し部分を超簡単に書くと以下のようなコードになります。
具体的にはSDのマウントを行ってからWi-fiが停止するようです。
（実際はcsvファイルの構文解析処理などが入りますが、以下のように読み出しを定期的に行うコードだけでもWi-fiが停止していました。）

```
// wi-fiが停止する
SD.begin(A0);
while(1){
  char c;
  delay(1000);
  File myFile = SD.open("TEST.TXT",FILE_READ);
  c = myFile.read();
  myFile.close();
}
```


# 解決策
ダミーファイルを作って定期的に書き込みを行えば通信が維持します。

```
// これなら動く
SD.begin(A0);
while(1){
  char c;
  delay(1000);
  File myFile = SD.open("TEST.TXT",FILE_READ);
  c = myFile.read();
  myFile.close();

  // ダミーファイル書き込み
  myFile = SD.open("TEST2.TXT",FILE_WRITE);
  myFile.seek(0);        
  myFile.println("hey");
  myFile.close();
}
```


# 考察
最初これが発生したときは、閃 ソラ（@Hirameki_Sora）様やあおいさや（@La_zlo）様の助言を頂き、電源周りを疑って安定化電源を使うなど行いましたが、効果がありませんでした。

そこで試しに[公式のサンプル][1]を動作させたところ正常に動きました。これのSD処理周りを抜き出して超単純に書くと以下のようになります。

```
// これなら動く
SD.begin(A0);
while(1){
  delay(1000);
  File myFile = SD.open("TEST.TXT",FILE_WRITE);
  myFile.println("hey");
  myFile.close();
}
```

どうやらSDをマウント（SD.begin()）しても、ファイルに書き込む操作（File.println()）が定期的に行われていればwi-fi機能が持続するらしい…です。
SDライブラリとFlashairの組み合わせの都合かはわからないのですが、なんだか気持ち悪い結果になりました。
この書き込み操作を何かしらのコマンドで置き換えればかなり無駄が減ると思います。
何かより良い方法があれば追記していきたいと思います。

[1]:https://flashair-developers.com/ja/documents/tutorials/advanced/4/
faviconの簡単な作成・設定方法【Rails】【Vue.js】

# この記事の内容
転職活動に向けて個人開発を行っています。
その中で、
**Webサイトのタブのタイトル横のアイコンってどうやって変えるの？**
という疑問が浮かびました。

その作成から設定まで、私が行った手順をまとめます。
今回はRailsアプリと、Vue.jsのポートフォリオサイト２つを作成しているので、この２つについて紹介します。

## favicon

そもそも、Webサイトのタブの横のアイコンのことはfaviconといいます。
> favicon（ファビコン）は「Favorite icon（お気に入りのアイコン）」という言葉を省略したもので、運営者がWeb ページに設置するシンボルマークのことです。主に、アドレスバーや ブラウザのタブ、スマートフォンでWeb ページを"ホーム画面"に置いた際に表示されるアイコンなどを指します。
https://ferret-plus.com/8036

## 作成

### 画像の準備
まずは画像ファイルを用意します。
サイズはなんでもいいですが、小さくなってしまうので、シンプルなものがいいと思います。

今回私が作成しているRailsアプリでは、サイト内のHOMEボタンを、作成したロゴ画像にしたので、それとイメージを揃えることにしました。
ロゴ作成に用いたサイトが[Logo Maker](https://logo.squarespace.com/#N4IghgrgLgFgpgExALigJwnAvkA)です。
ものすごく簡単にロゴが作れます。しかもスタイリッシュ。

作り方は、入れたい文字とシンボルを選んで配置するだけ！

今作成しているRailsアプリは「人生でやりたいこと100のリストを管理・共有できるアプリ」なため、こんなロゴにしてみました。
![100dreams-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427185/3f26a2a7-abe1-3eef-d3ec-9e9df1a4a344.png)
で、このままfaviconにすると字が小さくなって読めないので、上の吹き出し部分だけをfaviconにすることにしました。
Logo Makerで、文字を入れずに吹き出し部分だけで画像を作成しました。

### 画像の変換
作成した画像をfaviconに設定するためには、「.ico」というフォーマットに変換する必要があります。
「.png」「.gif」でも可能ですが、ブラウザによって対応しない可能性があるらしいので「.ico」が無難です。

変換のために、[ファビコン作成](https://ao-system.net/favicon/)サイトにお世話になります。

どのサイズの画像を作成するか選択して画像をアップロードし、「favicon.ico作成」ボタンを押してダウンロードするだけです。

サイズについては、
> ● 主要なfaviconサイズ
16px × 16px：IE タブ
24px × 24px：IE9 ピン留め機能
32px × 32px：Chrome、Firefox、Safari などのタブ
48px × 48px：WindowsのWeb ページアイコン
64px × 64px：高解像度 WindowsWeb ページアイコン
https://ferret-plus.com/8036

とのことです。

### アプリに設定
#### Rails
Railsアプリの場合は、作成したfavicon.icoをpublicディレクトリ直下に配置します。
application.html.erbのheadに

```
<%= favicon_link_tag('favicon.ico') %>
```
を追加します。

#### Vue
Vueアプリの場合は、作成したfavicon.icoをstaticディレクトリ直下に配置します。
index.htmlのheadに

```
<link rel="shortcut icon" type="image/png" href="/static/favicon.ico"/>
```
を追加します。

### これだけです！
簡単にfaviconが作成・設定できました。
<img width="376" alt="Qiita-100dreams.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427185/1742d39b-c153-1821-0d2b-5fc707613125.png">
Railsアプリ↑　　↓Vue.js
<img width="354" alt="Qiita-portfolio.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427185/cbb66a55-b54e-fe62-1905-67b707c1d84e.png">
Microsoft Flow：投稿記事一覧

# 変数・関数を中心にしたチュートリアル・記録

Microsoft Flow のWebにある情報がわかりにくかったり、探しにくかったりしたので、
とりあえず自分で試作したものを記録。

自分は、もともとJava、Ruby、Python、Goなどコーディング中心にプログラムをしていたので、こうしたツールについても、コーディング要素に着目して使っていこうと思っています。その観点での記録です。

1. [▶ 学習・動作確認用に、即座に実行するフローを作成](https://qiita.com/SFITB/items/0b8f2d688ad6e657a7be)
2. [▶ 単純な配列の内容をOne Driveにテキストファイルとして保存](https://qiita.com/SFITB/items/e8d76d288b1bd0824b45)
3. [▶ 文字列を区切ってループ処理](https://qiita.com/SFITB/items/dc65588058f5c0b2ee0b)
4. [▶ オブジェクト(JSON）を作成し、配列に追加。オブジェクト配列をCSVファイルにエクスポート](https://qiita.com/SFITB/items/b4b0f141a59db72d0ee6)
5. [▶ オブジェクト(JSON）の値を更新](https://qiita.com/SFITB/items/025a0018491952771cbf)
6. [▶ 「式」（関数）の引数に使う操作対象のコードを調べる](https://qiita.com/SFITB/items/74012f8a3fd5f03dc53e)

# 参考文献

1. [▶ 公式 Flow ドキュメント](https://docs.microsoft.com/ja-jp/flow/#pivot=expert)
2. [▶ 公式 Flow 関数リファレンス](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference)
Unityのパーティクルでシューティングゲームの自機弾を作る

# 環境
Unity 2019.3.0a6
Windows 10 Home
# 目標
入力に応じて45度間隔で3方向に弾を射出し、衝突したら弾と衝突対象を破壊する
# 準備
タグに"Enemy"を追加する
衝突する対象のコンポーネントに何かしらのCollider(2Dを除く)をアタッチ
衝突対象のタグには"Enemy"を指定
# ParticleSystemの設定
- Transform  
  - Inspector上でリセットする
- ParticleSystem (変更したもののみ記載)
    - main
      - Looping : チェックを外す
      - Start Lifetime : 2.5 (2.5秒後に自動的に破壊される)
      - Start Speed : 5(初期速度)
      - Simulation Space : World (弾が独立して移動する)
      - Play On Awake : チェックを外す (起動時に再生しない)
    - Emission
      - Burst
         - Rate over Time : 0
         - Count : 3 (1回に3発撃つ)
         - Cycles : 1 (1回だけ繰り返す)
    - Shape
        - Shape : Circle
        - Radius : 0.0001 (半径)
        - Arc : 90 (1発目～3発目の角度)
            - Mode : Burst Spread (等間隔)
        - Rotation : (X,Y,Z) = (0,0,45) (1発目の角度)
    - Collision
        - Type : World
        - Mode : 3D
        - Lieftime Loss : 1 (衝突時に自身を即破壊)
        - Collision Quality
          - Collides With : Enemy (自分でタグを追加)
          - Enable Dynamic Colliders : チェックを入れる
        - Send Collision Messaages : チェックを入れる (スクリプトからパーティクルの衝突を検知)

# メモ
設定どおりであればX軸の正の方向が0度で反時計回り
90 ÷ (3 - 1) = 45 で弾1発毎の角度は45度
1発目を45度方向に射出 (45(ShapeのRotation.zの値))
2発目を90度方向に射出 (45 + 45)
3発目を135度方向に射出 (45 + 45 + 45)

# ParticleSystemにアタッチするスクリプト
```c#:PlayerShooter.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerShooter : MonoBehaviour {
    ParticleSystem particleSystem;
    float shootRate = 0.25f;

    private float count = 0.0f;

    void Start() {
        particleSystem = GetComponent<ParticleSystem>();
    }

    void Update() {
        count += Time.deltaTime;
        if (Input.GetButton("Fire1") && shootRate < count) {
            particleSystem.Play();
            count = 0;
        }
    }

    void OnParticleCollision(GameObject c) {
        Destroy(c.gameObject);
    }
}



```

# 参考
https://forum.unity.com/threads/destroy-single-particles.490654/
https://docs.unity3d.com/ja/current/Manual/PartSysCollisionModule.html
【Oracle12c】WRI$_ADV_OBJECTSが増え続ける

`SYSAUX`にあるテーブル`WRI$_ADV_OBJECTS`が毎日増え続けて`SYSAUX`表領域を圧迫していたので対処メモ。

調べたところ`12.2.0.1`以降追加されたオプティマイザ統計アドバイザの自動実行のせいで発生する事象のよう。

https://support.oracle.com/knowledge/Oracle%20Database%20Products/2355243_1.html

アドバイザの使うテーブルなら大丈夫だろうと判断しテーブルはTRUNCATE。

```sql
TRUNCATE TABLE WRI$_ADV_OBJECTS;
```

以後増え続けないようにオプティマイザ統計アドバイザは停止させました。

```sql
DECLARE
  filter1 CLOB;
BEGIN
  filter1 := DBMS_STATS.CONFIGURE_ADVISOR_RULE_FILTER('AUTO_STATS_ADVISOR_TASK','EXECUTE',NULL,'DISABLE');
END;
/
```
[ETH-MEETUP] Solidityで入退室管理をしよう

# Ethereumのミートアップの課題「入退室管理をしょう」
2019/07/06 SingularityHIVE 開催
Ethereum Solidity入門課題
## 仕様
- addUser(address, string): 送信者はオーナーのみ許される．ユーザの名前を含めた基本情報を登録する．
- enter(): 入室処理
- exit(): 退室処理
- get~~~(address): 各パラメータのゲッター

## アドレス帳のコード例

```js:Cas.sol
pragma solidity >=0.4.22 <0.6.0;
contract Cas {
    // ユーザ情報
    struct Info {
        string name;
        uint total;
        bool status;
        uint last;
    }
    // アドレスと紐付け
    mapping(address => Info) data;
    // このコントラクトを管理するアドレス
    address owner;
    // コントラクトをデプロイしたアドレスをオーナーとする
    constructor() public {
        owner = msg.sender;
    }
    // ユーザを追加(オーナー権限)
    function addUser(address user, string name) public {
        _checkOwner();
        Info storage info = data[user];
        require(info.last == 0, "Already_Exist");
        info.name = name;
        info.total = 0;
        info.status = false;
        info.last = now;
    }
    // ユーザの入室処理
    function enter() public {
        Info storage info = data[msg.sender];
        require(info.last > 0, "Not_Registered");
        require(!info.status, "Already_in");
        info.status = true;
        info.last = now;
    }
    // ユーザの退室処理
    function exit() public returns(uint stay){
        Info storage info = data[msg.sender];
        require(info.last > 0, "Not_Registered");
        require(info.status, "Already_out");
        info.status = false;
        stay = now - info.last;
        info.total += stay ;
        info.last = now;
    }
    // ユーザの名前を得る
    function getName(address target) view public returns (string name) {
        name =  data[target].name;
    }
    // ユーザの今までの滞在時間を得る
    function getTotal(address target) view public returns (uint total) {
        total =  data[target].total;
    }
    // ユーザの入室状態を得る
    function getStatus(address target) view public returns (bool status) {
        status =  data[target].status;
    }
    // ユーザが最後に行動した時間を得る
    function getLast(address target) view public returns (uint last) {
        last = data[target].last;
    }
    // トランザクション送信者がオーナーかどうかのチェックを行う
    function _checkOwner() view private {
        require(msg.sender == owner, "Permission_Denyed");
    }
}
```
## 今後追加してもいいと思う機能
- オーナーの移行機能
- ERC20などのトークンを用いたインセンティブ設計
- ランキング機能
- 鍵管理機能
Microsoft Flow：学習・動作確認用に、即座に実行するフローを作成

# 手順
1. 左メニューの「マイフロー」を選択
2. 「＋新規」を選択
3. 「＋インスタントー空白から作成」を選択

![proc1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/01d1c98b-4f32-5417-4e33-473c2c09fd75.png)


4.トリガー選択で、「Microsoft Flow」を選択。（必要に応じて、フロー名を設定してください）

![proc2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/fb3237d0-95f0-ee16-15a3-0ba7626c8e6f.png)


5.テストフロー作成準備完了。フローをつくったら、右上の「テスト」で動作確認ができます。

![proc3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/66e30d62-32eb-6c83-23c6-c28c9b4ec4fe.png)
【注意喚起】予約機能付きホームページもしくはシステムの選び方／悪質商法被害にあわないためのチェックポイント

![](https://i.gyazo.com/2718a837deccb9b2f702769ee8442774.png)

**留意点**
当方は、自身でも予約システムを開発・販売しています。本記事は、極力、客観的・公正に記載したつもりですが、自身の立場によるポジショントークも含まれている可能性がありますのでご留意ください。

# 背景

- ネットリテラシーが低いクライアント相手に、詐欺的なサービスを提供しているWeb制作・運用代行会社がある
- 異なる業者2つ。いずれも比較的規模は小さくかつ地方企業という共通点がある。
- そんな悪質な業者はいずれ淘汰されると思っていたが、淘汰されるどころか、リテラシー低い人が「時代に遅れている？」という焦りから、営業にすすめられるままに契約してしまい、さらに被害拡大する傾向にある。
- クライアントの利益を度外視した悪質な商法であるが、違法ではないので対処しようがない。
- 同じような被害にあうクライアントを少しでも減らしたい。契約前に契約条件をチェック・見直すことが有効
- 自社ホームページや関係先に同じ情報は掲載済。技術情報ではないですが、QiitaのSEO力・拡散力に期待して投稿

悪質事例教えてください。追記します。

# 事例・問題点

以下のような実例があります。

こういったサービスと契約してしまうお客様は「検索エンジン」「ドメイン」に関する一般的な常識を持ち合わせておらず、さらに「コンテンツ」「データ」の価値を理解していません。このため業者のすすめるがままに不利な契約をしてしまっています。

- ホームページをクライアント自身で更新できない。管理アカウントが提供されていない。
- ホームページをクライアント自身で更新できる場合でも、静的HTMLで制作されており、更新にHTML/CSSの知識が必要だったり、FTPでダウンロード・アップロードの手間が必要だったりするため実質不可能となっている
- 簡単なホームページ更新（料金変更、写真を１枚だけ差し替え、追加とか）でも、数千円の手数料を請求する
- ドメイン管理手数料と称して法外な料金を請求している
- 【重要】ドメイン移管に対応しない。もしくは法外な如何手続き手数料を請求している
- 【重要】解約時にそのホームページやシステムに蓄積された自社のコンテンツ・データを一切提供しない

# チェックポイント概要

- ホームページの更新方法・・・自分たち（もしくは協力者）で簡単に更新できるか？
- ホームページの更新料金は？
- 法外なドメイン管理費（例えば年間１万円）を請求されていないか？
- 【重要】解約時に「ドメイン移管手続き」に対応しているか？無償か？
- 【重要】解約時に運用中に制作されたコンテンツ・データが提供されるか？

# チェックポイント詳細

## ホームページを自社で更新できるか？

- 自分たち（もしくは協力者）が更新できるようにログインアカウントが提供されているか？
- 更新する際にHTML/CSSの知識は必要か？
- ファイルをダウンロードして、編集して、アップロードするような無駄な作業は不要か？

### 【豆知識】
ホームページは検索エンジン（Google、Yahooなど）から「評価」されています。
更新が少ないホームページの評価は「低」となり検索されても上位表示されません。
検索エンジンはインターネット業界の王様です。検索エンジンから低評価のホームページは存在しないも同然です。

### 【対策】
- ログインアカウントを提供してもらってください。
- HTML/CSSの知識不要で更新できるようにしてもらってください。

## ホームページの更新料金は？

自分たちで更新できない場合、例えば料金変更（金額をちょっと変えるだけ）や写真を1枚追加・変更したいという場合に対応してもらえるか？

###【豆知識】
上述した作業は２～３分で終わります。
こういう作業に対して2,000円などの請求をする業者があります。

ただし、これは怠惰なクライアントにも問題があり、一般的に「利用するかどうかは選択可能」なのでそれほど悪質とは言えません。

###【対策】
- 自分たちで更新できるようにしてもらいましょう。
- 更新手順も説明してもらいましょう

## 法外なドメイン管理費を請求されていないか？
なんと1万円を請求する業者もいます。
ドメイン管理作業はゼロです（レジストラというドメイン提供会社が行います） ので「やらずぼったくり」の典型と言えます。

そもそも、ドメインの契約を外部会社に委託するのは絶対にやめましょう！

【対策】
ドメインは重要な資産です。自社で契約しましょう。管理するための知識も作業も不要です。

## 解約時に「ドメイン移管手続き」に対応しているか？手続費用は無償か？

ドメインは、インターネット上の御社ホームページの「住所」に相当します。
ドメインも検索エンジンから評価されています。長年使っているドメインは評価が高くなります。
また、名刺や関連サイトからのリンクやお客様のブックマークには「ドメイン」が利用されています。

ドメイン移管に対応してくれない場合は、新しいホームページでは新しいドメインを取得する以外に方法がありません。
この場合、ホームページの評価はリセットされて、リンクは切れてしまいます。

また、私自身があるサイト移行の際に体験したのは、移管手続き費用として「15,000円」を請求されたことです。
移管手続きは極めて簡単で、手続きそのものは数分、移管先等の情報やりとりを含めて、15分かからないでしょう。

### 【豆知識＆対策】
ドメインは自社で契約しましょう。管理するための知識も作業も一切不要です。

## 解約時に、運用中に制作されたコンテンツ・データを取得できるか？
コンテンツとは「写真」「記事」「PDFファイル」などです。
データとは「顧客データ」「予約データ」「口コミデータ」「ポイントデータ」などです。
コンテンツは原本（記事ならテキストファイル）、データは再利用可能な形式（ヘッダ付きCSVやJSON、XML）で入手できる必要があります。

これらはいずれも自社の貴重な資産ですが、提供しない業者がいます。

コンテンツが提供されない場合、サービスを乗り換えようとした時にゼロからコンテンツを用意する必要があり、制作コストが非常に高くなります。

データが提供されない場合はもっと悲惨です。

- お客様は、再度アカウントを作成してくれるでしょうか？
- 付与したポイントが移管できなかったら、お客様はどう感じるでしょうか？
- お得な情報をどうやって届ければよいでしょうか？
- 何年もかけて蓄積した「口コミ」が無くなって大丈夫ですか?口コミは初見のお客様にとって価格やサービス内容と同等かそれ以上に重要な情報です。その口コミがゼロになることは客観的な信用がゼロになることを意味します。


### 【対策】
- 契約時に確認しましょう。
- 提供を保証しない業者とは契約すべきではありません。
Microsoft Flow：単純な配列の内容をOne Driveにテキストファイルとして保存

# 仕様
（テスト用のフロー作成は、[▶ここを参照](https://qiita.com/SFITB/items/0b8f2d688ad6e657a7be)）
1. 数字だけで構成する配列を作成
2. 配列をループ（Apply to each）
3. ループした各値（現在のアイテム）をファイル名にして、同じ値をファイルの内容とする。

![flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/b88ec1f7-34e1-e078-6079-4b82c809b81f.png)
ウィナー・ホッフ方程式をPythonで解いてみた

#ウィナーフィルタを最小二乗法で解く[^1]


数式は下記の通り。

```math

\begin{align}
  {\boldsymbol U} &= [ {\boldsymbol u}_1, \cdots, {\boldsymbol u} _ {L _ s}  ] \\

                  &= 

\begin{bmatrix}
   u _ 1 & u _ 2 & \cdots & u _ K        & \cdots & u _ {L _ s - 1} & u _ {L _ s} \\
  0      & u _ 1 & \cdots & u _ {K - 1}  & \cdots & u _ {L _ s - 2} & u _ {L _ s - 1} \\
  \vdots &       & \ddots &  \vdots &             & \vdots          &  \vdots \\
  0      & 0     & \cdots & u _ 1  & \cdots & u _ {L _ s - K} & u _ {L _ s - K + 1} \\
\end{bmatrix} \\
  \\

  {\boldsymbol d} &= [d_1, \cdots, d_{L_s}] \\
  
  \hat{{\boldsymbol R}} _ u         &= {\boldsymbol U}{\boldsymbol U}^H \\
  \hat{{\boldsymbol r}} _ {ud}      &= {\boldsymbol U}{\boldsymbol d}^H \\
  \hat{{\boldsymbol w}} _ {LS} &=  \hat{{\boldsymbol R}_u} ^ {-1}  \hat{{\boldsymbol r}} _ {ud} \\

\end{align}
```

Pythonはこう。正しく計算できているかわからなかったので，畳み込んだ$w_{ref}$が推定できるかやってみた。
あと，逆行列は精度が悪いみたいなので，$ \hat{{\boldsymbol R}_u} \hat{{\boldsymbol w}} _ {LS} = \hat{{\boldsymbol r}} _ {ud}$ を`numpy.linalg.solve` で解いています。


```python

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import scipy.signal as sg


z  = np.arange(512)
h0 = 1 / (1 + np.exp(0.0001 * (z - 128) ** 2))

Wref  = h0 / np.sum(h0) * 2
plt.plot(Wref)
plt.title("$w_{ref}$")
plt.show()

x  = np.linspace(0, 1, 4096)
#y1 = np.sin(2 * np.pi * x) + 0.2 * np.sin(np.pi * 20 * (x + 0.1))
y1 = np.sin(2 * np.pi * x) + 0.2*np.sin(np.pi * 20 * x + 0.1 * np.pi)
y2 = sg.lfilter(Wref, [1], y1)

plt.plot(x, y1)
plt.plot(x, y2)
plt.legend(["$y1$", "$y2=y1 * w_{ref}$"])
plt.show()


Ls  = 1024
K   = 512
U   = np.array([[ y1[l - k] if l >= k else 0 for l in range(0, Ls)] for k in range(0, K)])
Ru  = U @ U.T
d   = y2[:Ls]
rud = U @ d.T
Wls  = np.linalg.solve(Ru, rud)

plt.plot(Wref)
plt.plot(Wls)
plt.legend(["$w_{ref}$", "$w_{LS}=(U U^T)^{-1} U d^T$"])
plt.show()

plt.plot(Wls - Wref);
plt.legend(["$w_{LS}-w_{ref}$"])
plt.show()

plt.plot(x, y2);
plt.plot(x, sg.lfilter(Wls, [1], y1))
plt.legend(["$y2$", "$y1 * w_{LS}$"])
plt.show()

plt.plot(x, y2 - sg.lfilter(Wls, [1], y1))
plt.legend(["$y2 - y1 * w_{LS}$"])
plt.show()

```

[^1]: はてなから引っ越し
git commit -a　でコミット名をまったり何行でも作れる

いつもコミットを
`$git commit -m "コミットメッセージ"`
で作成していたが

`$git commit -a`コマンドを実行するとコミットメッセージ入力する用のファイルが開くので
その中にコミット名を記述→　`：wq`で保存すれば
このやり方でもコミット保存できる。
posticoはpostgreSQL用の、sequelproはmysql用のデータベースGUIツール

テーブルの追加や削除、構造の変更なんかも簡単にできるGUIツール。

参考
https://qiita.com/junara/items/8ee572151727288f6576
https://takkuso.hatenablog.com/entry/2016/06/15/142820
"Port 7071 is unavailable"の対処方法

##　事象

Visual StudioでFunction Appを起動したときに、

```
Port 7071 is unavailable. Close the process using that port, or specify another port using --port [-p].
Press any to continue....
```

というエラーが発生して、Function Appが動かない。

## 原因

ポート7071が既に使われている等で、利用することができない。

> Visual Studioを2つ起動して、Function Appを2つ動かしたいときとか。

## 対処方法

1. local.settings.jsonで、ポート番号を指定する。

```json
  "Host": {
    "LocalHttpPort":  7072
  }
```

例：  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/5ff23359-52da-ca46-a20e-e9dc743b6a11.png)

2. プロジェクトのプロパティ > デバッグにある、アプリケーション引数に`host start --pause-on-error`を追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/c38a9bef-3468-12a6-ad23-19f39c8969fa.png)


## 参考

* [How to run Azure Function app on a different port in Visual Studio](https://stackoverflow.com/questions/44976890/how-to-run-azure-function-app-on-a-different-port-in-visual-studio/44977350)
MacでvagrantをInstall

# Macにvagrantをinstall

## virtualbox

* virtualboxをinstall

```
brew cask install virtualbox
```  

* 以下を許可

<img width="780" alt="スクリーンショット 2019-07-06 8.11.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108052/487ca3cb-59a4-e630-0732-898c8b92e7bd.png">


* 以下もチェック

<img width="780" alt="スクリーンショット 2019-07-06 8.28.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108052/9c012d77-b433-c370-c84a-f28d35254b9c.png">


## vagrant

* vagrantをinstall

```  
brew cask install vagrant
```

* check

```  
[shuntaro:~]$ vagrant -v
Vagrant 2.2.5
```

* create folder
```  
mkdir ~/vagrant  
```


## First Test

* isucon過去問試してみたかったため

```  
[shuntaro:~/vagrant/isucon8]$ pwd
/Users/shuntaro/vagrant/isucon8  
```

* Vagrant fileを取得

```
wget https://raw.githubusercontent.com/matsuu/vagrant-isucon/master/isucon8-qualifier-standalone/Vagrantfile
```

* networkは forward する方式で ( DockerとVirtualboxが競合しちゃうため)
	- コメントアウトします

```
  # config.vm.network "private_network", ip: "192.168.33.10"
  # config.vm.network "private_network", type: "dhcp"
```



* vagrant up

```  
[shuntaro:~/vagrant/isucon8]$ ls
Vagrantfile
[shuntaro:~/vagrant/isucon8]$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'centos/7' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'centos/7'
[..] 
```
ザックリまとめ Full-body High-resolution Anime Generation論文

# Full-body High-resolution Anime Generation with PSGAN論文まとめ

- 本論文はDeNAさんが発表した論文です。[arXivはこちら。](https://arxiv.org/abs/1809.01890)
- 2018年の9月にsubmitされたもので、アニメキャラの全身動画(サイズが1024×1024,高品質)の生成に成功しています。
- こちらの[DeNA](https://dena.com/intl/anime-generation/)のページで生成された動画(結果)が確認できます。
- PSGANはProgressive Structure-conditional Generative Adversarial Networksの略です。

## この記事で説明すること
- 上記論文の特徴
- 関連する論文

## この記事で説明しないこと
- GANの仕組み
- 結果・実験の詳細


ザックリとまとめていきます。サクッと見ていきましょう。

### 本論文の特徴
この論文のもっとも大きな特徴は
**「階層的にキャラクターの全身の情報をConditional dataとして注入している」**
ということになります。

ちょっとわかりにくいと思いますので、論文内で示されている概念図を見ていきます。

![スクリーンショット 2019-07-06 8.59.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391968/38fe4502-177c-2357-ec10-354d6da50360.png)
白色の四角は学習パラメータを持つレイヤで、灰色の四角は学習パラメータを持たないレイヤになっています。

この論文のGANの構造自体はよくあるDCGANであり、少しずつ生成する画像のサイズを大きくしています。
その際にモーションキャプチャで撮れるような図を注入することで、アニメキャラクターを「自然な姿勢」で生成することに成功しています。

このモーションキャプチャの情報(論文ではkeypointsと表現されています)はどうやって手に入れるかと言うと、Unity3Dだったり**Openpose**と言う手法を使うことで取得しています。

### 関連論文
- keypointsの取得に関して(Openpose) 2016年発表
[Realtime multi-person 2d pose estimation using part affinity fields.](https://arxiv.org/abs/1611.08050)
- モデル構造に関して 2017年発表
[Progressive growing of gans for improved quality,and stability,and valiation.](https://arxiv.org/abs/1710.10196)


#### 補足・イメージ・教訓
- 「Progressive」と言うのは少しずつ解像度を上げてく、みたいな意味なのかなと思ってます。(※関連論文読んでないのであくまで想像です)
- ConditionalGANの情報の入れ方は色々あるんだなぁと言う感じです。また入れる情報自体もタスクごとに色々と試すのはありなのかなと思います。
- Qiita初投稿記事になります。これから論文まとめをちょくちょく挙げれたらなと思うので、よかったら今後も見ていただけると嬉しいです。



最後までお読みいただきありがとうございました！
間違い等あればご指摘のほどよろしくお願い致します！
プリメイドAI（廉価版）をWindows10から動かす

# プリメイドAI（廉価版）をWindows10から動かす
## 初めに
人型のロボットは10万円以上するのが相場ですが、何故か2万＋消費税で「プリメイドAI」（※以下、AIちゃんと略す）が販売されています。
このAIちゃんは、Bluetooth 2.1 SPPプロトコルでスマホから専用アプリでコントロールできます。
ありがたいことに、このSPP上で流れているデータを解析した方がおり、専用アプリが無くてもターミナルソフトからコマンドを投げてAIちゃんを動かすことができるようになりました。

本稿では、初級編として、AIちゃんをWindows10から接続し、ターミナルアプリから動かすまでの手順を説明します。

## 注意
画面例は全て、Windows10 Home Edition　バージョン1809です。
リソースのURLは2019年7月6日現在のものです。将来、リンク切れが発生する可能性があります。

## １．Bluetooth 2.1ペアリング
### Bluetooth（Classic)の設定画面を開く
1．メニューバー右のアイコンを「左」クリックで表示される
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155377/4d05ba30-9660-4046-d22b-23dfe557b2ef.png)
2．Bluetoothデバイスを追加する
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155377/22bc4cc1-161d-6d83-84cc-f5df4e975eee.png)
3．+ボタンを押すと探査画面がでるので、画面の指示に従いデバイスを探査する
4．ロボットの電源を入れる
5．数十秒～数分で発見されるので該当のデバイスを選択
6．その後、ペアリングを促すダイアログが出るので接続ボタンを押す
7．数十秒で接続OK、設定中→設定完了のサイドメニューが更に数十秒後、表示される

## ２．COMポートの設定
### COMポートの番号を確認する
1．Bluetoothの設定画面の下のほうにある（解かりずらい）その他のBluetoothオプションを選ぶ
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155377/f48bf3ce-09e5-b981-22a0-2b5d756917e6.png)
2．「発信」になっているポートを使用する（この例、以降はCOM４であらわす） 
　　注意：この例では、名前をAI777に変更している
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155377/56e3ecfe-71c6-9ab3-db23-a8de2633f278.png)
### 使用するポートの詳細設定
1．デバイスマネージャを開き、「ポート（COMとLPT）」を探す
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155377/b2fe44e9-3c9d-7ba0-627b-16465ff8a4fb.png)
2．先ほど見つけておいたCOMポートのプロパティを表示する
3．ボーレート（ビット／秒）を115200に変更（他の項目はデフォルトのまま）
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155377/9246cba8-8060-2fa8-1aca-7a7dba52829d.png)

## ３．AIちゃん接続アプリのダウンロード
### AIちゃん接続用に特化したターミナルアプリを作成している方がいるので、ありがたく使わせていただく
1．以下から作成者に感謝しながらダウンロード
https://drive.google.com/file/d/1Oy_G2rJxmCQNNGJbNXCuu_6m60Sld17X/view
※インストール等はないため、適当なフォルダに解凍するだけでよい

なお、専用アプリではなく、シリアルポートをバイナリ（16進数）で入力できるターミナルソフトでもよいです。RealTermというフリーソフトで動くことを確認しています。

## ４．アプリ起動
### EXEファイルをエクスプローラにてダブルクリックして起動する
1．起動後、COM Portを設定（例ではCOM4）
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155377/a1f89a5d-09f1-0aa1-6438-3358d24a4f7d.png)
2．接続ボタンを押す（うまくいくと例のように接続中になる）

コマンドを解析されている方のURLを以下に示します。
https://docs.google.com/spreadsheets/d/1c6jqMwkBroCuF74viU_q7dgSQGzacbUW4mJg-957_Rs/edit#gid=0

## ５．注意
・Androidアプリと異なり、電池切れのアラームはないので動かし過ぎに注意（いきなりクッタリしてこける）。
・AIちゃんが壊れても、おそらく保障の対象にならないです。各自の責任の上で行ってください。

Happy hacking !!
プログラミング言語年表

|登場時期|プログラミング言語名|設計者や開発者など|
|:------------:|:------------:|:------------:|
|1958|[LISP](https://ja.wikipedia.org/wiki/LISP)|John McCarthy|
|1972|[C](https://ja.wikipedia.org/wiki/C%E8%A8%80%E8%AA%9E)|Dennis MacAlistair Ritchie|
|1972|[Prolog](https://ja.wikipedia.org/wiki/Prolog)|Alain Colmerauer|
|1975|[Scheme](https://ja.wikipedia.org/wiki/Scheme)|Guy L. Steele, Gerald Jay Sussman|
|1983|[C++](https://ja.wikipedia.org/wiki/C%2B%2B)|Bjarne Stroustrup|
|1984|[Common Lisp](https://ja.wikipedia.org/wiki/Common_Lisp)|ANSI X3J13委員会|
|1984|[Verilog](https://ja.wikipedia.org/wiki/Verilog)|Prabhu Goel, Phil Moorby, Chi-Lai Huang and Douglas Warmke|
|1986|[Erlang](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%AA%E3%82%AF%E3%82%BD%E3%83%B3)|Ericsson(スウェーデンの通信機器メーカー)|
|1987|[Perl](https://ja.wikipedia.org/wiki/Perl)|Larry Wall|
|1990|[Python](https://ja.wikipedia.org/wiki/Python)|Guido van Rossum|
|1990|[Haskell](https://en.wikipedia.org/wiki/Haskell_(programming_language))|Simon Peyton Jones,etc|
|1993|[Ruby](https://ja.wikipedia.org/wiki/Ruby)|まつもとゆきひろ|
|1995|[Java](https://ja.wikipedia.org/wiki/Java)|Sun->Oracle|
|1995|[PHP](https://ja.wikipedia.org/wiki/PHP_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))|Rasmus Lerdorf,etc|
|1997|[JavaScript](https://ja.wikipedia.org/wiki/JavaScript)|Brendan Eich|
|2000|[C#](https://ja.wikipedia.org/wiki/C_Sharp)|Microsoft|
|2003|[Scala](https://ja.wikipedia.org/wiki/Scala)|Martin Odersky|
|2007|[D](https://ja.wikipedia.org/wiki/D%E8%A8%80%E8%AA%9E)|Walter Bright,etc|
|2007|[Clojure](https://ja.wikipedia.org/wiki/Clojure)|Rich Hickey|
|2008|[Nim](https://ja.wikipedia.org/wiki/Nim)|Andreas Rumpf|
|2009|[Go](https://ja.wikipedia.org/wiki/Go_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))|Google|
|2010|[Rust](https://ja.wikipedia.org/wiki/Rust_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))|Mozilla|
|2011|[Dart](https://ja.wikipedia.org/wiki/Dart)|Google|
|2011|[Kotlin](https://ja.wikipedia.org/wiki/Kotlin)|JetBrains|
|2012|[Julia](https://ja.wikipedia.org/wiki/Julia_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))|MIT|
|2012|[Elixir](https://ja.wikipedia.org/wiki/Elixir_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))|José Valim|
|2014|[Swift](https://ja.wikipedia.org/wiki/Swift_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))|Chris Lattner|
|2014|[Hack](https://ja.wikipedia.org/wiki/Hack_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))|Facebook|
Django Girls Tutorialを復習する（２）　〜Djangoモデル〜

注意事項はこちら。
https://qiita.com/K-Kazutaka/items/1a432bda4f723e6757d6
写経用の記事です。



`~$ python manage.py startapp blog`
　＃新しいアプリケーションの作成
　＃アプリケーションをを作ったら、Djangoにそれを使うように伝えないといけません。↓↓に続く。
　

```mysite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
]
```

```blog/models.py
from django.db import models
from django.utils import timezone

class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title
```

　　Djangoドキュメント：モデルのフィールド・定義のやり方について (https://docs.djangoproject.com/ja/2.0/ref/models/fields/#field-types)


`~$ python manage.py makemigrations blog`
　＃データベースにモデルのためのテーブルを作成する

`~$ python manage.py migrate blog`
　＃Djangoが作ってくれた移行ファイルをデータベースに追加する

--------------------------------------------------------------------------
ここで行っていること。

・オブジェクトとは何か？の解説
・DjangoのデフォルトのデータベースはSQLiteです
・blogディレクトリの作成
・ブログポストモデルの作成（blog/models.pyにて）
Craft CMS で目次を作ってくれるプラグイン

HTMLをみて目次を作ってくれるプラグイン

> Table of contents
> https://plugins.craftcms.com/table-of-contents

テンプレートで書いてしまうと固定位置になってしまうのだけど、それで問題無い場合は使いやすそうな感じがする。
Raspberry PiにCamera Module V2をつなぐ

# 概要
Raspberry Pi(以降RPi)にカメラモジュールをつなぐ方法について記載。これについては検索すれば多くの情報があるけど、RPiのバージョンやカメラの種類によっても違う模様。思いの外手こずったので備忘録として。

# 環境
機体：raspberry pi 3 Model B
どの機種のRPiを使っているのかは、`cat /proc/cpuinfo  | grep Revision`で出てきた値（例：`Revision	: a32082`）を検索するとどのモデルかがわかる。

カメラ： Raspberry Pi Camera Module V2

OS: Debian 9.1
バージョンのチェックは`cat /etc/debian_version`。


# 取り付け
青い帯のある面をLANポート側に向けて挿入。終わり。（自分がみた情報では挿入方向が逆でちょっとハマった。）
![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148842/5a7bc4fc-7421-b29e-b7dc-90813afc4fdc.jpeg)

# カメラを有効化
[参考：Raspberry Piにカメラを接続](http://my-web-site.iobb.net/~yuki/2016-11/raspberry-pi/camera/)
`sudo raspi-config`で設定メニューを出して、Interaface Options>CameraでEnableにすればOK。
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148842/35dc29cd-f670-6a2c-ab28-10bfc9f4d0ba.gif)

そして再起動。

カメラが認識されているかどうかの確認は`vcgencmd get_camera`で。`supported=1 detected=1`と出力されていれば認識されてます。


おわり。
Git 作業流れ(通常一例)２

git 最新を新しいブランチで作る

````
git checkout develop                                <--　デベロップに切り替え
git pull                                            <--　最新に更新
git checkout -b feature/k_190706_fix origin/develop <--　新しいブランチ作成
````

更新後プッシュまで

````
git commit                                   <--　コミット
git push origin feature/k_190706_fix develop <--　プッシュ
````
JFreeChart-二次元分布チャート/XYChart


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import java.lang.reflect.InvocationTargetException;
import java.util.Random;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.DefaultXYItemRenderer;
import org.jfree.data.xy.DefaultXYDataset;
import org.jfree.data.xy.XYDataset;

/**
■ JFreeChart-二次元分布チャート/XYChart

・PlotはXYPlot、DatasetはDefaultXYDatasetを使用する.
・DefaultXYDatasetは以下のメソッドを持っている
  addSeries(java.lang.Comparable seriesKey, double[][] data)
    ・dataはdouble[2][N]
    ・[0][N]:xのデータ
    ・[1][N]:yのデータ
 */
public class Chart03_00 {
  // 目次-二次元分布チャート
  A_Chart03 a_chart03;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    Random ran = new Random();
    // グラフ名
    String[] names = new String[]{"A","B","C"};
    // DefaultXYDatasetを作成する
    DefaultXYDataset dataSet = new DefaultXYDataset();
    // DefaultXYDatasetを作成する
    for (int i=0; i<names.length; i++){
      final int SIZE = 20;
      double[][] data = new double[2][SIZE];
      for (int j=0; j<SIZE; j++) {
        data[0][j] = i*4+ran.nextInt(20);
        data[1][j] = i*2+ran.nextInt(10);
      }
      dataSet.addSeries(names[i],data);
    }

    // 軸を指定する⇒上下限は自動的に判定⇒明示的に設定もできる
    // 対数軸なども指定できる
    NumberAxis yAxis = new NumberAxis();
    NumberAxis xAxis = new NumberAxis();

    // レンダラーを指定する⇒色や形を自動的に設定する
    // グラフ(A,B,C)ごとにレンダラーを設定することもできる
    DefaultXYItemRenderer renderer = new DefaultXYItemRenderer();
    // (通常は)順番がないデータなので、線は引かない.
    renderer.setBaseLinesVisible(false);

    // Plotを作成する⇒XYPlotを使用する
    XYPlot xyPlot = new XYPlot((XYDataset)dataSet,(ValueAxis)xAxis,(ValueAxis)yAxis,renderer);
    // チャートを作成する
    JFreeChart jfreeChart = new JFreeChart("XYチャート",(Plot)xyPlot);
    // チャートを表示する
    ChartFrame cFrame = new ChartFrame("XYチャート",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }
}

```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/a2fc9cda-c44e-09d1-7e68-5ab4ac8ceb62.png)
おしゃれなjQueryのformをJavaScriptに書き直した

こちらのサイト
https://kodocode.net/design-css-textbox/　
で紹介されているフォームがかっこよくて、使おうと思ったのですが、
がっつりjQueryが使われていて、jQuery使うのはちょっと・・・
と思ったので、JSに書き直しました。

```html:index.html
 <link href='https://fonts.googleapis.com/css?family=Lato:300' rel='stylesheet' type='text/css'>
 <div id="inputs" class="wrap">
  <h1>Rise</h1>
  <h3>I built something similar as an engineer on Identity.com</h3>
  <div>
   <label for="fname">First Name</label>
   <input id="fname" type="text" class="cool"/>
  </div>                
  <div>
   <label for="lname">Last Name</label>
   <input id="lname" type="text" class="cool"/>
  </div>                  
  <div>
   <label for="email">Some Long Copy Goes Here</label>
   <input id="email" type="text" class="cool"/>
  </div>
 </div>
```

```css:index.css
body {
  font-family: 'Lato', sans-serif;
  color: white;
  background-color: teal;
}
h1 {
  font-size: 60px;
  margin: 0px;
  padding: 0px;
}
h3 {
  margin: 0px;
  padding: 0px;
  color: #999;
}

div.wrap {
  width: 500px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  vertical-align: middle;
}

div.wrap div {
  position: relative;
  margin: 50px 0;
}

label {
  position: absolute;
  top: 0;
  font-size: 30px;
  margin: 10px;
  padding: 0 10px;
  background-color: teal;
  -webkit-transition: top .2s ease-in-out, 
                      font-size .2s ease-in-out;
  transition: top .2s ease-in-out, 
              font-size .2s ease-in-out;
}

.active {
  top: -25px;
  font-size: 20px;
}

input[type=text] {
  width: 100%;
  padding: 20px;
  border: 1px solid white;
  font-size: 20px;
  background-color: teal;
  color: white;
} 

input[type=text]:focus {
  outline: none;
}
```

```js:main.js
    var fname = document.querySelector("#fname");
    var lname = document.querySelector("#lname");
    var email = document.querySelector("#email");

    fname.addEventListener('focus',(e)=>{
        e.target.parentNode.firstElementChild.classList.add('active');
    });
    fname.addEventListener('blur',(e)=>{
        if (e.target.value == "") {
            e.target.parentNode.firstElementChild.classList.remove('active');
        }
    });

    lname.addEventListener('focus',(e)=>{
        e.target.parentNode.firstElementChild.classList.add('active');
    });
    lname.addEventListener('blur',(e)=>{
        if (e.target.value == "") {
            e.target.parentNode.firstElementChild.classList.remove('active');
        }
    });

    email.addEventListener('focus',(e)=>{
        e.target.parentNode.firstElementChild.classList.add('active');
    });
    email.addEventListener('blur',(e)=>{
        if (e.target.value == "") {
            e.target.parentNode.firstElementChild.classList.remove('active');
        }
    });
```
プログラミングに最適な等幅フォント

## はじめに

プログラマなら誰しもが自分の使っているツールやキーボードの類いに強いこだわりがあるでしょう。
**そしてそれはフォントも例外ではないです。**

私に関して述べるとプログラミングのモチベの8割はフォントが支配しているといっても過言ではないです。
今回は**超個人的**にプログラミングにおすすめな等幅フォントを紹介していきたいと思います。

***2020/04/10 Ubuntu Mono と Rounded-X M+ 1m を追加しました。***

## [Ricty](https://www.rs.tus.ac.jp/yyusa/ricty.html)

英数字フォントに [**Inconsolata**](http://levien.com/type/myfonts/inconsolata.html)、日本語フォントに [**Migu 1M**](http://mix-mplus-ipa.osdn.jp/) が使用されています。
フォントの生成方法は[この公式サイト](https://www.rs.tus.ac.jp/yyusa/ricty.html)に記述されています。

余談ですが、昔 Windows を使っていて [**Ricty**](https://www.rs.tus.ac.jp/yyusa/ricty.html) がきれいに映らず困ったことがありました；；
現在は手元に Windows がないので確認はできないのですが、今もそんな感じなのでしょうか。
結局、[**Source Han Code JP**](https://github.com/adobe-fonts/source-han-code-jp) だか [**Ricty Diminished**](http://www.rs.tus.ac.jp/yyusa/ricty_diminished.html) を使っていた覚えがあります。。

## [Cica](https://github.com/miiton/Cica)

READMEの記述によると、

- 英数字、記号類に [**Hack**](https://sourcefoundry.org/hack/) + [**DejaVu Sans Mono**](https://dejavu-fonts.github.io/)
- その他に
    - [**Rounded Mgen+**](http://jikasei.me/font/rounded-mgenplus/)
    - [**Nerd Fonts**](https://github.com/ryanoasis/nerd-fonts)
    - [**Noto Emoji**](https://www.google.com/get/noto/)
    - [**Icons for Devs**](https://github.com/mirmat/iconsfordevs)

が使用されているとのこと。
日本語のフォントには [**Rounded Mgen+**](http://jikasei.me/font/rounded-mgenplus/) が使われていることになります。

これもかなりおすすめ。

## [Utatane](https://github.com/nv-h/Utatane)

英数字に [**Ubuntu Mono**](http://font.ubuntu.com/) 、それ以外のフォントに[**やさしさゴシック**](http://www.fontna.com/blog/379/)を使用しています。
やさしさゴシックはゆるふわ系で正直、かなり癖のあるフォントだが、その分ハマるやつにはかなりハマると思う。

## [Migu 1M](http://mix-mplus-ipa.osdn.jp/)

結局、[**M+ フォント**](http://mix-mplus-ipa.osdn.jp/mplus/) の系列が私にはあっているようです。
なので、[**Ricty**](https://www.rs.tus.ac.jp/yyusa/ricty.html) の日本語文字に使われているこのフォントを挙げないわけにはいかないでしょう。
プログラミング用途にこだわらないのであれば、この系列のプロポーショナルフォントもおすすめです。

## [Ubuntu Mono](https://fonts.google.com/specimen/Ubuntu+Mono)

[**Google Fonts**](https://fonts.google.com/) しか選べない環境でしばらく [**Ubuntu Mono**](https://fonts.google.com/specimen/Ubuntu+Mono) を使っていましたが、けっこういいと感じました。
先に挙げた、[**Utatane**](https://github.com/nv-h/Utatane) で使われています。***ただし日本語フォントはないのでご注意を。***

## [Rounded-X M+ 1m](http://jikasei.me/font/rounded-mplus/about.html)

[**M+ フォント**](http://mplus-fonts.osdn.jp/) の派生フォント。
個人的にはいまのところ日本語の等幅フォントはこれが一番、安心感を感じる。

## さいごに

あれこれ挙げさせてもらいましたが、結局は使っている OS やブラウザ、エディタなどの環境で表示がそれぞれ違って見えるのでどれが一番いいという超個人的な結論は出せないというのが結論です。

なんかいい感じにおすすめフォントまとめている[リポジトリ](https://github.com/tsunesan3/awsome-jp-coding-fonts)もあるようなので、気になったらみてみるといいでしょう。

ここまで推しておいてなんなのですが、**実は私いままで「フォントにこだわっているぜ！」っていう方とお会いしたことがありません。**単純に普段そーいった話になりづらいというのもあるとは思いますが、、

なのでそんなにこの記事に需要はないだろうと正直思いつつもいちいち環境構築するたびにどのフォント入れてたっけと思い出すのも億劫なのでここにメモることにしました。

また、フォントに興味がなんかないよという方も騙されたと思ってこれを気に一度試してみて！よろしく！ではノ〜
ホクホクのイモ by APL

# はじめに
@mattnさんの[ホクホクのイモ](https://qiita.com/mattn/items/d447a43ad12fada71663)を読んでこれってAPLだと簡単に書けるんじゃと思ってやってみました。

# GNU-APLによる実行例
![スクリーンショット 2019-07-06 2.14.00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935/e741e13c-a666-db68-a20f-402a013a691d.jpeg)

# 説明

　APLは読みづらいですが、やりたいことから少しづつ積み上げるようにすると書く方は楽なので順にやっていきます。

# 文字列
 APLでは文字列は1次元の配列で、各要素に1文字ずつ対応します。←は変数への代入で、A[数字]で要素を取り出すことができます。APLで配列の添字はデフォルトで1オリジンですが、0オリジンにすることもできます。添字は複数書いて添字の個数分の要素の1次元配列を作ることもできます。

```
    A←'ホクイモ'
    A[2]
ク
    A[4 3 2 1]
モイクホ
```

要素数は⍴で求められます。

```
    ⍴A
4
```

## 乱数
　文字列から重ならない任意の2文字を抜き出すため乱数を調べていたらちょうど使えそうなのがありました。n?m は1~mまでの数字から任意の重複しないn個の数字をランダムに取り出します。

```
    4?100
82 30 86 75
    4?100
78 46 28 63
```

そうすると、文字列の長さは⍴Aで添字の範囲は1~⍴Aなので、Aから任意の文字2個を取り出すには以下のようにできます。

```
    A[2?⍴A]
ホモ
    A[2?⍴A]
イホ
```

## 変形と連結
　これで任意の2文字を取り出せるようになりましたが、ホクホクのイモにするためには最初に取り出した2文字を繰り返す必要があります。⍴で1次元2要素の配列を1次元4要素の配列に変形します。変形する配列が大きい場合は元の配列の要素が繰り返して置き換えられます。

```
    4⍴A[2?⍴A]
モホモホ
```

　あとは 'モホモホ' 'の' 'イホ' みたいになるように連結すればOK。カンマで連結できます。

```
    4⍴A[2?⍴A],’の’,A[2?⍴A]
ホイのク
```

　あれ？なんかおかしい。APLは後ろから順に評価されるので、

```
    A[2?⍴A],’の’,A[2?⍴A]
ホイのクホ
```
から4要素の1次元配列が作られるような動作になっています。変形する配列が小さい場合は元の要素の先頭から適用され入りきれなかった要素はカットされます。
　括弧を使えばそちらから優先して評価されるので、意図通りにするには以下のように書きます。

```
    (4⍴A[2?⍴A]),’の’,A[2?⍴A]
ホイホイのクホ
```

## 関数定義
　最後に関数定義です。
実行モードで∇を入力すると定義モードになり、最初が関数名、続く文字が引数となります。
文番号が[1]のように表示されるので、内容を入力。定義モードの最後で∇のみを入力すると関数定義おわり。

※try-GNU-APLでは定義モードの文番号表示が最後にまとまって出力されるようです。


# 結論

```
    ∇IMO A
(4⍴A[2?⍴A]),’の’,A[2?⍴A]
∇

    IMO 'ホクイモ'
イクイクのホイ
    IMO 'ホクイモ'
イホイホのモホ
```

# 参考
[TryAPL](https://tryapl.org/) ※文字列に日本語使えません
[try-GNU-APL](http://juergen-sauermann.de/try-GNU-APL)

[情報処理入門シリーズ16 初めて学ぶAPL](https://www.amazon.co.jp/dp/4320023412/ref=cm_sw_r_tw_dp_U_x_CR4hDbGZ56XB0)
Vim script で画面に表示中の行番号だけ取得する

# 表示している範囲の行だけ欲しい
Vimで画面に表示している範囲の内容だけ欲しいので、表示している行番号のリストがとれればなーとか思ったのですが、なかなかスマートな取得方法に辿り着かなかったので、共有も兼ねて記しておきます。

## 何が問題か
```vimscript
echo getline('w0', 'w$')
```
上記のような`w0`、`w$`という便利な記法があるのですが、`w0`、`w$`を指定することで、表示されている一番上の行番号と下の行番号を指定することができるのです。

ですが、これで表示している範囲だけ取れると思って使っていると、折りたたみ(fold)があると不都合が起きます。

下記のような折りたたみがあるファイルでの結果は

```vimscript:test.vim
" vim: foldmethod=marker
                        
aaaa                    
                        
" {{{                   
                        
bbbb                    
                        
" }}}                   
                        
cccc                                      
```

(↓↓↓結果のスクショ。最下行が`echo getline('w0', 'w$')`の結果)
<img width="997" alt="スクリーンショット 2019-07-06 1.57.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73446/b62bdc59-85db-f6e6-066f-7d002081d114.png">

```vimscript:結果
['" vim: foldmethod=marker', '', 'aaaa', '', '" {{{', '', 'bbbb', '', '" }}}', '', 'cccc']
```

foldで非表示になっている内容も取れてしまうんですよね。これだと、折りたたみの行数が大きいほど無駄に内容取得されてしまって困っちゃいます。

（私はここで、`getline('w1')`、`getline('w2')`...と1行ずつ順番にアクセスしていけば、表示している内容だけ取れるのではと思ったのですが、`w0`が特別なだけで、w1、w2...なんてものは無いんですよね...うーむ。）

## 解決方法
ループしつつ`foldclosed()`、`foldclosedend()`を使って非表示行をスキップします。
`foldclosed()`は、もし引数の行番号が畳まれていた場合はfoldの開始行番号を返し、`foldclosedend()`は引数の行番号が畳まれている場合はfoldの終了行番号を返します。

ドキュメントはこちら
https://vim-jp.org/vimdoc-ja/eval.html#foldclosed()

サンプルを書いてみました。
行番号だけ欲しければ、`l:current_line`をよしなに使ってください。

```vimscript:サンプル
function! EchoDisplayedAll()
	let l:lines = []
	let l:current_line = line("w0")
	let l:end_line = line("w$")

	while 1
		if foldclosed(l:current_line) > 0
			let l:current_line = foldclosedend(l:current_line) + 1
		endif

		if l:current_line > l:end_line
			break
		endif

		call add(l:lines, getline(l:current_line))

		let l:current_line = l:current_line + 1
	endwhile

	echo l:lines
endfunction
```

先程のテキストでの結果は以下の通り。

(↓↓↓`call EchoDisplayedAll()`の結果)
![スクリーンショット 2019-07-06 2.28.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73446/e896f475-5482-62ca-b05d-79bac3d1b25a.png)

```vimscript:結果
['" vim: foldmethod=marker', '', 'aaaa', '', '', 'cccc']
```

これでVim scriptで表示されている範囲だけ取得することができました💪