OmniAICreator/Qiita-1.07M huggingface dataset:
統計学のための数学入門30講をひたすら解いてみる(第3講)

#第3講 順列・組合せと2項定理・多項定理
##3.1 順列と組合せ
###(3.1)

```math
\begin{align}
{}_n P_k &= n(n-1)(n-2) \cdots (n-k+2)(n-k+1) \\
&= n(n-1)(n-2) \cdots (n-(k-2))(n-(k-1)) \\
&= \frac{n(n-1)(n-2) \cdots (n-(k-2))(n-(k-1))(n-k) \cdots 2 \cdot 1}{(n-k)(n-(k+1)) \cdots 2 \cdot 1} \\
&= \frac{n!}{(n-k)!}
\end{align}
```

###(3.3)

```math
\begin{align}
{}_n P_n &= \frac{n!}{(n-n)!} \\
&= \frac{n!}{0!} = n!
\end{align}
```

```math
\begin{align}
{}_n P_0 &= \frac{n!}{(n-0)!} \\
&= \frac{n!}{n!} = 1
\end{align}
```

###(3.5)

```math
\begin{align}
{}_n C_n &= \frac{n!}{(n-n)!n!} \\
&= \frac{n!}{0!n!} = 1
\end{align}
```

```math
\begin{align}
{}_n C_0 &= \frac{n!}{(n-0)!0!} \\
&= \frac{n!}{n!0!} = 1
\end{align}
```

###問題3.1(1)

```math
\begin{align}
{}_8 P_3 &= \frac{8!}{5!} \\
&= 8 \cdot 7 \cdot 6 \\
&= 336
\end{align}
```

###問題3.1(2)

```math
\begin{align}
{}_8 C_3 &= \frac{8!}{5!3!} \\
&= \frac{336}{3!} \\
&= \frac{336}{3 \cdot 2 \cdot 1} \\
&= 56
\end{align}
```

###問題3.1(3)

```math
\begin{align}
{}_8 C_5 &= {}_8 C_{(8-3)!} \\
&= {}_8 C_3 \\
&= 56
\end{align}
```

###問題3.2(1)

```math
\begin{align}
(1+1)^6 &= {}_6 C_0 \cdot 1^6 \cdot 1^0 + {}_6 C_1 \cdot 1^5 \cdot 1^1 + \cdots + {}_6 C_5 \cdot 1^1 \cdot 1^5 + {}_6 C_6 \cdot 1^0 \cdot 1^6 \\
&= 2^6 = 64
\end{align}
```

###問題3.2(2)

```math
\begin{align}
\{1+(-1)\}^6 &= {}_6 C_0 \cdot 1^6 \cdot (-1)^0 + {}_6 C_1 \cdot 1^5 \cdot (-1)^1 + \cdots + {}_6 C_5 \cdot 1^1 \cdot (-1)^5 + {}_6 C_6 \cdot 1^0 \cdot (-1)^6 \\
&= {}_6 C_0 - {}_6 C_1 + \cdots - {}_6 C_5 + {}_6 C_6 \\
&= 0^6 = 0
\end{align}
```
【Python】pyenv pyenv-virtualenvの使い方

#インストールから基本的な使い方まで
##インストール
下記のコマンドを実行

```bash
$ brew install pyenv
$ brew install pyenv-virtualenv 
```

併せてPathを通す為に、~/.bash_profileに下記内容を追記する

```bash
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```

追記し終わったら　source ~/.bash_profile を実行し、環境変数を適用させる

##仮装環境作成
まずpyenvでpythonをインストールする
下記コマンドはpython 3.6.3をインストールする例

```bash
$ pyenv install 3.6.3
```

次に、pyenv-virtualenvで環境を区切る
下記コマンドでは、python 3.6.3 の piyoという名前の環境を作る

```bash
$ pyenv virtualenv 3.6.3 piyo
```

作成した仮装環境一覧は pyenv versions で確認できる

```bash
$ pyenv versions
* system(set by /Users/sample/.pyenv/version)
  3.6.3
  3.6.3/envs/piyo
  piyo 
```


##仮装環境適用
###現在のディレクトリに仮想環境を適用する場合

```bash
$ pyenv local piyo
```
環境が適用されたかどうかは pyenv version で確認できる

```bash
$ pyenv version
piyo (set by /Users/sample/.pyenv/version)
```


###全体の環境に仮装環境を適用する場合

```bash
$ pyenv global piyo
```

###一時的に仮装環境を適用する場合
```bash
$ pyenv activate piyo
```

###一時的に適用した仮装環境を外す場合

```bash
$ pyenv deactivate
```

###仮装環境をアンインストールする場合

```bash
$ pyenv uninstall piyo
```

##余談

local で環境を適用した場合、そのディレクトリに.python-version　というファイルができる。
その中に仮装環境名が記載されている。
Photos.frameworkでiCloud保存されている画像をロードできない問題の対応

これは [iOS Advent Calendar 2017](http://qiita.com/advent-calendar/2017/ios) 18日目の投稿です。
昨日17日目は[k0mach1](https://qiita.com/k0mach1)さんの[Firebase Authentication の idToken をサーバーの認証に使い自サービスのUserと紐づけた話（iOS編）](http://blog.machio.me/entry/2017/12/17/131825)でした。

# 想定機能

以下のような、アプリの1機能を考えます。

<img width="350" alt="Screen Shot 2017-12-18 at 18.43.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/78710/e11e1c05-78a4-f68f-de3d-2fe5734e8c4e.png">


* カメラロールから画像をロードし、UICollectionViewで表示
* 選択すると、上部のプレビューを表示
    * この時、オリジナル画像としてロードする
* オリジナルの画像を使って、次の処理に進む

# ハマりどころ

以下の複合要素でハマりました...

* iCloud設定の `iPhoneのストレージ最適化 (Optimize iPhone Strage)` をオンにしている
* オリジナルのサイズで取得するためのサイズ定数 `PHImageManagerMaximumSize` を指定

### iCloud設定の `iPhoneのストレージ最適化 (Optimize iPhone Strage)` をオンにしている

以下の `設定 > iCloud > 写真` でストレージの最適化オプションが選択されている時のことです。
<img width="350" alt="IMG_6074.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/78710/50d02a9c-8b28-624b-c188-14f96492908e.png">

この場合、request optionに以下を指定することで、iCloud上の写真も取得することができます。

```swift
let requestOptions = PHImageRequestOptions()
requestOptions.isNetworkAccessAllowed = true
```

しかし、これだけでは、次の条件の時に問題がまだ問題が残ります。
(逆に言うと、これだけで取得できていた条件もありました。)

### オリジナルのサイズで取得するためのサイズ定数 `PHImageManagerMaximumSize` を指定

`PHImageManagerMaximumSize` には、以下の説明が記載されています。

```swift
// Size to pass when requesting the original image or the largest rendered image available (resizeMode will be ignored)
@available(iOS 8.0, *)
public let PHImageManagerMaximumSize: CGSize
```

本来の画像を取得するには、元のサイズがわからないため、この定数を指定します。

## 何が問題だったか

今回のような要件をきちんと満たすためには、`isNetworkAccessAllowed = true`だけでなく、`progressHandler`の処理も必要でした。

今回惑わされた原因は、
**CollectionViewで表示している画像のように、サイズを指定してリクエストすると取得でき、サムネイル上は取得できているように見えてしまっていた点**
です。

そして、ストレージの最適化の対象となっている画像は、オリジナルでロードしてみるまで、見かけ上は判別できません。

# 回答

ということで、解決したコードです。

```swift
let requestOptions = PHImageRequestOptions()
requestOptions.version = .current
requestOptions.deliveryMode = .highQualityFormat
requestOptions.isSynchronous = false
requestOptions.isNetworkAccessAllowed = true
requestOptions.progressHandler = { [weak self](progress, error, stop, info) in
    print("Loading image from iCloud")
}
PHImageManager.default().requestImage(for: photoAsset.asset,
                                      targetSize: PHImageManagerMaximumSize,
                                      contentMode: .aspectFill,
                                      options: requestOptions,
                                      resultHandler: { [weak self](image, _) in
                                          guard let image = image else { return }
                                          self?.selectedImage = image
})
```

# まとめ
時間の制約のため、さらっとしかドキュメントを調べることができなかったのですが、 `Photos.framework` についての説明は少なく、stack overflowでも僅かな情報しか見つかりませんでした。
もし、この部分を網羅しているドキュメントを知っている方がいましたら、ぜひ教えてください。

# 参考
https://stackoverflow.com/questions/43114112/ios-photos-framework
全角を半角に変換する。(javascript)

業務中に全角から半角に変換する必要が出て来た。
少しでも、その作業が楽になればと思い色々調べて作ったので、メモ的に残す。

##動作
1. 「半角へ」ボタンを押す。
2. InputBoxが立ち上がる。
3. 前角英数字を入力する。
4. 「OK」を押す。
5. TextBoxに半角で出力される。

##コード
###html
```main.html
<html>

<head>
    <meta charset="utf-8" />
    <script src="zenkaku_hankaku.js"></script>
</head>

<body>
    <form name="form">
        <input type="textbox" id="input" value="" />
        <input type="button" onclick="box();" value="半角へ" />
    </form>
</body>

</html>
```

###Javascript
```zenkaku_hankaku.js
// InputBoxを起動。
function box(){
  // InputBoxをセット
  box = window.prompt('半角に変換したい文字を入力してください', '');

  // 空白だった場合
  if (!box) {
    window.alert('キャンセルされました');
    return;
  }

  //空白でなければ、半角へのプログラム実行。
  this.zenhan(box);
}

//半角へのプログラム
function zenhan(a){
  // 10進数の場合
  a = a.replace(/[Ａ-Ｚａ-ｚ０-９]/g, (s) => {
    return String.fromCharCode(
      s.charCodeAt(0) - 65248
    );
  });

  // 16進数の場合
  a = a.replace(/[Ａ-Ｚａ-ｚ０-９]/g, (s) => {
    return String.fromCharCode(
      s.charCodeAt(0) - 0xFEE0
    );
  });

  // TextBoxへ変換後の文字列を戻す。
  document.forms.form.input.value = a;
}
```

##参考
[JavaScriptで英数を全角/半角に変換する方法](https://qiita.com/yamikoo@github/items/5dbcc77b267a549bdbae)
[JavaScript で全角数字を半角に変換](http://surferonwww.info/BlogEngine/post/2017/09/24/convert-numeric-zenkaku-character-to-hankaku-by-javascript.aspx)
[入力ダイアログを表示する](http://www.tagindex.com/javascript/window/prompt.html)
日付をループするコマンド

データ分析やバッチ処理などをしていると、ある日からある日まで日付を辿りながらコマンドを実行したい時がよくあります。

シェルコマンドのワンライナーなら以下のような感じで書けます。

```shell
for i in {0..9}; do date -I -d "2017-11-28 + $i day"; done | xargs -I{} ./run-script {}
```

単純な場合はこれで十分ですが、例えば月曜日だけ実行したいとか、2017-03-03から2017-05-05までを実行したいけど間に何日あるかわからんとか、ちょっと困る場面もあります。

そんな時にちょっとだけ便利なコマンドを作ったので紹介してみます。

https://github.com/ojima-h/diter

#### インストール

バイナリをダウンロードするだけです。

```shell
curl -L https://github.com/ojima-h/diter/releases/download/v1.0.0/diter-1.0.0.linux-amd64 > diter
chmod +x diter
```

#### 使い方

`./diter START_DATE END_DATE` で、START_DATE から END_DATE までの日付を標準出力に流します。

```
$ diter 2016-01-01 2016-01-03
2016-01-01
2016-01-02
2016-01-03
```

第三引数以降にコマンドを実行すると、その期間の日付で繰り返しコマンドを実行します。

```
$ diter 2016-01-01 2016-01-03 -- echo date={}
date=2016-01-01
date=2016-01-02
date=2016-01-03
```

月曜日だけ実行したいなら `--wday=1`

```
$ diter 2016-01-01 2016-01-31 --wday=1
2016-01-04
2016-01-11
2016-01-18
2016-01-25
```

その他、逆順での列挙とか日付フォーマットの指定とか月１での実行などができます。
詳しくは README を参照してください。
jQueryでpostする時のHeaderをいじる（csrftokenの設定とか）

https://readouble.com/laravel/5.5/ja/csrf.html
https://stackoverflow.com/questions/7100294/json-post-with-customized-httpheader-fiel

LaravelでPostする時、デフォルト設定だとcsrf tokenをヘッダーに埋め込む。

基本マニュアル通りやればいいんだけど、何も考えずに設定するとjQuery全体に設定が効いてしまうので、外部APIとか叩く際にNGな事がある。

じゃあpostする時に設定すればいいや、となるんだが、`jQuery.post`だとヘッダーはいじれないので、`jQuery.ajax` でやるとOK。
PeerCast プログラミング配信 Advent Calendar 2017 18日目

今日やったこと
common lisp + ltk で放置系？クリッカー系？ゲームを作った・・・作った！

モゲコイン・・・自動で増えていく、育成ボタンを押すと１増える
モゲパワー・・・自動で増えていく、モゲコインでなにか買い物をすると増えていく速度が増加する。
これだけ
最終的にどんなゲームにしたいのかはっきりしていないが、それっぽい感じにはなっている気がする。

![Screenshot from 2017-12-18 23-19-04.png](https://qiita-image-store.s3.amazonaws.com/0/212979/7be3e663-8cbf-fcd9-47fd-477f206c118f.png)
.NET Coreメモ

.NET Core関連のメモ

## 開発環境

- https://qiita.com/katachi/items/7f9e1f721bdbe5380e45
 - ビルドツールのメモ

## ライブラリ

### ImageSharp

.NETCoreでは、GDI+やWindowsDrawingが使えないので、代替画像操作ライブラリ。

https://github.com/SixLabors/ImageSharp
コールバックとトランザクションの関係(rails/SQL)


#本記事の内容
- トランザクションとはなにか
- トランザクションの目的とは
- 単体の処理を行う場合
- 複数処理を行う場合
- ActiveRecordのコールバック処理とトランザクションの関係
  - おまけ 

*本記事ではrailsのトランザクションの記述方法は記載しておりません。
railsのトランザクション処理が行われたときに、どういったSQLが発行されており、処理の流れをまとめてあります。*

#トランザクションとは
コンピュータの処理の一連の処理のまとまりのことをいう。
一連処理がすべて上手く実行されたときのみ成功とし、逆に、トランザクション内のどこかでエラーが起こった場合はすべての処理が失敗されたものとする。

銀行の例を考えてみましょう。
AさんがBさんに3000円送金する場合を考えると、この処理は大きく2つに別れます。
>
1. Aさんの口座から3000円マイナスする
2. Bさんの口座に3000円プラスする

このときのシステムについて考えると、
1の処理が行われたあとにエラーが起こり2が実行されなかったとき、Aさんは口座から3000円引かれたのにBさんにもお金がプラスされません、ただ3000円が失われただけになってしまいます。

これでは困りますよね。
コレを防ぐためには**1と2の間でエラーが起こったときは1の処理もなかったことにする**必要があります。
こういった複数処理の中で1つでも処理が成功しない場合は、すべてをなかったことにする。といったように処理に一貫性を持たせることができるのがトランザクション処理です。


#トランザクションの目的とは
あるコードブロックにあるSQL文の変更を全部成功する事を守るためのものである。
Railsに置いては、**コードブロック内で例外処理が行われたときのみ**、すべての処理をロールバックする。


#単体の処理を行う場合
まずはトランザクション処理がどうのようにおこなわれるのか把握するために、単体の処理を行った場合どうなるか見ていきます。単体のトランザクション処理を行った場合は、以下のようにSQL文が作成されます。

```
BEGIN TRANSACTION    　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 #transactionの開始
    UPDATE TEST SET ID = '0001' WHERE ID = '0002';     #transaction内の処理を実行(今回はupdate)
COMMIT TRANSACTION   　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 #COMMITされた瞬間にtransaction内の処理が反映される
```



#複数処理を行う場合
今回は削除と保存の処理をrailsのトランザクション処理を行うと以下のようなSQLが発行されます。

```
BEGIN TRANSACTION　　　　　　　　　　　　　　　　　　　　　#transactionの開始
    DELETE~~~~~~~~~        #transaction内の処理1を実行(delete)
    SAVE ~~~~~~~~~~~       #transaction内の処理2を実行(save)
COMMIT TRANSACTION         #COMMITされた瞬間にtransaction1、2の処理が反映される
```

もしUPDATEが上手く行かずに例外処理を行った場合は、DELETEもなかったことになり、上記の処理すべてロールバックされて実行されていないことになります。

ここで注意するべきことがあります。
**railsのsaveなどのメソッドでは、失敗した時に例外処理を行わない**ということです。
saveメソッドは失敗時にエラーやfalseを返すため、ロールバック処理は行なわれません。なぜなら例外処理のみロールバック処理を行うからです。

もしrails側でsave、deleteの処理を順番で記述しトランザクションで囲っただけでは、saveでエラーが起こってもSQLはCOMMITまで進み、トランザクション内の処理が実効され、DELETEは上手く実行されているがSAVEがされない時に悲惨なことになります。

これを防ぐためには、Railsではびっくりマーク!がついているメソッドは、失敗したら例外をスローすると意図するので、transactionを使うときは、saveではなくsave!、destroyではなくdestroy!を使うべきでしょう。


#ActiveRecordのコールバック処理(save/destory)とトランザクションの関係
ActiveRecordにはbefore_saveやafter_destroyなどsaveやdestroy系のコールバックが複数定義されています。これらのコールバックはRailsでtransaction処理を記述しなくても自動でsaveなどのトランザクション処理の中に含まれます。

なぜこんな事が可能かというと、ActiveRecordには「あるmodelのcreateやupdateは、あるコントローラのcreateやupdateアクションからしか呼び出されない」という事を前提としてcollbackというものを定義しています。

なので「before_saveとか用意した書いてくれたら、勝手にtransactionの中に適宜処理を入れてあげるよー」といった事をactiverecordが実効してくれているのです。

そのためコールバックを用いた場合、発行されるSQLは以下のようになります。

```
BEGIN TRANSACTION
    ~~~~~~~~~~~~~~(before_saveの処理)
    SAVE ~~~~~~~~~~~
    DELETE ~~~~~~~~~
    ~~~~~~~~~~~~~~(after_destoryの処理)
COMMIT TRANSACTION
```

詳しくコールバックのメソッドを見たい方はこちらを参考にしてください。
https://qiita.com/rtoya/items/29cef3e328299781a328


###おまけ
実のところ「あるmodelのcreateやupdateは、あるコントローラのcreateやupdateアクションからしか呼び出されない事」というのは規模が大きくなってきたときにこのルールを守ることは困難になってきます。そんな時にcollbackを多用していると、callbackに条件分岐などを書くことになったりすることになり、コールバックというものの定義を無視したものになってきます。個人的には、開発を続けるサービスに置いてbefore_saveなどのコールバックはあまり書かない方がいいかもしれないなと思っております。


#参考文献
https://www.sejuku.net/blog/27240
https://qiita.com/huydx/items/d946970d130b7dabe7ec
スクレイピング結果をRSS形式にしておく

スクレイピングにも色々あって、クローラにガーッとデータを一気に抜いてきてもらう場合もあれば、IR情報など、更新をウォッチしたいサイトに定期的にクロールするという場合もあると思います。

今回は後者のときのための話です


## TL;DR

- 日毎のスクレイピングという場合、更新情報の管理が必要になって面倒
- スクレイピング結果をRSS形式にしておくようにしたら、その辺の手間がなくなって嬉しかった


## 更新情報をとってくる

例えばニュースサイトで新しい記事が出てきたらその内容を取得したい。
という場合、以下の手順が必要になります

1. ニュースサイトの一覧画面からスクレイピングして記事のリストをとってくる
1. 記事が未知のURLか、既知のURLか判定
1. 未知のURLだったら処理する

これはこれでやれば良いのですが、 `記事が未知のURLか既知のURLか判定` という手順が意外と面倒臭かったりします。なぜならこの判断をするには、既知のURLが保存されているストレージが必要だからです。ストレージを管理するということはどこかが状態を持つということで、まあなんというかサクッとやりたい場合は面倒臭いです。


## RSSにしてみる

そもそも更新情報というのはRSSの専売特許だと思ったので、
ニュースサイトの記事一覧をRSS形式にするスクリプトを書きました

- [gist.github.com/sakamossan/feed.py](https://gist.github.com/sakamossan/9b5e7ccdb47c8f7e5d7eeac5a5207011#file-feed-py)

処理はこれだけです

- 設定ファイルにURLを定義しておいてhtmlを取得
- 設定ファイルに書いておいたCSSセレクタで、情報を抜き出してxml(RSS)にする
  - タイトル (title)
  - URL (link, guid)
  - 更新日時 (pubDate)
- 作成したxmlファイルをパブリックなS3に置く

設定ファイルをいろいろ書いてherokuで1日1回動かしていますが、今の所いい感じです


## よかったところ

### ストレージ不要で楽になった

先述のニュースサイトをスクレイピングする例だと、
RSSにしてみた場合の処理はこんな感じです

1. ニュースサイト記事一覧をRSS形式にしてS3に配備
1. そのURLをRSSアグリゲータ(zapier)に監視してもらう
1. 未知の記事が現れたときに、zapierがwebhookをくれる
1. 通知イベントを受け取ってなんか処理

ストレージ不要で同じことが出来てラクですね :tada:

余談ですがzapierはRSSアグリゲータもwebhookも超柔軟に設定出来て便利ですね

- [Explore All Integrations | Zapier](https://zapier.com/apps/integrations)


### スクレイピング結果のデータ形式、仕様があると楽

これは副次的なものなのですが、RSSのようにきちんとした仕様があるデータ形式は楽です。
なぜならデータをどう保存するか自分で考えなくても済むからです。

スクレイピングしたデータをjsonとかsqliteとかcsvとか色々な形式で取っておくかと思うのですが、これを迷わなくなりました。RSS(xml)一択です。また、仕様に色々なデータ属性もあるので、基本的に目についたものに従っておけば過不足ありません。

RSSの仕様がどんなものかは次のサイトが良かったです。

- [RSS 2.0 Specification 日本語訳 - futomi's CGI Cafe](http://www.futomi.com/lecture/japanese/rss20.html)


### 連携しやすい

RSSは古くからある仕様なので連携できるサービスも豊富です。
(zapier, ifttt, slack, feedly ...)

それに大体のスクリプト言語にはRSSを扱うためのモジュールがあります。
その気になればtd-agentからbigqueryに投げたりとか

- [harukasan/fluent-plugin-rss: Fluent plugin to fetch RSS feed](https://github.com/harukasan/fluent-plugin-rss)

そんなこと誰もしないと思いますけど、まあデータがポータブルなのはいいことです。


## まとめ

- スクレイピング結果をRSSにしておくと便利でした
- 枯れてる仕様ってのはありがたいですね
- htmlをRSSにするスクリプトなんて超簡単なのでオススメです
  - 自分でスクリプト書くと仕様が自分で決められるの楽しいですね
[Xamarin.Forms]ListView・TableViewのセル高さの更新（iOS）

# はじめに

この記事は [[初心者さん・学生さん大歓迎！] Xamarin その1 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/xamarin-student) の18日目の記事です。

Xamarin.FormsのiOSでListViewやTableViewは1.3.4からセルの高さを自動調節してくれるようになりました（だいぶ前の話）。ですが、BindingしているItemの値がかわったときなどに、セルの高さが動的に更新されてくれません（Androidでは勝手にセル高さが変わってくれます）。

ListViewでよく出てくるパターンなのにベストプラクティスがよくわからなかったのでまとめてみました。

# ForceUpdateSize()を呼ぶ

Xamarinの公式[sample](https://developer.xamarin.com/samples/xamarin-forms/UserInterface/ListView/DynamicUnevenListCells/)を見るとセルの高さを計算し、HeightRequestを設定してForceUpdateSize()を呼んでいます。

```csharp

image.HeightRequest = image.Height + 100;
viewCell.ForceUpdateSize ();

```

Forms側だけで書けるので、シンプルです。

ただし、ForceUpdateSize()がTableViewでは効かなかったり、セル内にカスタムレンダラやEffectでちょっと複雑なことをしていたときに不安定なことがあります。これでつまずいていたときに他の方法を教えてもらいました（[参考](https://teratail.com/questions/100766)）。↓

# iOSのカスタムレンダラーでReloadData()を呼ぶ

セルの高さがかわる瞬間にiOSのカスタムレンダラーでReloadData()を呼んでやるとリフレッシュされます。

まずはListViewを継承したクラスを作り、Rendererへの橋渡しの準備をします。

```csharp

    public class ResizableListView : ListView
    {
        public event EventHandler<EventArgs> DataChanged;

        public void OnDataChanged()
        {
            var handler = this.DataChanged;
            if (handler != null)
            {
                handler(this, EventArgs.Empty);
            }
        }
    }

```

次に先ほど作ったDataChangedイベントをカスタムレンダラーでハンドルしてReloadData()を呼んでやります。

```csharp

public class ResizableListViewRenderer : ListViewRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
    {
        base.OnElementChanged(e);
        if (e.OldElement == null)
        {
            ((ResizableListView)e.NewElement).DataChanged += (object sender, EventArgs args) => { Control.ReloadData(); };
        }
    }
}

```

あとは、Formsのセル高さを変更したいタイミングで、作ったListViewのカスタムクラスのOnDataChanged()メソッドを呼び出してやるだけです。

TableViewでも同じことができます。TableViewの継承クラスを作り、TableViewRendererを継承したカスタムレンダラーでReloadData()を呼びだすだけですので全く同じです。

# まとめ

Forms側だけで簡潔に書けるので、ForceUpdateSize()で試してみて、うまくいかなかったらカスタムレンダラーのReloadData()を呼ぶようにしてみたらよいかと思います。他にもいいやり方があればコメント欄にて教えてください。
C言語にif～elseif～else構文なんて無かったことに今更ながら気が付いた件

# お恥ずかしながら

普段、コードを書く上でC言語の条件分岐で出てくるelse ifはRubyでいうところのelsifと同じととらえても問題になることが無かったため、6年以上C言語（とC++）を書きながら、今更else ifの意味を理解しました。

# 本題

## 始まりは中括弧の省略

```C
if(条件式) {
    then節;
} else {
    else節;
}
```

という文はelse節の内容が1行だったら、中括弧を省略して

```C
if(条件式) {
    then節;
} else else節;
```

って書けますよね。

要は

```C
if(hoge == piyo){
    fuga = 1;
}else{
    fuga = 2;
}
```

を

```C
if(hoge == piyo){
    fuga = 1;
}else fuga = 2;
```

って書けるってことです。

## ということは…

```C
if(条件式) {
    then節;
} else {
    if(条件式) {
        then節;
    } else {
        else節;
    }
}
```

は

```C
if(条件式) {
    then節;
} else if(条件式) {
        then節;
    } else {
        else節;
    }
```

と書けることになります。

インデントを調整すれば

```C
if(条件式) {
    then節;
} else if(条件式) {
    then節;
} else {
    else節;
}
```

というおなじみの形になりますね。

# 雑なまとめ

C言語ってifとelseしかなかったんだ、へ～。わざとインデントをつけないことで逆に見やすくなってて面白いなー。
VisualStudioCode上でc++の標準入出力（素人）

#この記事について
vscodeで競プロ環境を整えようと思い、拡張機能であるRunnerを使ってvscode上で入出力をできるようにしました。
備忘録として書いておきます.
###注意
・素人による記事なので信用しないで下さい。
・間違っている可能性がありますので騙されないようにして下さい。

#実行環境
Ubuntu16.04LTS（デュアルブート上）
VisualStudioCode　1.19.0

#準備
・vscodeのインストール
・C/C++,Runnerの拡張機能のインストール
・g++のインストール


#Hello　World
普通に実行する場合
>Ctrl + Shift + Bを押す
ビルドタスクの構成→tasks.jsonの作成
もう一度Ctrl+Shift+Bを押せばoutファイルが作成される
そして実行

ここでtasks.jsonは自分の環境に合った内容を書き込む。
C++の場合は以下のソースコードとなる。一応公式サイト貼っておく。
>
```java:tasks.json
{
    "version": "0.1.0",
    "command": "g++",
    "isShellCommand": true,
    "showOutput": "always",
    "args": ["-g", "main.cpp"]
}
```


[公式](https://vscode-doc-jp.github.io/docs/languages/cpp.html)

***しかし、こんな面倒なことは毎回したくない！***
ということで、本題へ
###C++の標準入力
Runnerを使えばVscode上で出力可能になる。
今回はinput.txtから入力される値を渡して出力させる。

まずはshファイルを作成
>
```cppio.sh
#!/bin/sh
chmod a+x /home/username/Documents/cppio.sh
g++ -o out $1
./out < /home/username/Documents/mytask/input.txt
rm out
```        
そこからユーザー設定に以下を上書き
>
```~/.config/Code/User/settings.json
{
    "runner.languageMap": {
        "cpp": "/home/username/Documents/cppio.sh"
    }
}
```
以上が終われば後は
*ctrl+shift+R*でinput.txtを読み込み結果が出力される。

はずだったがエラーが出てきた。
>
```
/bin/sh: /home/username/Documents/cppio.sh: Permission denied
Exited with status 126
```

以下のページで解決策を見つけた
https://qiita.com/dockurage/items/49e7295e7ff7458e26cd
それをTerminalに打ち込んで無事出力完了した。
が…
わざわざterminalにコマンドを打たないと（新規ファイルを作る場合）上のエラーが出るため多少の面倒臭さは残った。
この面倒臭さの解消法はあると思うのですが、疲れたのでこの辺で．．．
【C言語】if文についての考察

# OutLine
* if()とは？
* コンパイルエラーで見落としを無くす

## if()とは？

C言語のif文において、[if文の誤解](https://qiita.com/Ratty27/items/c142412bc6114e2f5c4c) より、以下のような認識であると思います。

```c
  if( 真または偽 ) {}
```

しかし、実際は、、、、

```c
  if( 条件式 ){
    //else以外
  } else {
    //0である時
  }
```

です。

trueが実行される部分は、0以外になります。
**つまり、1以上、-1以下になります。**

**※ただし、Java等はbooleanの判定になるため、マイナスは使用できません。**

## コンパイルエラーで見落としを無くす
ベテラン社員でも見落とすif文の書き方についてです。

```c
 #define SENSOR_STATUS  1
 int StatusChange = 1;
 if(StatusChange = SENSOR_STATUS){
   //処理
 }
```

### あれ？パッと見、合ってんじゃね？

間違ってますよぉぉぉ。
何が間違っているのか、それはイコール(=)が1つしか無いんです。
よくやる間違いなのですが、これ、コンパイルしても気づかないんですよねー。

### 推奨する書き方
```c
 #define SENSOR_STATUS  1
 int StatusChange = 1;
 if(SENSOR_STATUS == StatusChange){
   //処理
 }
```
この書き方の場合、もし、イコール(=)が1つであったとしても、コンパイルエラーとなり、実行する前に気づくことができます。
(VBとかだと、イコール(=)が1つなので注意！！)
定数に代入はできないからね。

## 参考
https://qiita.com/Ratty27/items/c142412bc6114e2f5c4c
OpenFOAM自動ビルドスクリプトinstallOpenFOAM


スーパーコンピュータのように管理者権限が無いシステム上で，指定したバージョンのOpenFOAMと，依存するソフトウェアを自動的にソースからビルドしてインストールするbashスクリプトです．

ドキュメントをレポジトリのREADMEに統合しましたので，詳細はオープンCAE学会のGitリポジトリのREADME( https://gitlab.com/OpenCAE/installOpenFOAM/blob/master/README.md )を参照ください．
docker UIの導入

![download-4.png](https://qiita-image-store.s3.amazonaws.com/0/165019/51d33564-df79-a852-328d-8a328a11a438.png)

最近dockerの素晴らしさに気付き、様々なイメージをpullしてはコンテナを上げまくっている。
個人で動作確認するだけならdocker run, ps, stop, rm etc...といったコマンドだけで事足りるが、dockerの運用規模が大きくなるとCUIベースで運用や監視をするのは厳しいかもしれない。
また、dockerに精通していないエンジニアも直感的にコンテナの落とし上げ等の操作ができると嬉しい。

そこで、DockerUIを導入し、使用感をまとめてみる。

## DockerUIの導入方法
dockerイメージのpull & run。簡単！

```bash
docker pull kevan/dockerui
docker images # kevan/dockeruiが問題なくpullできていること

# 9000番ポートで起動
docker run -d -p 9000:9000 --name dockerui -v /var/run/docker.sock:/var/run/docker.sock kevan/dockerui
```

## ブラウザでアクセスしてみる
localhost:9000でブラウザにアクセスしてみると、、、

![スクリーンショット 2017-12-18 22.28.01.png](https://qiita-image-store.s3.amazonaws.com/0/165019/c62e1abe-3094-7578-7728-9bd285107a4f.png)

ダッシュボードが表示されました！起動コンテナ数の推移状況なんかも表示されるんですね。
試しにRunning Containersから適当に一つ選択してみます。

![スクリーンショット 2017-12-18 22.41.37.png](https://qiita-image-store.s3.amazonaws.com/0/165019/342f1b5e-ead9-1919-30b5-2b26ea33c336.png)

おぉ！ここでStopやKillコマンドが発行できるようですね。直感的でわかりやすい。

「Containers」をクリックしてみると、現在のコンテナ一覧が表示されます。
![スクリーンショット 2017-12-18 22.33.46.png](https://qiita-image-store.s3.amazonaws.com/0/165019/9a0164d8-2bbf-6376-9b5c-6758a9cb939b.png)

「Containers Network」はと言うと、、
![スクリーンショット 2017-12-18 22.44.22.png](https://qiita-image-store.s3.amazonaws.com/0/165019/9006ccb1-eba5-2738-2a07-4f353f84587e.png)

何やらアロー図が表示されています。
RocketChat(SlackのOSS版)を使っているのですが、DockerComposeでdbと連携させています。

「Images」はホストOSに現在登録されているDockerイメージの一覧が表示。
![スクリーンショット 2017-12-18 22.39.38.png](https://qiita-image-store.s3.amazonaws.com/0/165019/0b190984-ee2d-b02e-1ce8-2e305fc48b9d.png)

## まとめ
特に凝った作りではないですが、UIが直感的にわかりやすく、操作しやすい印象を受けました。
今後ますます人気になっていきそうなdockerですが、企業で導入する場合はこのようなUIツールを活用して運用していくといいかもしれませんね。
複数のgitアカウントを使用する場合

仕事とプライベートとで別々のGitアカウントを使用する必要が出てきた際に、プライベートと仕事での開発とで環境を切り替えがわりと面倒だったので、今後迷わないように記録する。

# アカウントの新規作成(ざっくり)
　**1. 新しいメールアドレスでGithubアカウントを作る**
　**2. sshキーを作る**
~/.ssh/conifgファイルに下記の様なフォーマットで秘密鍵のパスを指定する。

```
Host github
  HostName github.com
  IdentityFile ~/.ssh/main_rsa
  User git
  Port 22
  TCPKeepAlive yes
  IdentitiesOnly yes

Host github-sub
  HostName github.com
  IdentityFile ~/.ssh/sub_rsa
  User git
  Port 22
  TCPKeepAlive yes
  IdentitiesOnly yes

# github-subとgithubは任意
# IdentityFileのファイル名も任意
```

**3. 接続確認**
`ssh -T <HOST>`と打つとssh接続ができるか確認できる。
接続が完了すると下記の様なレスポンスが返ってくる。
>Hi takuyama29! You've successfully authenticated, but GitHub does not provide shell access.

(エラーっぽいけどエラーじゃないから大丈夫)

**4. remote url設定**

```
git remote add origin git@github.com:<ACCOUNT_NAME>/<YOUR_REPSITORY>.git
```

**5. ターミナルのアカウント切り替え**

```
$ git config --global user.name "<YOUR_NAME>"
$ git config --global user.email <YUOR_EMAIL>
```

これで新しいアカウントの追加が出来てめでたしめでたし。

# 困ったこと
困ったのはここから。
このまま元のGitアカウントに戻って作業してpushとかするとエラーになる。

> ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

"リポジトリはあるけど、アクセス権が無いよ"

と言われて困る。
この事象の原因は2つある。

## 1. Githubユーザーが違う
ターミナルで設定されているGithubアカウントが意図しているものと異なっている。

現在設定されているアカウント情報は`$ git config --list`で一覧表示することが可能。
その中の`user.name`と`user.email`が新しいアカウントのままになっていることが今回の事象の原因の一つ。

そのため、本来は開発作業をするアカウント別にCLIの設定も変更する必要がある(↓コレ)。

```
$ git config --global user.name "<YOUR_NAME>"
$ git config --global user.email <YUOR_EMAIL>
```
これを毎回切り替えるのは面倒なので、せめてコマンドで切り替えたい。

大した知識もないため、一旦shellコマンドとして利用するためにrcファイルに下記を追記した。

```
function tomain() {
  git config --global user.name "<MAIN_ACCOUNT>"
  git config --global user.email <MAIN_ADDRESS>
}

function tosub() {
  git config --global user.name "<SUB_ACCOUNT>"
  git config --global user.email <SUB_ADDRESS>
}
```

これで`$ tomain`と`$ tosub`でひとまずアカウントの切り替えができる。
※もっとちゃんとしたやり方があると思うので、知っている方はご教示いただければと！

## 2. remote urlのHost名が重複している
これも微妙に気づくのに時間がかかった。
冒頭で書いた~/.ssh/configファイルの追記内容。

```
Host github
  HostName github.com
  IdentityFile ~/.ssh/main_rsa
  User git
  Port 22
  TCPKeepAlive yes
  IdentitiesOnly yes

Host github-sub
  HostName github.com
  IdentityFile ~/.ssh/sub_rsa
  User git
  Port 22
  TCPKeepAlive yes
  IdentitiesOnly yes
```

これだと微妙に困ったことになる。

```
$ git remote add origin git@github.com:<ACCOUNT_NAME>/<YOUR_REPSITORY>.git
```
した時に、`HostName`がどちらも`github.com`なので、configファイルの下部に定義されたものが有効になってしまう。

この場合だと、Githubへ接続する際には、毎回`IdentityFile ~/.ssh/sub_rsa`を参照してしまうので、メインアカウントでの接続の際に秘密鍵と公開鍵の整合性が合わなくなるからだ。

そのため、remote urlを設定する際には、Host名が重複しない様に設定する必要がある。

**メイン**

```
$ git remote add origin git@github:<ACCOUNT_NAME>/<YOUR_REPSITORY>.git
```

**サブ**

```
$ git remote add origin git@github-sub:<ACCOUNT_NAME>/<YOUR_REPSITORY>.git
```

上記の様に~/.ssh/configファイルで設定したHost名別に分けてremote urlを設定すればOK

これ系のちょっとした環境設定とかは頻度も少ないので、少しずつ記録として残していきたい。
他人の作ったソースコードを引き継いで修正するというよくある業務で気をつけてほしいと思っていること

この記事は [Wanoグループ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/wano-group)の16日目の記事になります。

## 前置き

業務でプログラムを書いていると、他の人が書いたソースコードに、バグ対応やちょっとした機能追加の依頼がくることは日常茶飯事だと思います。そのような場面で、常日頃気をつけてほしいと思っていることを書きたいと思います。個人的なワガママということになりますが、きっと共感してくれる人も多いと思います。

目的はソースコードのメンテナンス性を下げないためです。

バカバカしいほど簡単なことなので、対象読者は業務でプログラムを書き始めたばかりの新人プログラマとなるのですが、想像以上にソースコードの保守性を下げる対応を目にすることが多く、もしかするとそれ以外の人にも役に立つことがあるかもしれません。

ちょっとアバウトですが前提条件として以下のようなプロジェクトを想定しています。

* 実稼働フェーズに入っている等で大胆なリファクタリングが困難

つまり、影響範囲をなるべく限定して、ちょこちょこっと修正するような場面です。

## 一貫性

それで、気をつけてほしいと思っていることがどんなことかというと、

**「ソースコードの一貫性を保つ」**

これだけです。
もちろん、他にも気をつけないといけないことはたくさんあるでしょうが、とにもかくにも、まずはこれです。

## もう少し詳しく

ソースコードの一貫性を保つということがどういうことかを説明する代わりに、そのために具体的に気をつけるポイントをあげてみます。

1. 命名方法
2. モジュール粒度

1.は変数などの名前の付け方です。プロジェクトによってはクラス名や関数名の命名規則が決められていることもよくあるでしょうけど、ブロック内だけで使うような変数についても、ここでは該当します。`for`文で数をカウントアップするような時は、`for (int i=0;`のように`i`を使うならそれを徹底しましょう、とかそういう話です。

2.はわかりやすい例だと、クラスや関数に分ける判断基準についてです。開発者の個性が出てしまいがちな部分ですが、周囲のソースコードをよく見て、そこにうまく馴染むようなモジュールを追加することを優先しましょう、という話になります。

これらについて、既存のソースコードと一貫性が保たれているか？というのが気をつけるポイントになります。

## なぜソースコードの一貫性を保つようにしてほしいのか

あとからソースコードが読むのに、余分な労力と時間がかかるようになってしまうからです。

ある程度経験を積んだプログラマーがソースコードを読む時、よほど複雑なロジックにでもなっていない限り1行ずつあるいは1文字ずつ追っていったりしません。あたかも速読術でよく言われるようなやり方で、ソースコードの塊を見てそこで行われている処理を**まとめて**時には**予測しながら** 次々と読み進めていきます。

その状態で周りと違う雰囲気の記述がなされていると「うん？」と立ち止まって書いてあることを精査する必要が出てきてしまいます。変数の名前の付け方が違うだけで、このようなことになってしまいます。

## 最後に
プロジェクトの規模が大きくなればなるほど、そもそも場所によって一貫性が保たれていないということもよくあるでしょう。それでも、一貫性を保つということを心がけて欲しいのです。ソースファイル内、関数内、もっと細かく言えばそのブロック内においてだけでも、なるべく既にそこにある流儀にしたがって、あとからそのコードを読む人が苦労しないか？ということに思いを馳せながら。
RaspberryPi 3(Stretch) でAWS Greengrass のチュートリアルをやるときのメモ

AWS Greengrass[チュートリアル](http://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/gg-tutorial-rpi.html)をRaspberry Pi 3(Stretch)で実践するに当たって、ハマったところのメモです。

# RaspberryPiにSDカードを挿す前にすること

以下の`/Volumes/boot`はMacの場合です。Windowsの場合は、そのままbootという名前でディスクが見えていると思います。

## ネットワーク設定

SDカードにイメージを書き込んで`/Volumes/boot`に`ssh`というファイルを作成した後、同じく`/Volumes/boot`に`wpa_supplicant.conf`を作成します。
こちらのツールを使うと簡単にファイルを作成することができます。
[Raspberry Piの無線LANをmicroSDで簡単に設定するためのツールを作った](https://qiita.com/mascii/items/a43d71572e1919e56398)

## cmdline.txtの修正（ハマりどころ）

`/Volumes/boot/cmdline.txt`に`cgroup_memory=1`を追記します。

```
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=37665771-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh cgroup_memory=1
```

これをしないと、GreengrassCoreを起動するときに、runtime.logこのようなエラーが発生して起動できません。

```
Started all system components
Deployment agent connected to cloud
Started Deployment Agent and listening for updates
Started Deployment Agent and listening for updates
Runtime execution error: unable to start lambda container. container_linux.go:259: starting container process caused "process_linux.go:345: container init caused \"process_linux.go:286: setting cgroup config for ready process caused \\\"no such directory for memory.limit_in_bytes\\\"\""
failed to start worker: container_linux.go:259: starting container process caused "process_linux.go:345: container init caused \"process_linux.go:286: setting cgroup config for ready process caused \\\"no such directory for memory.limit_in_bytes\\\"\""
Runtime failed to start: post-start check failed, error: a check has timed out, check
```

参考：[Greengrass v1.1.0 ARMv7l runtime execution error](https://forums.aws.amazon.com/thread.jspa?threadID=264348)

上記Forumの議論で`sudo apt-get install --reinstall raspberrypi-bootloader raspberrypi-kernel`が出てきますが、これはやらなくても大丈夫でした。

## 必要なファイルを入れておく（Optional）

チュートリアルの中で、Greengrasscoreと証明書類をSCPでRaspberryPiに送るという手順がありますが、これらのファイルを`/Volumes/boot`に入れておくと、起動後のRaspberryPiの`/boot`にこのファイルが残っているので、ちょっと楽できます。

# 残りの手順

後は、チュートリアルのページ通りに進めるだけです。
matplotlibでグラフを描く

## はじめに
授業のレポートとかでmatplotlibを使ってグラフを描くときがあるんですが、毎回やり方を忘れちゃうんですよね。
毎回ググるのが面倒臭いので、自分用にテンプレートを作ってみました。

## グラフを描くスクリプト
```python3
# ライブラリのインポート
from matplotlib import pyplot as plt
import random

# 新しいウィンドウにグラフを作成
plt.figure(1)

# プロットするデータを用意
x = [i for i in range(1, 31)]  # x座標の値のリスト (1〜30)
y1 = [random.randint(0, 10) for i in range(1, 31)]  # y座標の値のリスト1
y2 = [random.randint(0, 10) for i in range(1, 31)]  # y座標の値のリスト2
y3 = [random.randint(0, 10) for i in range(1, 31)]  # y座標の値のリスト3

# グラフにデータをプロット
plt.plot(x, y1, label='curve1', color='red', linestyle='solid', linewidth=1.0)
plt.plot(x, y2, label='curve2', color='blue', linestyle='dashed', linewidth=1.5)
plt.plot(x, y3, label='curve3', color='green', linestyle='dotted', linewidth=2.0)

# 軸の調整
#plt.xscale('log')    # 対数目盛を使用
plt.xlim([10, 30])  # 軸の範囲を指定

# グラフに情報を表示
plt.xlabel('x')  # x軸のラベル
plt.ylabel('y')  # y軸のラベル
plt.legend(loc='lower right')  # 汎例
plt.grid(True)  # グリッド線

# グラフの描画を実行
plt.show()
```

上のスクリプトを使ってみるとこんな感じに。(何じゃこりゃ)
![スクリーンショット 2017-12-18 22.37.25.png](https://qiita-image-store.s3.amazonaws.com/0/146361/adf9a26d-9ae9-8b7e-bc84-062df11cccca.png)

## おわりに
matplotlibって綺麗にグラフ描けるのは良いんですが、融通が効かなくって何か苦手です。ってなわけで結局Excelに頼りがちに…。
まあ慣れの問題なんですかねぇ(遠い目)
初心者による初心者の為のWebサーバ解説

#Webサーバとは

Webサーバについて基礎的な概要をまとめます。

###・Webサーバーとは何か？
技術的に言えば、以下の2つの条件を満たすパソコンを指します。

条件１： **固定的なグローバル[IPアドレス](http://www.pc-master.jp/internet/ip-address.html)**を割り当てられて、インターネットに**常時接続**されている。
条件２： apache（アパッチ）などの**サーバーソフト**がインストールされ、**起動中**である。

###・条件１　固定的なグローバルIPアドレスとは
まず条件１の「固定的なグローバルIPアドレス」について少し掘り下げます。

世の中にはたくさんのパソコンがあります。
その全てがインターネットでつながるのだから、
各パソコンを識別するためのIPアドレスが同じではいけません。
IPアドレスが分からなければ、データ通信は不可能でメールも届きません。
![サーバ.png](https://qiita-image-store.s3.amazonaws.com/0/223196/0bc3d94c-52b6-f34a-37dd-c7d3f16fb70b.png)
なので他のパソコンからそのWebサーバとするパソコンに接続するのに
常に決まったIPアドレスでないと接続が出来ません。
したがってWebサーバとなるパソコンは
自分専用のグローバルIPアドレスを独占していなければなりません。

###・条件２　サーバソフトについて
続いて条件２のサーバソフトについて紹介しようと思います。

「コンピュータ、ソフトがなければただの箱」と言われているらしいが、これはサーバも同様。
サーバは他のコンピュータに何らかのサービスを提供するコンピュータで、
このサービスを提供する為のソフトウェアを、「サーバアプリケーションソフト」といいます。
一般的には、「サーバソフト」とか「サーバアプリ」などと略して呼ばれることが多いです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223196/df57d01a-a6fa-ce51-486b-0382db1bdd57.png)


よく使われるサービスの例として以下のようなものがあり、

1. ファイル共有
2. プリンタ共有
3. 電子メール
4. Web
5. [FTP](https://www.sejuku.net/blog/9985)
6. 掲示板
7. ブログ

基本的な役割は以下になります。

1. Webサイトの閲覧者によるリクエストに応じて、Webサーバに保管中のデータを表示する。
2. CMSの場合などでは、データベースサーバとの間に入り、リクエストの応答を行う。（CMS … Webサイトの制作に必要な専門知識を必要とせず、テキストや画像などの情報を入力するだけで、サイト構築を自動的に行うことが出来るシステム）
3. 必要に応じて、Webサーバ内の保管データを保護して、アクセス制限を行う。
4. Webサイトにドメインでアクセスできるように、別の専用サーバと連携をとる。
5. Webサイトの閲覧者が間違ったリクエストを送った場合は、それが間違った指示であることを伝えてリクエストのやりなおしを促す。

最後にWebサーバソフトを少しご紹介したいと思います。

・[Apache HTTP Server](https://httpd.apache.org/)
・[IIS](https://www.iis.net/)
・[Nginx](https://nginx.org/en/)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223196/0ad99b97-9446-ac48-3084-78f3b385290e.png)


Apache HTTPD Serverはもっとも使われているオープンソースのWebサーバソフトウエアで聞いたことがある方も多いかと思います。
しかし最近は大規模システムを中心に比較的最近になって登場したNginxがシェアを伸ばしていたり、
WindowsのシステムではIIS自体の信頼性もあり、その分野でのシェアは大きくなっています。

また詳しく各Webサーバソフトの特徴や最近のトレンドなどについての記事も掲載できたらと思います。

**まとめ**
基礎的な内容ということもあり、調査していて様々な記事が点在していて「ここも書きたい。あれも説明したい。」など思うところもありましたが、あまり冗長になることを避けるよう努めました。
見やすい読みやすいを意識した記事を書ければと思います。

**参照サイト**
[今更聞けない！Webサーバーの仕組みと構築方法](https://eng-entrance.com/web-server-mechanism)
[世界で最も人気のwebサーバーソフト、Apacheとは](https://ec-orange.jp/ec-media/?p=17628)
[ApacheかNginxか迷ったときに見るページ](https://www.out48.com/archives/1576/)
コンソールゲーム制作 第1章 描画(3)

##前回
[コンソールゲーム制作 第1章 描画(2)](https://qiita.com/selector828/items/a1d8793fea19ba5490bd)
前回はコンソールでゲームを作るなら`WriteConsoleOutput`が適切であるという結論が出たので今回はその使い方を説明します。

#WriteConsoleOutputの使い方

この記事ではそんなに細かくは解説しないので、わからない場合は下記リンクでご確認ください。
[MSDN - Write Console Output](https://msdn.microsoft.com/ja-jp/library/cc429851.aspx)

```c++:writeconsoleoutput.h
BOOL WriteConsoleOutput(
  HANDLE hConsoleOutput,      // スクリーンバッファのハンドル
  CONST CHAR_INFO *lpBuffer,  // データバッファへのポインタ
  COORD dwBufferSize,         // コピー元バッファのサイズ
  COORD dwBufferCoord,        // コピー元長方形の左上隅のセル
  PSMALL_RECT lpWriteRegion   // 書き込み先長方形
);

```

第一引数：スクリーンバッファハンドル
・自分で変更していなければ標準のハンドルをGetStdHandle(STD_OUPUT_HANDLE)で取得できます。
第二引数：データバッファへのポインタ
・自分で用意した画面の大きさ分のセル情報の配列（例：画面サイズ100x20の場合、CHAR_INFO[20][100]の配列へのポインタを使用する)
・上で用意した配列の大きさですが、COORD型なのでX,Yで表します。上記と同じの場合はCOORD(X=100,Y=20)になります。
第三引数：コピー減長方形の左上隅のセル
・書き込みのスタート座標です。左上からスタートしたい場合はCOORD(X=0, Y=0)になります。
第四引数：書き込み先長方形
・上のスタート位置から長方形のエリア作ってそのエリア内で書き込みます。用意してきたセル分丁度書き込みたい場合はSMALL_RECT(left=0, top=0, right=99, bottom=19)になります。

実際のソースコード

```c++:main.cpp

HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CHAR_INFO ci[20][100] = {};
COORD buffer_size = { 100, 20 };
COORD start_coord = { 0, 0 };
SMALL_RECT sr = { 0, 0, 99, 19 };

WriteConsoleOutput(handle, (CHAR_INFO*)ci, buffer_size, start_coord, &sr);

```

呼び出し自体はこれでできますが、一番重要なのは画面に表示する内容が格納されているCHAR_INFOの配列です。

```c++:char_info.h

typedef struct _CHAR_INFO {
  union {
    WCHAR UnicodeChar;
    CHAR  AsciiChar;
  } Char;
  WORD  Attributes;
} CHAR_INFO, *PCHAR_INFO;

```

`UnicodeChar`, `AsciiChar`, Attributesの３要素が入っていますが、プロジェクトの設定が`マルチバイト`文字か`Unicode`文字かで利用されるものは変わります。`Unicode`なら`UnicodeChar`、`マルチバイト`なら`AsciiChar`です。
今回は`マルチバイト`で行きます。

`AsciiChar`は`CHAR型`になっているので`１バイト文字`が一文字入ります。(例：'a', 'c', '*', '-'...)
そしてAttributesには色の情報が入りますがWORD型です。コンソールに設定されている色を確認するにはコンソールのプロパティを確認します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174660/63238716-e44f-2b75-4675-588fc6a5abf4.png)
色は自由に変えられますが、`同時に`利用できるのが１６色です。
それぞれの色は番号を持っていて、左から0~15です。
Attributesには文字の色だけではなく背景色も一緒に入っていて４ビットずつ使っています。
なので設定する際は背景色は色番号*16、文字色は色番号になります。
（例：文字-黄(15)、背景-赤(5)の場合は 5 * 16 + 15 = 95になります。)

左上のセルに緑背景、青文字の'B'を表示したい場合は

```c++:
ci[0][0].AsciiChar = 'B';
ci[0][0].Attributes = 6 * 15 + 7;
```

になります。

#次回
以上がWriteConsoleOutputの解説です。
このままではチラつきのない描画は可能ですが、扱いが面倒くさいので次回はprintfに近い感覚で
WriteConsoleOutputを使った描画ができるようにプログラムを組みます。

ありがとうございました。
[UE4] Construction Script と Instanced Static Mesh

## Construction Script とは

Construction Script はアクターがインスタンス化された際に、一度だけ実行されるスクリプトです。
Event Graph の Begin Play はゲームを再生しないとスクリプトは実行されませんが、Construction Script はエディターに配置した状態で実行されるので、ブループリント内で配置したメッシュをレベルエディタ上で確認できるという違いがあります。

Construction Script を利用して、手軽にプロシージャルなレベル作成が行なえます。
今回はシンプルなメッシュを並べるブループリントアクターを作成してみます。


## ブループリント作成手順

### ブループリントクラスを作成し、コンポーネントを追加する
**Instanced Static Mesh コンポーネント** を追加します。
![add_component.png](https://qiita-image-store.s3.amazonaws.com/0/1083/53932303-2c70-40d2-ec71-0b44644cefaa.png)

### メッシュを設定する
**Instanced Static Mesh コンポーネント** にメッシュを設定します。
今回はスターターコンテンツに入っている **SM_Chair** を設定しています。
![set_static_mesh.PNG](https://qiita-image-store.s3.amazonaws.com/0/1083/b7fb38b0-9767-4748-4652-c5b5cda04a0b.png)

### Construction Script にノードを定義する
#### 変数
- NumInstances: Integer
- InstanceMargin: Vector

追加した変数の右端にある目のマークをクリックするか、詳細パネルの**インスタンス編集可能(InstanceEditable)** にチェックを入れて、アクターの詳細パネルに変数をエクスポートします。

![construction_script.png](https://qiita-image-store.s3.amazonaws.com/0/1083/23303f38-c0b5-48f6-498c-0ae1f5fa464b.png)

このブループリントは、*0 ~ `NumInstances`* 回 ***index*** の値を **`+1`** しつつ、***`InstanceMargin * index`*** をポジションとして、***InstancedStaticMesh*** をコンポーネントに追加します。

### レベルに配置する
作成したブループリントをレベルに配置し、詳細パネルの **デフォルト** タブから、エクスポートしたパラメータを入力すると、***InstanceMargin*** の方向に ***NumInstance*** 分のイスが配置される。
![level.png](https://qiita-image-store.s3.amazonaws.com/0/1083/46d2f669-822e-d584-88e1-5f173819c692.png)

基本的にブループリントで出来ることは Construction Script でも出来るので作り方次第で色々できる。

##### 並べたり
![isu.PNG](https://qiita-image-store.s3.amazonaws.com/0/1083/09756fab-b477-ad85-4b79-01f52177773c.png)
<details><summary>ブループリント</summary><div>
![isu_bp.png](https://qiita-image-store.s3.amazonaws.com/0/1083/7d724881-019e-e6b8-6133-79eb07cd8b1a.png)
</div></details>

##### 螺旋状にしたり
![curve.PNG](https://qiita-image-store.s3.amazonaws.com/0/1083/9bfd2dfb-8c1f-34fb-0ecb-a0363b1f1cda.png)
<details><summary>ブループリント</summary><div>
![curve_bp.png](https://qiita-image-store.s3.amazonaws.com/0/1083/de3634d3-2f60-28fe-17d4-457e3e8e0d32.png)
</div></details>


## Instanced Static Mesh について

Instanced Static Mesh は同じメッシュを 1 DrawCall で出力する。
レベルビューで Static Mesh をコピーして配置した場合、コピーした分だけ DrawCall が増える。

DrawCall はコンソールコマンド ***`Stat SceneRendering`*** で確認できます。
*Stat SceneRendering* で表示される **Mesh draw calls** と **Static list draw calls** の違いはよく分かりません。

### Static Mesh で並べてみた
Static Mesh でイスを４つ並べてみました。
デフォルトレベルは、何も置かない状態で *`DrawCall = 4`* なので、イスの *DrawCall* は *`2`* となります。

![char_1.png](https://qiita-image-store.s3.amazonaws.com/0/1083/f0c01a0f-85fa-282a-58ff-6365fe940c64.png)

イス４つ分の *`DrawCall = 8`* が積まれていることが分かります。
![char_4.png](https://qiita-image-store.s3.amazonaws.com/0/1083/d74ef868-9077-b433-dee7-5d2e45e955c5.png)

### Instanced Static Mesh で大量に並べてみた
イスの数を変えても *DrawCall* は一定値。
![char_menyのコピー.png](https://qiita-image-store.s3.amazonaws.com/0/1083/404986de-87c8-e188-1570-c82e2eae65fb.png)

## まとめ

Construction Script と Instanced Static Mesh を積極的に使っていきましょう。
promiseそしてgeneratorからのasync awaitへ

#はじめに
この記事はHameeアドベントカレンダー19日目の記事です。
https://qiita.com/advent-calendar/2017/hamee


firebaseのデータの取得をする上でthenチェーン地獄を経験し、generatorそして
async awaitまで学んだのですごくザックリとまとめてみました。
promiseを知らない方はこちらがとても参考になりましたので、
読んでみてください。
[JavaScript Promiseの本](http://azu.github.io/promises-book/)


#firebaseでのデータ取得
firebaseなどの非同期リスナー型で値を取得しさらにその取得した値をもとに再度値を取得なんてやってると下記のようにずらずらとthenチェーン地獄になってしまう。
firebaseでのデータ取得方法は割愛しますので[ドキュメント](https://firebase.google.com/docs/database/admin/retrieve-data?hl=ja)読んでください！
*firebaseはpromiseオブジェクトを返してくれる。
#thenチェーン地獄
```js:thenチェーン地獄
asyncA()
 .then((asyncA_value) => {
    return asyncB(asyncA_value)
 }).then((asyncB_value) => {
    return asyncC(asyncB_value)
 }).then((asyncC_value) => {
    return asyncD(asyncC_value)
 }).then((asyncD_value) => {
    return asyncE(asyncD_value) 
 }).then((asyncE_value) => {
    console.log(asyncE_value)
 })
```
ぐぬぬ。チェーン化できるのは良いが見づらい。なんとかしたい。

#generatorとco
そこでES6で導入されたgenerator関数と[co](https://github.com/tj/co)というライブラリを使うとthenチェーン地獄は以下のように記述することができます。

```js:generator
const co = require('co')
co.wrap(function* () {
 const asyncA_value = yield asyncA()
 const asyncB_value = yield asyncB(asyncA_value)
 const asyncC_value = yield asyncC(asyncB_value)
 const asyncD_value = yield asyncD(asyncC_value)
 const asyncE_value = yield asyncE(asyncD_value)
 console.log(asyncE_value)
})
```
とっても読みやすい！
yieldを使うとgenerator関数の実行をpromiseの解決を待ち、解決された値(reject or resolve)を返すまで一時停止してくれるので、for文や条件判定文なども同期的に記述することができます。
しかし、非同期構文の進化はこれで終わりではありません。

#async/awaitの登場
なんとES7よりasync/awaitという非同期構文のシンタックスシュガーが実装されました。
このasync関数とawait演算子を使用するとcoライブラリでwrapしてgenerator関数を使った際の挙動と同じように、await演算子によりasync functionの実行を一時停止し、promise の解決を待ち、その後、async function の実行を再開し、解決された値を返してくれます。
*await演算子はasync関数内でしか使えません。

```js:async_function
async sample () {
 const asyncA_value = await asyncA()
 const asyncB_value = await asyncB(asyncA_value)
 const asyncC_value = await asyncC(asyncB_value)
 const asyncD_value = await asyncD(asyncC_value)
 const asyncE_value = await asyncE(asyncD_value)
 console.log(asyncE_value)
}
```
またpromiseがrejectされた場合、await演算子は理由となった値をスローしてくれます。
なので以下のような記述で呼び出し元はエラーをキャッチすることができます。

```js:await/catchパターン
const async_value = await sample().catch(err => {
 console.log(err)
})

```
#おわりに
いかがでしたでしょうか？
thenチェーン地獄から今はasync awaitまでなんとかたどり着き、楽しく非同期処理を扱えてます。
JSはReactNativeやlambda functionで使えるし、人気のある言語なのでこれからはより深く学んでいこうと思います。
ご一読ありがとうございました！

#参考サイト
[async関数においてtry/catchではなくawait/catchパターンを活用する](https://qiita.com/akameco/items/cc73afcdb5ac5d0774bc)
練習用分析データが無ければ、オープンデータを使えばいいじゃない！

・PowerBIで色々遊びたいけど、活用しやすいデータが手元にない。
・社内データを使う敷居が高いので、気軽に勉強できない

と、お困りも方もいらっしゃるのではないかと。

ということで、手元にいいデータが無くても、
オープンデータを中心に無料で利用できるサイトを色々紹介。
…あまりPowerBI関係ないw


#１　Data.go
[![thumbnail](https://qiita-image-store.s3.amazonaws.com/0/165789/625e610f-79f1-6873-22b1-3859a6b209d9.png)](http://www.data.go.jp/)
日本のオープンデータカタログサイト。
中央省庁が保有する行財政や経済、環境、観光、気象など、あらゆる分野の統計情報が格納されています。
残念ながら、格納されているデータはすべてが機械判読できるデータではないので注意が必要です。

#２　e-stat
[![thumbnail](https://qiita-image-store.s3.amazonaws.com/0/165789/fc6a00ab-61d3-7b22-2927-4ca9d7645332.png)](https://www.new.e-stat.go.jp/)
政府統計のポータルサイト。
上記Data.goよりもデータ量は豊富です。
ただし、ダウンロードできるデータのほとんどは人が見やすいデータの表示形式。
ETLの技術が試されます。（練習には最適かもw）

#３　RESAS
[![thumbnail](https://qiita-image-store.s3.amazonaws.com/0/165789/bd991485-1f25-4d72-0349-0668f2062a61.png)](https://resas.go.jp/)
地域経済分析システム、略してRESAS。
地方創生をテーマとして、地方自治体単位の様々なデータが可視化できるサイトです。
本来はブラウザベースで手軽に可視化できることが売りですが、
ビジュアル単位で元データをダウンロードすることも可能です。
こちらでダウンロードできるCSVデータは比較的取り込みやすく整形されています。


#４　DATA.GOV
[![thumbnail](https://qiita-image-store.s3.amazonaws.com/0/165789/53f4b65a-4c51-0d31-70d4-ba6bd0807e9c.png)](https://www.data.gov/)

アメリカのオープンデータカタログサイトです。
こちらもデータ読み込みしやすい形式としにくい形式のデータ混在していますが、
日本よりは比較的整備されている印象。
PowerBI関係無いですが、オープンデータ使ったアプリケーションの紹介なんかもあります。

---
上記までで記載したData.goやe-stat、RESAS、DATA.GOVは、いずれもAPIを提供しています。
手作業でCSVをダウンロードしてもいいですが、操作慣れていればAPI経由のPowerQueryを書いてもいいかもしれません。

PowerBIでAPIを実装する方法は以下記事と、コメントで記載されています。

[【PowerBIメモ】RESAS APIとRを使ってデータセットを作ってみる](https://qiita.com/h_kobayashi1125/items/b0e4da501398c1cc0cdc)

---

#５　Kaggle
[![thumbnail](https://qiita-image-store.s3.amazonaws.com/0/165789/6d910407-1773-ca58-254e-61e9fc4b6cd0.png)](https://www.kaggle.com/)
データサイエンス業界では知らない人がいないコンテストサイト、kaggle。
データサイエンティストが腕を競い合い、情報交換をする場ですが、
様々なデータセットが格納されており、アカウント登録をすれば誰でも使うことが可能です。
バラエティに富んだデータを可視化できるのはとても魅力的。



#６ DeepAnalytics
[![thumbnail](https://qiita-image-store.s3.amazonaws.com/0/165789/d2d7d1d4-af3e-db7f-623a-43001fa3da63.png)](https://deepanalytics.jp/?tc=menu)
日本版のKaggleと言うべきサイト。
Kaggleほどデータセットが豊富ではないですが、サンプルコンテストのデータはいつでもダウンロードできます。



#７　UCI Machine Learning Repository
[![thumbnail](https://qiita-image-store.s3.amazonaws.com/0/165789/46ec01d9-5b6e-bd08-315c-1a836a2616f0.png)](http://archive.ics.uci.edu/ml/index.php)

カリフォルニア大学アーバイン校が公開している機械学習用のサンプルデータセット。
おおよそ400のデータセットが公開され、誰でも使用可能になっています。
PowerBIで扱うにはあまり適していないデータもありますが、
多くのデータは、可視化・分析のいい材料になりそう。

---

#おわりに
PowerBIを練習するにはまずはデータの用意から。
MicrosoftのサンプルデータでももちろんOKですが、
自分でデータ選択して可視化してみるのも面白いですね。

なお、ここに記載したサイトのデータ利用にあたっては、各サイトのデータ利用規約等を守ってください。
CoffeeScript で n を与えて 1からn までの配列を作る

JavaScript の `Array.from({length: 4}, (_, i) => i+1)` みたいなことがしたくて、CoffeeScript で作る場合どうするか考えてみた。

```coffee
coffee> [1..4]
[ 1, 2, 3, 4 ]
```

・・・。

ちなみに、大きな数値や変数の場合は即時関数で配列を動的に作るコードに変換されます。

### 元ネタ
JavaScript で n を与えて 1からn までの配列を作る
https://qiita.com/seteen/items/7b62ccebb05e1980d0a0
Docker導入で、pepperアプリをpythonだけで開発できる!?

# Dockerをダウンロードする。

### macの方

`brew install docker`

でDockerを入れてください。
homebrewが入っていない方は、
https://brew.sh/index_ja.html
から、brewコマンドをインストールすることができます。

### windowsの方(動作未確認)
以下のurlからDockerをダウンロードしてください。
https://docs.docker.com/docker-for-windows/install/

また、以下のurlも参考になると思います。
http://www.atmarkit.co.jp/ait/articles/1609/01/news053.html

Dockerをインストール出来ましたら、コマンドプロンプト上で
Dockerが使えるか確認してください。



#Dockerを使って、pepperアプリをpythonで開発しよう。

以下のリンク
https://drive.google.com/open?id=1r2wSk3DzXuB8GXhYND2WcCuXcrI3W0Fe
からpythonSDKが入っているubuntuベースのコンテナをダウンロードすることができます。
ダウンロードが完了したら、pepper_python.tarを保存したディレクトリに移動して、

`docker load < pepper_python.tar`

`docker run -it e6ccbf4e08fa /bin/bash --login`

で起動します。

ターミナル(コマンドプロンプト)で、pythonを起動してください。

`import qi`

でエラーが出なかったら、成功です。

<img width="1200" alt="スクリーンショット 2017-12-18 19.38.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/211722/131614c5-f2b0-4638-cd17-292e10b93e9e.png">

#日本語入力したい方へ (追記 H29. 12/24)

`docker run -it e6ccbf4e08fa /bin/bash --login`
でpythonSDKが入ったコンテナに接続して、
`apt-get install language-pack-ja-base language-pack-ja`
で日本語パッケージをインストールしてください。
その後、環境pathを設定が必要なため
`vi ~/.bashrc`
で、任意の行に
`export LANG='ja_JP.UTF-8'`
を追加してください。
そして、
`exit`
と入力してコンテナを停止させます。
最後に、コンテナ名がわかりにくいので、コンテナ名を変更します。
`docker rename <CONTAINER ID> <NEW NAME>`
私はpy_SDKという名前にしました。次から、
`docker start NEWNAME`
`docker exec -it <NEWNAME> /bin/bash --login`
で、日本語入力ができる状態で起動します。
<img width="480" alt="スクリーンショット 2017-12-24 17.22.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/211722/305b8dd9-1274-d2ce-73fb-8f88a9153842.png">

何か質問等がございましたら、コメントよろしくお願い致します。
by アトリエスタッフ
HSP3.5 HGIMG4 でイベント待ちを制御する

# event_wait の引数に -1 を指定する

HSP3.5 HGIMG4 の event_wait の引数として、待ちフレーム数を指定する代わりに -1 を指定すると、work の x成分を参照して待ちフレーム数を決定するようになります。これによって1種類のイベントを作成しておきオブジェクトごとに work の x成分を変えることで動作を変えることができます。
また event_wait に -1 を指定し、その参照先である work の x成分に -1 を指定すると無限に待つ動作となります(多分)。

work の x成分にフレーム数を指定して同じイベントで異なる時間待つサンプルコードは以下のようになります。

```hs
#include "hgimg4.as"

	gpreset
	setcls CLSMODE_SOLID, 0x000033

// イベント1種類
	newevent ev
	event_addpos ev, 0.1, 0,0
	event_wait ev, -1

	repeat 5
		gpbox id, 10, 0x00cc33
		setpos id, -20, double(2 - cnt) * 12.0, 0
		setwork id, (cnt + 1) * 120, 0, 0
		setevent id, ev
	loop

	repeat
		getreq fps, SYSREQ_FPS
		
		redraw 0
		gpdraw
		pos 16,16
		color 224,224,224
		font "",48
		mes strf("%2d [fps]", fps)
		redraw 1
		await 1000/60
	loop
```

|実行結果1-1|
|:-:|
|![z10wait1.png](https://qiita-image-store.s3.amazonaws.com/0/213145/c03ac990-553d-b497-948f-46cb3af6794c.png)|
|5つのボックスが右へ移動|

|実行結果1-2|
|:-:|
|![z10wait2.png](https://qiita-image-store.s3.amazonaws.com/0/213145/f2428885-3eef-f797-dcce-5c8abd122528.png)|
|右へ移動しつづけるフレーム数が異なる|

次のサンプルは無限フレーム待ちにして左クリックするごとに次の動きに続く動作です。

```hs
#include "hgimg4.as"

	gpreset
	setcls CLSMODE_SOLID, 0x000000

	newevent ev
	event_addpos ev, 0.1, 0, 0
	event_wait ev, -1

	event_setwork ev, -1, 0, 0
	event_addpos ev, 0, -0.1, 0
	event_wait ev, -1

	event_setwork ev, -1, 0, 0
	event_addpos ev, -0.1, 0, 0
	event_wait ev, -1

	event_setwork ev, -1, 0, 0
	event_addpos ev, 0, 0.1, 0
	event_wait ev, -1

	event_setwork ev, -1, 0, 0
	event_jump ev, 0


	gpbox id, 10, 0x00ccff
	setpos id, -14, 14, 0
	setwork id, -1, 0, 0
	setevent id, ev

	repeat
		getreq fps, SYSREQ_FPS

		stick key
		if key & 256 {
			setwork id, 0, 0, 0
		}
		
		redraw 0
		gpdraw
		pos 16,16
		color 224,224,224
		font "",48
		mes strf("%2d [fps]", fps)
		redraw 1
		await 1000/60
	loop
```

|実行結果2|
|:-:|
|![z10wait3.png](https://qiita-image-store.s3.amazonaws.com/0/213145/acaefd8a-c1c6-3fe7-6060-604bfb96edea.png)|
|左クリックするごとに移動方向が変わる|

このサンプルでは左クリックするごとに work の x成分 を 0 にして event_wait の待機を解除しましたが、他にもなにかの条件判定を満たしたとき(自キャラがある地点に到達した、など)にイベント動作を次へ移行するような使い方ができます。

# 参考

HSP3.5 hgimg4 を基礎から理解したい方は以下の記事がとてもおすすめです。

* [Hot Soup Processor Advent Calendar 2017 の17日目: HSP3.5 で hgimg4 （再）入門](https://qiita.com/exrd/items/3fa31353df396ef53312)