OmniAICreator/Qiita-1.07M huggingface dataset:
axlsxでグラフを書いたときの落とし穴2つ

Rubyからxlsxを出力するためのライブラリとして、[randym/axlsx](https://github.com/randym/axlsx)があります。これはグラフ描画にも使える…のですが、2箇所ほどハマりました。

## 余計なもの（次元）がついてくる

axlsxで作れるグラフは、以下の種類があります。

* `AreaChart`…面グラフ
* `BarChart`…棒グラフ
* `Bar3DChart`…3D棒グラフ
* `BubbleChart`…バブルチャート
* `LineChart`…折れ線グラフ
* `Pie3DChart`…3D円グラフ
* `ScatterChart`…散布図

となっていて、どういうわけか円グラフが3Dのしかありません。3D円グラフの利点は[目の錯覚を活かせること](https://www.cresco.co.jp/blog/entry/950/)ぐらいしかないので、まっとうな用途ではできれば使いたくありません。

どうしようかと調べていたところ、[`rot_x: 90`と指定することで90度回転させて、真上を表示するようにする](https://groups.google.com/forum/#!msg/axlsx/ljl0a0iJHeM/XJXoChppucwJ)という、コロンブスの卵的、あるいは富豪的な解決法がありました。

## 順番が合わない

どうにか円グラフも作れるようになったところで、今度は棒グラフを作っていたのですが、予想外なことになりました。

```rb
wb.add_worksheet(name: '棒グラフ') do |sheet|
  sheet.add_row ['a', 1]
  sheet.add_row ['b', 2]
  sheet.add_row ['c', 3]
  sheet.add_row ['d', 4]
  sheet.add_chart(Axlsx::BarChart, start_at: 'A5', end_at: 'F17') do |chart|
    chart.add_series data: sheet['B1:B4'], labels: sheet['A1:A4']
  end
end
```

これで棒グラフはできたのですが、表の方の並びが上からa、b、c、dの順なのに対して、グラフの方はその逆順に並んでしまっているのです。どうすればいいのかわからず、Excelで変更して保存を行い、出来上がったxlsxを解凍してxmlを比較した結果、どこを調整すればいいかが判明しました。

```rb
  sheet.add_chart(Axlsx::BarChart, start_at: 'A5', end_at: 'F17') do |chart|
    chart.add_series data: sheet['B1:B4'], labels: sheet['A1:A4']
    chart.cat_axis.scaling.orientation = :maxMin
  end
```

うーん、わからない！
ソフトウェア品質管理の関連資格まとめ

一定の品質を担保することは、システムやプロジェクトごとにレベルの違いはあれど、ソフトウェア開発における重要な課題のひとつなのではないでしょうか。

ソフトウェア品質管理についての体系的な知識を得るために、資格の取得を目指すことも有意義な手段となり得るのではないかと思います。

そこで、ソフトウェア品質管理に関連する主要な資格についての情報を以下にまとめてみました。

### ■ JQTQB認定テスト技術者資格
- 概要
[JQTQB認定テスト技術者資格](http://jstqb.jp/attribute.html)は、「Japan Software Testing Qualifications Board」という団体による認定資格で、パートナーである財団法人日本科学技術連盟により実施されています。ISTQB（International Software Testing Qualifications Board）という団体を通して、日本だけでなくアメリカやイギリスなどのISTQB連携のテスト技術者資格とも相互認証されている国際的な資格です。

- 体系
    - Foundation Level
    - Advanced Level
        - TA（テストアナリスト）
        - TM（テストマネージャ）
![JSTQB.PNG](https://qiita-image-store.s3.amazonaws.com/0/216952/8a2b1ac4-8414-215b-9c5f-2c6ddba3b670.png)

- 筆者受験経験 : あり
2009年04月に、Foundation を受験して合格、 2016年08月に Advanced（TM）を受験して、こちらは残念ながら不合格でした。
Foundation については、公式問題集が存在したため、それを5巡ほど（2時間×7日程）行いました。
Advanced（TM）については、ほぼ準備なしで受験したのですが、ある程度準備を行ったとしても、合格は難しそうな印象でした。Foundation と比較して各段に難易度が高くなった気がしました。問題は選択式問題とケーススタディに基づいた問題が出題されましたが、後者についてはシラバスや書籍などから得られる情報＋経験に基づく応用力が問われるような内容でした。

### ■IT検証技術者認定試験（IVEC）
- 概要
[IVEC](https://www.ivia.or.jp/item43)は、一般社団法人IT検証産業協会(IVIA)が認定するテストエンジニアの資格試験で、IVECが定めたキャリアレベルに基づき、実務力をはかるための問題が出題されます。

- 体系
レベル1～7まで設けられており、レベルごとに業務における役割が想定されています。
詳細は、[公式サイト](https://www.ivia.or.jp/item43)をご覧ください。
![IVEC.PNG](https://qiita-image-store.s3.amazonaws.com/0/216952/f57d8217-a41f-d1ce-cfa0-406e6c5409cb.png)

- 筆者受験経験 : あり
2015年10月の筆記試験と実務試験が統合される前に、レベル2の筆記試験のみ受験し合格しました。
現在は、試験の形式が変わっているため、参考になるか分かりませんが、準備については、公式問題集を5巡（2時間×5日程度）くらい行いました。

### ■ソフトウェア品質技術者資格（JCSQE）
- 概要
[JCSQE](https://www.juse.jp/jcsqe/greeting/)は、日本科学技術連盟が主催するソフトウェア品質向上のための資格制度で、「品質は、組織全員で作り込まねばならないものである」という考え方のもと、品質保証担当者やテスト技術者だけでなく、開発者や保守運用技術者から経営者などの様々なレイヤーの人々を対象としています。

- 体系
初級と中級の2種類で構成されています。
![JCSQE.PNG](https://qiita-image-store.s3.amazonaws.com/0/216952/058a6ed7-15d7-fd55-97d6-ce7b2263013b.png)

- 筆者受験経験 : あり
2017年01月に、初級レベルを受験して合格しました。
準備は、「初級ソフトウェア品質技術者資格試験（JCSQE）」という公式問題集を、5巡（1時間×5日程）くらいと、[スクエアリング](http://squaring.jp/proceeding/comm-sessionerror.jsp)という、オンラインで問題を出題してくれるサイトを利用しました。

### まとめ
ソフトウェア品質に関する資格はまだまだ認知度も低く受験者数が少ないためか、受験料も比較的高額なため、そういう意味では気軽に受験しにくいですが、初級者レベルであれば難易度も低いため書籍などをうまく利用して準備すれば合格の可能性も高いと思いますので、ソフトウェア品質についての知識を身に付けるきっかけとして受験してみてはいかがでしょうか。
= [Qiita] vimテストを書く [WIP]

使用するフレームワーク: [kana/vim-vspec](https://github.com/kana/vim-vspec)
参考にするサイト: http://labs.timedia.co.jp/2013/02/vim-plugins-vs-travis-ci.html (ちょっと古いけど気にしてない)


# 環境構築

## 1. Rubyのインストール

`rbenv`を使ってみた

```bash
$ brew install rbenv
$ rbenv install 2.5.1
```

## 2. Bundlerのインストール

`Gemfile`でgemのバージョン依存管理とかもしてくれるみたい?
最初これが無くってよくわかんなくなった

```bash
$ gem install bundler
```

## 3. Gemfileを書く

上記参考サイトから使用

```bash
$ cat Gemfile
source 'https://rubygems.org'

gem 'vim-flavor', '~> 2.0' # 参考サイトでは1.1だが、本人のレポジトリを見ると2.0になってたので修正
```

[kana/vim-flavor](https://github.com/kana/vim-flavor)はvimプラグインの依存解決をしてくれるプラグインらしい。
よく分からんからそのまま入れている。わかる人教えて。


## 4. 必要なgemのインストール

```bash
$ bundle install
...
Bundle complete! 1 Gemfile dependency, 4 gems now installed.
```

## 5. Rakefileかく

テストは`rake`で走らせるようなので`Rakefile`作成

```bash
$ cat Rakefile
#!/usr/bin/env rake

task :ci => [:dump, :test]

task :dump do
  sh 'vim --version'
end

task :test do
  sh 'bundle exec vim-flavor test'
end
```

これも参考サイトさんから借りたまま。

## 6. ついでにtravisの設定もする

まぁ参考サイトのままなのですが()

```travis
language: ruby
rvm:
  - 1.9.3
script: rake ci
```

rvmの適正なバージョンとか分からない...
これでpushすれば自動的にtravisが動いてくれるらしいです。まだ試してない。


# テストかく

ここから実際にテスト書くフェーズだけど一旦公開


---

参考サイトシリーズ:

* [TIMLabs Vim プラグイン開発でも継続的インテグレーションがしたい! (Travis CI 編))](http://labs.timedia.co.jp/2013/02/vim-plugins-vs-travis-ci.html)
* [hisonl/Bundler概要](https://qiita.com/hisonl/items/162f70e612e8e96dba50)
* テスト参考: [kana/vim-vspec](https://github.com/kana/vim-vspec)

[2018-12-19 21:30]
fortranのnamelistをPythonでも読む

#はじめに

「プログラマは静的コンパイラ言語と動的スクリプト言語を1つずつ使えるとよい」と言われますが、前者であるfortranに対して後者としてPythonは相性が良い言語です。Pythonは単体でも強いですが、「fortranで書き出したファイルをNumPyで加工しmatplotlibで可視化する」といった使い方をするととても便利です。

fortranでは設定値を記述するフォーマットとしてnamelistというものがあります。「namelistの設定値をpythonでも共有したい」と思うこともありますが、さすがかゆいところに手が届くPythonなので、ライブラリが用意されています。それがf90nmlです。

# webサイト
https://pypi.org/project/f90nml/

# インストール
もちろんpythonなのでpipでできます。
``` pip install f90nml```

#使い方
f90nmlはnamelistをdict型と相互に変換します。読み込むにはreadメソッドを使います。writeメソッドを使うと逆にnamelist形式で書き込むことができます。

```python 
# mysetting.nmlを読み込む
mysetting = f90nml.read("mysetting.nml")

# new_setting.nmlに書き込む
f90nml.write(mydict,"new_setting.nml")
```

# 小技
みなさんもこんな経験ありますよね？

「*せっかく精魂込めて作ったnamelistをfortranコードが読んでくれない！*」
「*他のコンパイラで使えたベンチマークのnamelistを読み込まない！設定値50個くらいあるしいちいち書き直すのもだるい！*」

namelistの流儀は実はめちゃくちゃで、いろんな書き方があります。なのでifortで通ったnamelistがcray ftnだと読めないとかそういうことはよくあります。

でも大丈夫！そう、f90nmlがあればね。

```python:remake.py
import f90nml
myset = f90nml.read("myset.nml")
f90nml.write(myset,"new_set.nml")
```

f90nmlは多少のブレはちゃんと読んで標準に則った形で書いてくれるので、f90nmlを経由すればちゃんと読んでもらえる形式で出してくれます。

これで読めなかったら設定値の型がまちがっている（logical型の設定値に0を入れるとか [^1]）こともあるので設定値をチェックしましょう。

[^1]: intelのifortはめっちゃ優しいのでlogicalに0や1を入れても読んでくれたり、他にもいろんなバグを黙って自動で直してコンパイルしてくれます。ですがcrayのftnや富士通のfccは厳しいので```invalid value error```とだけ返して読んでくれません。優しさは時に人をダメにするということは、優しさを失って初めて気づくのですね :(。

# 参考
* 自分のブログの過去記事<br>http://bluepost69-tech.hatenablog.com/entry/2016/09/13/170508
レビューをやっていて思ったことをつらつらと（概要編）

##0.レビューについて書いてみたい

お疲れ様です。
現在の現場で他の方が開発されたものの
レビューを担当させていただいているへっぽこエンジニアです。
なお、まだまだ経験の浅い初心者なのですが、
自身の今後のためや、他にレビューを担当される方、
今後レビューを受けることが増えるかた、
エンジニアになったばかりの方向けに伝えたいと思い記述してます。


「レビューを担当してる」って話をすると
「そもそもレビューってどうやってるの？」
「複数人のチームでやってるんだよね？どうやるの」
といった「レビューの観点」や「レビューの方法」に
関する議論をしていたので、ちらっと書いてみたいと思います。

##1.そもそもレビューって何なんだ？
>１ 再調査。再検討。
２ 批評記事。文芸・芸能などに関する評論。論評。また、評論雑誌。
>システム開発において、工程ごとに成果物の品質を検証する会議。レビューの方法には、開発に携わった者を集めて検証を行うウォークスルー、責任のある第三者が検証を行うインスペクションなどがある。
> 引用：http://ikikatadatabase.com/archives/5409

ざっと要約すると
####　作ったものの検証・評価
というのが妥当な線でしょうか。
経験のない方にはイメージがつきにくいと思いますが、
設計書・ソースコード・テスト仕様書・テストコードそれぞれ作成後に
上位のレイヤーの方にそれぞれの成果物を見せる場合があります。
そのことを
####レビューを受ける
といいます

##2.なんでレビューって必要なの？
「正直このソースコード見せるの恥ずかしい…」
「間違ってたらどうしよう…」
すごく共感できます。むしろ胸とか耳が痛い。

でも、一度でもレビューを受けたことがある方はご存知かと思いますが
「意外と考慮が漏れてしまってるな」って思ったこと、ないでしょうか。
（ないという方は本当に考慮が上手なのだと思います。
　考慮の方法を教えてください。お願いします）

ソースコードを書いてるとソースを作ること、
ロジックを作ることに夢中になって例外の考慮やNULLチェック等
基本的なところの考慮が漏れる場合が往々にしてあります。
第三者の目線から見ることでそういった
####・考慮漏れ
####・ロジックの簡略化、軽量化（無駄なソースを削る）
####・根本的にバグを減らす

上記のようなことを行い品質を上げること。
そのことがレビューの大きな意義と考えています。
（これで全部とは言いません。まだまだあると思います）


##3.レビューのしんどさ
シンプルに物量が多いと
###きつい
10000ステップ近いコードになるとむちゃくちゃ時間かかります。
普通に作業していて他の人のソースコードを読むときもあると思いますが、
レビューとなると細かなところまでチェックしなくてはならないので
読んでる最中に「あれ？この処理なんだっけ」とか発生します。

複雑ではないコードでも簡易なコードでもどちらでも発生します。
後は、同じ処理が続くとミスに気づきにくいです。
（変数名違うのを使用するはずが、見逃す、等）

なので、途中でブレークポイントやマーカーを使いながらうまく
どこまで読んだか把握したり、処理の分岐を意識して理解・レビューするようにしてます。

・指摘の仕方が悩ましい
指摘する際も一方的に「こうして」「こういうふうにして」というのは
非常にレビューイ（レビューを受ける人）からあまり良い印象を受けないと思います。
なので、「こういう風にしたら○○になると思うけど、これじゃだめ？」とか
「こういうロジックの理由は？」というふうに伺うようにしてます。

私がそうだったのですがレビューを受ける側からすると
お叱りを受けているような気分になりやすい。
ので、「会話」・対話として行えるように留意してます。
ただ…ここはレビューイ、レビューアとの信頼関係にもよると思いますので
万人受けするとは全く思いません。レビューに正解はないとも思っているので
あくまでこういうふうなやり方もあるよ。と一つの参考にしていただければと思います。

##4.各フェーズでのレビューの注意していること
・内部設計書・実装はとにかく気を使おう
　正直なところ気をつけていることはキリがないのですが、
　内部設計書・実装での変数・メソッド名・定数名がよく気をつけていることです。

　うっかり変数に間違いがあってそのままテスト仕様書に行ってしまったらもう埒が明かないです。
　実装でも同様に、本来使うべき定数や変数とは違う定数を使っている
　似てるけど間違ったメソッドを使った・違う値を取りに行っているが
　エラーを吐かずに気づかずにテストまで行ってしまったらもう大変です。
とにかく内部設計書・実装での変数・メソッド名・定数名には気を使います。

・テスト仕様書・テストコードはなんとかなる
逆に上記の2つさえ概ね間違えなければ「手戻り」が少ないためカバーできると思います。
テストフェーズでのレビューの注意点はそのうち細かく分けてかければと思いますのでこの場ではこのあたりで。


##5.組織的なレビューの弊害
もうすでに若干文章が長くなってきたので締めに入ります。
チームでレビューをする際は下記についてよく議論・検討されていると
チームメンバーはやりやすいと思います。

・ルールはきっちり固めよう
（コメントの前後1行は必ず開ける。IF文だろうとFOR文だろうと関係なく、など）

・認識はそれぞれで差異がないようにわ　か　り　や　す　くルールを書こう。
（上記の例で言えば「コメントの前後1行は必ず開ける。」だけで終えないこと。必ず「IF文の場合はこう、For分の場合はこう」といったルールがあるだけで精神的な負荷は違います。）
（特に日本語はいくつもの解釈が生じる可能性があるから気をつけよう）

・わからなかったらちゃんと聞こう。
　→聞く人・ルールをまとめる人もできるかぎり少数が良いと見てます。
　そして、その少数がきちんとメンバーに共有・展開・最適化できる環境があると無駄がなく、情報の伝達のラグを減らして幸せなレビューライフが送れると思います。

初の投稿で、少々おざなりな部分があったかと思いますが
参考になる箇所があれば幸いです。
wildqat（QUBOシミュレータ）でビンパッキングを解いてみる（前半）

#はじめに
昨日突然降ってきた（というか私がすっかり忘れていただけなのですが）最適化問題の案件の資料を読んでいて「ビンパッキング」がでてきたので、お勉強がてら「ビンパッキング」をwildqat（QUBOシミュレータ）で解いてみようと思います。
この記事は前半の立式までです！

#「ビンパッキング」とは
色々な大きさのアイテムと、大きさが固定のビン（入れ物）が与えられています。アイテムをビンに詰めていくのですが、使うビンの個数をなるべく少なくするような詰め込み方（割り当て）を決めていくという問題です。
荷物の箱詰めでできるだけ箱を少なくしたり、トラックによる配送でできるだけトラックを少なくしたりするのに使えそうです！
![box_danbo-ru_open.png](https://qiita-image-store.s3.amazonaws.com/0/298382/a7d59512-561d-b601-4bab-727b07021c89.png)

#wildqatとは
MDR社のQUBOシミュレータであり、シミュレーテッドアニーリング (SA) またはシミュレーテッド量子アニーリング(SQA)と呼ばれるアルゴリズムを普通のPC上でシミュレートすることができます。オープンソースで、githubからダウンロードできます。
https://github.com/mdrft/Wildqat

#ビンパッキングの例題
例として小さい問題を考えます。４つのアイテムがあり、そのサイズを１、１、２、３とします。箱も４つあり、箱には合計でサイズ４まで詰め込めることにします。
ナップザック問題と似ていますが、入れるものが１つでないところが多少やっかいです。また、QUBOで不等式を扱うには少し変わった式を立てる必要があります。

#立式
＜変数＞
アイテム$i$を箱$j$に詰めるかどうかを変数$x_{ij}$とします。

```math
x_{ij}=
 \begin{cases}
  1 & (アイテムiを箱jに入れる) \\ 
  0 & (アイテムiを箱jに入れない)
 \end{cases}
```

箱jに入れるサイズの合計がkであるときに１となる変数を$y_{jk}$とします。不等式のままだとQUBOにするのに不都合なため、箱に入れるサイズの合計が1、２、３、４を別々の４つの変数としています。

```math
y_{jk}=
 \begin{cases}
  1 & (箱jに入れるアイテムの合計サイズがkである) \\ 
  0 & (箱jに入れる合計サイズはkではない)
 \end{cases} \\
ただし k=1～4
```

＜制約条件１＞
まずは「箱に入れるアイテムのサイズの上限は４である」を立式します。
QUBOシミュレータは問題を最小値問題に置き換える必要があります。そこで、制約条件を最小値問題に置き換えます。例えば箱１については、制約条件は
$$1x_{11}+1x_{21}+2x_{31}+3x_{41} \leq 4 $$
ですが、上述の不等式の問題のために箱１に関する変数が４つあるのと、と最小値問題に置き換えるという２つがあるためちょっと複雑です。例えば「箱１に入れるアイテムの合計サイズがちょうどkになるときに最小になる」式を考えると
$$ \lbrace (1y_{11}+2y_{12}+3y_{13}+4y_{14}) - (1x_{11}+1x_{21}+2x_{31}+3x_{41})\rbrace^2 $$　
となるはずです。例えば合計サイズ4を入れるとき、左側の括弧の中は、y_{14}のみが1なのでちょうど４、右側のカッコの中も４になるので、全体の括弧の中の式はちょうど０で最小、それ以外の場合は０より大きくなるはずです。
この式を箱について一般化すると
$$ \lbrace (1y_{j1}+2y_{j2}+3y_{j3}+4y_{j4}) - (1x_{1j}+1x_{2j}+2x_{3j}+3x_{4j})\rbrace^2 $$　
となります。

＜制約条件２＞
アイテムは必ずどれか1つの箱にはいる、という制約条件を最小値問題に置き換えます。
例えばアイテム１についての式は以下のようになります。
$$\lbrace 1 - (x_{11}+x_{12}+x_{13}+x_{14})\rbrace^2 $$　
アイテム１がどれか1つの箱に入っているとき、右側の和の式が１になりますので、上の式は０となり最小、それ以外の場合０より大きくなります。すべてのアイテムについて一般化すると
$$\lbrace 1 - (x_{i1}+x_{i2}+x_{i3}+x_{i4})\rbrace^2 $$　

＜目的関数＞
使う箱の数を最小にするという問題なので、（雑ですが）
$$ \sum_{jk}y_{jk} $$　

こんな感じでできるのではと思います！

#QUBO作成
あとは式展開してQUBOを作成します。
ただ、途中で気づいたのですが、アイテム４つでも結構式が多くて途中までコードを書いたのですが、力尽きました。。。
![karou_businesswoman.png](https://qiita-image-store.s3.amazonaws.com/0/298382/60152e1e-c9fa-d7b0-5118-d445aadfe660.png)

時間があれば年内に続きを書きます！

それではみなさん良いクリスマスを~！
【メモ】グラフを次々にコピー → 参照範囲更新

###やったこと
大量にグラフを作るマクロを作りました。流れとしては、まずはひな形のグラフをひとつ手動で作ります。そして、それをアクティブにしてマクロを実行します。すると、自動で次々にグラフをコピーし、参照範囲を更新していきます。
作成されたグラフは、↓のように横方向に最大５個並べられ、下の段に続いて貼り付けられていきます。
■■■■■
■■■■■
■■■■■
■■
作成したグラフは、縦軸が標高で横軸が水温のグラフになっています。


```vb
Sub 鉛直グラフ作成()
'雛形のグラフを一つ作っておく。
'そのグラフをアクティブにしてマクロ実行
'必要数コピーして各系列の参照範囲を更新

N = Cells(1, 3).End(xlDown).Row - 2 'グラフの個数
flag = 1

Set orig_Chart = ActiveSheet.ChartObjects(1)
Set last_Chart = orig_Chart

For i = 2 To N
    
    Set dupli_Chart = last_Chart.Duplicate
    
    'flagによって配置位置調節
    With dupli_Chart
        If flag < 5 Then 'flagが5でなければ右に続けてはりつけ
            .Left = last_Chart.Left + last_Chart.Width
            .Top = last_Chart.Top
            flag = flag + 1
            
        Else 'flagが5だったら下にはりつけ
            .Left = orig_Chart.Left
            .Top = last_Chart.Top + last_Chart.Height
            flag = 1
        End If
    End With
    
    'グラフタイトルと系列更新する。※ここはデータに併せて修正する。
    'N+2行~がデータ。系列1が上流。系列2が下流
    '系列1・・・・・X（水温）:15~26列、Y（標高）:3～14列
    '系列2・・・・・X（水温）:40~51列、Y（標高）:28～39列
    With ActiveSheet.ChartObjects(i).Chart
    .ChartTitle.Text = "=" & ActiveSheet.Name & "!R" & (i + 2) & "C2"
    .SeriesCollection(1).XValues = Range(Cells(i + 2, 15), Cells(i + 2, 26))
    .SeriesCollection(1).Values = Range(Cells(i + 2, 3), Cells(i + 2, 14))
    .SeriesCollection(2).XValues = Range(Cells(i + 2, 40), Cells(i + 2, 51))
    .SeriesCollection(2).Values = Range(Cells(i + 2, 28), Cells(i + 2, 39))
    End With
       
    Set last_Chart = ActiveSheet.ChartObjects(i)

Next i
End Sub
```
↓やり直したいときに、ひな形以外のグラフを消す。

```vb
Sub 雛形以外のグラフを削除()
Dim N As Integer

N = ActiveSheet.ChartObjects.Count

Do
ActiveSheet.ChartObjects(N).Delete
N = N - 1
Loop Until N = 1

End Sub
```
静止画を連結して動画を作り、YouTubeにアップしたい時のコマンドライン

メモ書き。
タイトルの通りです。

数値シミュレーションの結果などを動画化し、それをYouTubeなどにアップしようとすると、
何故かどうしようもなく画質がノイジーになる事があって困る。
特に、何枚かの連番の静止画を結合して動画を作ろうとすると、
imagemagickとかでcommand lineから処理したくなるのだけれど、適当にやるととてつもなく劣化する。
そこで、頑張ってffmpegの公式サイトやらなんやらから記述を見つけてきたので、
それを転載しておく、というかどっかしらに書いておかないと完全に忘れそうだし。

HD画質
---
img/以下に5桁で揃ったpng画像があるとして、こう。

```
ffmpeg -framerate 60 -i img/%05d.png -c:v libx264 -preset medium -tune stillimage -crf 18 -c:a copy -shortest -pix_fmt yuv420p -movflags +faststart output.mp4
```
できたものはこれ。
https://www.youtube.com/watch?v=sI0gXiYOGgk
右下みるとちゃんとHDマークが付いているんじゃないかなと思います。

4K
---
調査中…
これ↓

```
ffmpeg -i %05d.png -c:v libx265 -x265-params "level=5.2:colorprim=bt2020:colormatrix=bt2020nc:transfer=smpte2084" -crf 12 -preset medium -c:a copy output.mp4
```
でいけるとかいう噂を見たから試したんだけれど色が崩壊して<a href="https://www.youtube.com/channel/UCSv-TsF2gkYAMr6p29Os7Hg">ンヌグムの動画</a>みたいになったので誰か詳しい人教えてください。
Pycryptoをpipでインストールしようとしたらエラーが出たけど、解決したのでそのメモ

Pycryptoをインストールするまで大変だったので、忘れないように書いておく。
環境はWindows10,Visual Studio 2017

```
pip install pycrypto
```

この書き方だとエラーが起こって、インストールできなかった。

調べてみると、いろいろな解決策があったが、どれを試してみてもうまくいかなかった。

さらに調べてみると、pycryptoの開発は終了していて、pycryptodomeへの移行を推奨されているという情報を入手した。

```
pip install pycryptodome
```

これでうまくインストールに成功した！
私と同じく、pycryptoのインストールに苦労している方がいたら、ぜひ参考にしてみてください。
TruffleがVyperをサポートしたので触ってみる

[Truffleのv5](https://truffleframework.com/blog/truffle-v5-has-arrived)で[Vyper](https://vyper.readthedocs.io/en/latest/index.html)がサポートされたので触ってみます。 
環境構築は地味に面倒なので[Dockerイメージ](https://hub.docker.com/r/sot528/truffle-vyper-test)を作成しました([Dockerfile](https://github.com/sot528/truffle-vyper-test))。

# 利用手順

```bash
docker run -it sot528/truffle-vyper-test
```

# コンテナ内で挙動確認
[vyper-example-box](https://github.com/truffle-box/vyper-example-box)をunboxしているので↓のコマンドでテストが走ります。

```bash
$ truffle test

Using network 'test'.



  Contract: VyperStorage
    ✓ ...should store the value 89. (114ms)


  1 passing (129ms)

```

VyperのContractのテストが走りました。
テスト対象のContract `./contracts/VyperStorage.vy` をいじって`truffle compile`すればいろいろ挙動確認できます。

```python
stored_data: uint256

@public
def set(new_value : uint256):
    self.stored_data = new_value

@public
@constant
def get() -> uint256:
    return self.stored_data
```

テストファイルは `./test/vyperStorage.js` です。

```javascript
const VyperStorage = artifacts.require("VyperStorage");

contract("VyperStorage", () => {
  it("...should store the value 89.", async () => {
    const storage = await VyperStorage.deployed();

    // Set value of 89
    await storage.set(89);

    // Get stored value
    const storedData = await storage.get();

    assert.equal(storedData, 89, "The value 89 was not stored.");
  });
});
```

以下のようなエラーが出る場合は `build`以下を削除すると解決します。

```bash
Error parsing /code/contracts/VyperStorage.vy: ParsedContract.sol:1:1: ParserError: Expected pragma, import directive or contract/interface/library definition.
stored_data: uint256
^---------^
Compilation failed. See above.
Truffle v5.0.0 (core: 5.0.0)
```

以上。
Vyperも着実に環境が整ってきていますね。
【p5.js】任意の場所に複数のcanvasを設置する方法

p5.jsで複数のcanvasを指定した場所に設置する方法をご紹介します。

イメージ動画は以下の通りです
![gzjs2.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/d6eb02f0-3a38-9851-f69e-ecc753297259.gif)

上記はp5.jsで作成した４つのcanvas(春・夏・秋・冬)を指定場所に配置したものです。

こんな感じで、p5.jsで複数の場所にcanvasを設置する方法をご紹介します！

## 親要素を作成
canvasの親要素を予め準備しておきます。ここでは２つ用意しておきます。

```
<div id="container1"></div>
<div id="container2"></div>
```

## 配置先を指定して、インスタンス化
親になるidを指定して、インスタンス化すれば完成です！
サンプル例は以下の通り。

```
    <script>
      var sketch1 = function(p) {
        p.setup = function() {
          p.createCanvas(100, 100);
          p.background(0);
        };

        p.draw = function() {
          p.fill(200);
          p.stroke(0);
          p.rect(20, 20, 20, 20);
        };
      };

      var sketch2 = function(p) {
        p.setup = function() {
          p.createCanvas(200, 200);
          p.background(200);
        };

        p.draw = function() {
          p.fill(0);
          p.stroke(0);
          p.ellipse(50, 50, 50, 50);
        };
      };

      new p5(sketch1, "container1");
      new p5(sketch2, "container2");
    </script>
```

実行結果
<img width="231" alt="スクリーンショット 2018-12-10 14.18.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/314351/354d1ae8-a4f5-13f6-77bb-cedd8ca078ea.png">


こうすることで、指定した場所にcanvasを配置し、p5.jsで好きなような描画が可能になります！

## 参考URL
- [公式（p5.js)：Instance Container](https://p5js.org/examples/instance-mode-instance-container.html)
XGen hair の width を Alembic でエクスポートして cyhair に変換する


XGen の hair(curve)データの per-vertex width は, Alembic export 時に `Write Final Width` チェックを on にすることで Alembic curves に width 情報がつくことを確認しました.
(Maya 2018 Update 5)

Alembic curves から width 情報を読んで cyhair thickness に変換する機能を追加しました.

https://github.com/syoyo/alembic-converters/tree/master/alembic-to-cyhair

## TODO

* UV や, User attributes が Alembic でエクスポートできるか確認する
プライベートで開発する習慣がなかったワイが1ヶ月間Githubに草を生やし続けてわかった4つのこと

## エディタに向かう習慣はつくのはイイかも

毎日草を生やしていく必要があるので、必然的に毎日エディタと向かいあうことになりますし、継続して開発するリポジトリができます。

何かを作るネタがないとコミットするまでが長いので、一回スタートするとこれから気が向いた時の開発のハードルが下がりそうです。

## 草が連続して生えているのを見るのは気持ちいい

集中して開発していた期間が一週間くらいあったのですが、その期間の草がほぼ濃いめの緑になっていたのは見てイケてるやんって思いました。

他の人がどう思うかはわかんないですけど僕は少なくとも嬉しく思えました。草を生やし続けて良かったと思います。

## 毎日コミットしなければならないというプレッシャーはキツイかも

これに尽きます。例えば休日で昼に起きてそのまま外出して23時ぐらいに帰ってきた時が一番キツかった。

流石にdotFilesにエイリアスを追加してコミットしました。

## コミットの単位が適当になりがち

そのうち疲れてきてコミットの粒度がめちゃくちゃ細かくなります。

結局モチベーションがなかったり疲れてる時ってこういうことやるべきじゃないんですよね。

労働は1週間に2日休日がありますがGithubの草マップにはないです。(重要)

## まとめ

- 草を生やすのはいいが無理してやる必要はない。1日2日くらいなら空いても見え方的には変わらないと思う
- コミットを細かくするのはいいが、草を生やすためだけの超細かいコミットをするくらいならやらなくていい
- どっちにしろ草がたくさん生えているのをみると俺やるじゃんって感じになるので、隙あらば草を生やしていこう
Ada言語 7日目 switch case文

#はじめに
前回は条件文のif文をやったので今回はswitch case文をやりたいと思いました。
私の場合、C言語ではほとんどif文を使用していたのでAda言語もswitch case文はほとんど使いません。

#ソースと結果
```main.adb

with Ada.Text_IO;
use Ada.Text_IO;

procedure main is

    hennsuu : Integer := 0;

begin

    case hennsuu is

        when 0 =>
            Ada.Text_IO.Put_Line("switch case 0");

        when 1 =>
            Ada.Text_IO.Put_Line("switch case 1");

        when 2 .. 3 =>
            Ada.Text_IO.Put_Line("switch case 2 or 3");

        when others =>
            Ada.Text_IO.Put_Line("switch case other");

    end case;

end main;

```

`実行結果 : hennsuuが0のとき "switch case 0" `
`実行結果 : hennsuuが1のとき "switch case 1" `
`実行結果 : hennsuuが2と3のとき "switch case 2 or 3" `
`実行結果 : hennsuuが0, 1, 2, 3のいずれでもないとき "switch case other" `

#最後に
1行の時は`=>`のすぐ隣に命令を書くのが好ましいのでしょうが、1行ではないときに備えて上記のような書き方をしました。
一応書いておきますが、hennsuuの値を変えるのは、直接ソースを書き直して変更しています。

#日記一覧へ
[Ada言語を習得する日記一覧](https://qiita.com/C_Assembly/items/50a0f9d8542679d92ea8)
SKIコンビネータ覚書

SKIコンビネータについて簡潔にまとまったサイトがみつからなかったので要点だけまとめました。[^1]

# ラムダ計算式とは

関数```f(x)=x+2```をラムダ計算では ```λx.x+2``` と表す。```λx.x```なら```f(x)=x```、つまり入力値をそのまま返す関数となる。

```xy``` のように２つ並べられている時は```x```に```y```を引数として適用することを意味する。```λx.((xy)z)``` は単に ```λx.xyz```と書ける。各関数は左結合であり順序が明確な時はこのようにカッコを省略することができる。

```λxy.x``` のように左辺に２つ並べたら、xとyの２つの引数をとる関数を意味する。この場合はyの値を無視してxをそのまま帰す関数```f(x,y)=x```となる。

```λx.xy``` にある２つの変数 ```x y```のうち、パラメータとして使われる変数(この場合は```x```)を束縛変数(bound variable)、それ以外は自由変数(free variable)という。

# λリフティング
ラムダ式の中の```λ```を取り除きコンビネータで置き換える。例として下記の式の場合を考える。

- ```Y = λf.(λx.f(λv.(xx)v))(λx.f(λv.(xx)v))```

まず一番内側のカッコ内にある```λ```の箇所、```λv.(xx)v```を対象とする。コンビネータを仮に```M```と置く。```M```のパラメータは自由変数を先に書き、後ろに束縛変数を書く。右辺は元の式のままで```Mxv=(xx)v```となる。
これを最初の式の```λv.(xx)v```と置き換える。この時、束縛変数は置く必要がない。[^2]

- ```Y = λf.(λx.f(Mx))(λx.f(Mx))```

次に```(λx.f(Mx))```を置き換える。コンビネータ ```L``` と置いて ```Lfx = f(Mx)```。これを元の式に適用する。```x```は束縛変数なので消去されて下記のようになる。

- ```Y = λf.(Lf)(Lf)```

最後にこの式の```λ```をとる。```Y```には束縛変数fしかないので```Yf = (Lf)(Lf)```となる。以上をまとめると元のラムダ式をλリフティングした結果は下記のようになる。

```
Yf = (Lf)(Lf)
Lfx = f(Mx)
Mxv = (xx)v
```
# SKIコンビネータ
```S K I``` ３つのコンビネータを下記のように定義するとすべてのラムダ式をこれらだけで表すことができる。[^3]

```
Sfgx = (fx)(gx)
Kxy = x
Ix = x
```

```I```は入力値をそのまま返すだけのコンビネータ。```K```は```(x y)```の２つのパラメータをとるが```y```を無視して```x```を返す。

# α-消去

```T x y = y x```というコンビネータTがあるとする。これはパラメータ ```x y``` の適用順を逆にして ```y x``` を返す。これは下記のように変形できる。

```
Txy = yx ... Iy=yなので
 = (Iy)x ... Kxy=xなので
 = (Iy)(Kxy) ... Sfgxのf=I,g=Kx,x=yとおくと（Iy)(Kxy)は(fx)(gx)の形式なので
 = SI(Kx)y
∴Tx = SI(Kx) ... y消去完了

Tx = SI(Kx) ... Kxy=xよりK(SI)x=(SI)となるので
 = (K(SI)x)(Kx) ... Sfgxのf=K(SI),g=K,x=xとおいて
 = S(K(SI))Kx
∴T = S(K(SI))K ... x消去完了

```
このようにしてパラメータを消去していくことをα-消去という[^4]。これでTをSKIで表現することができた。
オンラインでSKIコンビネータを解釈してくれるサービスに投げると動作を確認できる。
http://ski.aditsu.net/
先程の`S(K(SI))K`を入れるRunを押すと`(x0->(x1->x1(x0)))`となるのでたしかに引数を
`x0,x1`の順番に取得したのに｀x1,x0`の順番で合成していることがわかる。

# 参考サイト

- 高階ことりちゃんと学ぶSKIコンビネータ
  - http://www.tatapa.org/~takuo/kotori_ski/index.html
  - きっかけはここだったのですが、ラムダ書式の説明が足りないのとTxy = yxのy消去だけでx消去がなかったので自力で説いてみました。
- Wikipedia ラムダ計算 https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%A0%E3%83%80%E8%A8%88%E7%AE%97
- Wikipedia SKIコンビネータ計算 https://ja.wikipedia.org/wiki/SKI%E3%82%B3%E3%83%B3%E3%83%93%E3%83%8D%E3%83%BC%E3%82%BF%E8%A8%88%E7%AE%97


[^1]: わかりやすい文章を書こうとしたら面倒くさくなったとも言う
[^2]: 束縛変数は関数のパラメータとして最終的に渡す必要があり、ここでは引数適用前の関数結合を表してるからかなと思うけどよくわかってません
[^3]: ```I = SKK``` と表せるので ```SK```の２つがあれば良い。本当は一つでもいいらしい
[^4]: 「α-消去」と高階ことりちゃんのサイトでは書いてあるのだが他のサイトでは見つからなかった、Wikipediaのラムダ計算の項目には「α-変換」「β-簡約」「η-変換」の説明ならある
PHPカンファレンス2018  「Webサービスを育てるための組織作りと文化作り」まとめ　と　感想

最近PHPerになりましたので
**PHPカンファレンス2018** に参加してきました。

PHPに関連する技術的なセッションも聞いたのですが
最後に聞いたセッションが
（PHPに関係はないが）印象に残ったのでまとめと感想を書こうかと思います。

## 内容まとめ
資料はこちら
https://speakerdeck.com/soudai/proper-problem

スピーカーは、株式会社オミカレのCTO曽根 壮大さん
株式会社オミカレは、全国で開催されている婚活パーティのマッチングサイトだそうです。

内容としては、

変化が激しいWEBサービスを育てるために
どのように組織と文化を作っていくかということを
**マネージャ目線**でどうしてきたかについてです。
（プレーヤ目線の話は、PHPカンファレンス仙台であるそうです。）

### なぜ組織や文化が大切か
WEBサービスを作っているのは人だから。

### 「組織」「チーム」の定義
組織の定義＝共通の目的（VISION）を持った集まり
チーム＝目的を達成するための集まり(偶発的に発生する場合もある）

良い組織であれば、
良い文化が生まれる。
良い文化があれば
良いチームが生まれる。
良いチームがあれば
良いサービスを作れる。

### どんな組織であるべきか？
WEBサービスは変化が激しいので
**変化に強い組織**であることが必要。

変化に強い組織となるためには、
問題を解決していく能力を育てることが必要。

では、問題を解決する能力を育てるためには？
**適切なサイズの問題を設定すること**が必要

>適切な問題が生まれれば
>自然と解決する人が生まれる
>元任天堂社長　岩田総さんのことば
>https://www.1101.com/umeda_iwata/2008-11-13.html

### 適切なサイズの問題を設定する方法　とは？
・問題を適切なサイズに細分化する
・問題のサイズに適切な人にアサインする
・問題を解決できるように人を育てる

「問題のサイズに適切な人にアサインする。」
→その人の限界より少しだけ大きい問題
大きすぎれば潰れる。チャレンジできる文化を作る。


問題がチームや文化を作り、そして組織を変える。


## 感想

- そもそも、組織に明確なVISIONがないと始まらない。
- 「適切なサイズの問題を設定する」ことが大切。（だけど難しい。。。）

## その他
質疑応答で
どのようなコミュニケーションをするべきか、という質問があり、
週に１回のミーティングより、
１日５分でもいいからなんでも話すコミュニケーションにより
解決できる問題は多いという話があったので
参考にしたいと思いました。
UnityのCinemachineについて

### Cinemachineを使用すると、映画のようなカメラワークにすることができます。

作成した動画はこちらです！
https://github.com/YatLok/Unity_Cinemachine/blob/master/Recordings/movie.mp4

GitHub
https://github.com/YatLok/Unity_Cinemachine

- AssetStoreから、Cinemacineをダウンロードします。
- メニューのChinemachineから、Create Dolly Camera with Trackを選択すると、HierarchyにCM vcam1とDollyTrack1が表示されます。
- CM vcam1の Fallow とLook At部分に、カメラでフォローしたいオブジェクトをアタッチします。
- DollyTrack１では、カメラを移動させるレールを作成します。レールの作成は、Waypoints部分で任意に作成可能です。
- CMvcam1のBody内のPath Positionの数値を動かすと、カメラをレールに沿って走らせることができます。

![sample1.png](https://qiita-image-store.s3.amazonaws.com/0/278530/62dd8fbb-2846-25ad-4174-9569a81fc07b.png)
![sample2.png](https://qiita-image-store.s3.amazonaws.com/0/278530/c29374df-4396-d7a4-099f-0f22e24f4b61.png)
![sample3.png](https://qiita-image-store.s3.amazonaws.com/0/278530/375090c0-762a-bddc-bfe8-d1a6b27578b2.png)
Timelineを使用すると、カメラを任意の速度で走らせたり、停止させたりと、映画のような動きを作成することができます。
また、VR用のカメラで映像をみたい場合は、Dive_Cameraを使用できます。
![sample4.png](https://qiita-image-store.s3.amazonaws.com/0/278530/671b4c00-7e04-6360-35c5-7e2e25e9f5fb.png)

Dive_Cameraは
https://www.durovis.com/en/sdk.html
こちらでダウンロードしました。
VueでBootStrapのTooltipを操作しようとして手こずった

VueでToolTipを動的にいじろうとしてハマった.

試行錯誤の段階も文章化しているのでお急ぎの方は[最後のまとめ](#まとめ)へどうぞ.

# 試行錯誤
## Try1
とりあえず普通にやってみる

```html
<div id="app">
    <button class="btn" data-toggle="tooltip" title="Tooltip">hoge</button>
    <button class="btn" data-toggle="tooltip" v-bind:title="date">fuga</button>
    <button class="btn btn-primary" @click="update">更新</button>
</div>


<!-- (includeとかは略) -->
<script>
    new Vue({
        el: '#app',
        data: {
            date: '',
        },
        methods: {
            update: function(){
                date=new Date().toString();
                $('[data-toggle="tooltip"]').tooltip();
            }
        }
    });
</script>
```

こういうソースを書いてブラウザで開きます.
結果は…
<p data-height="265" data-theme-id="0" data-slug-hash="maOXQm" data-default-tab="js,result" data-user="ibuki2003" data-pen-title="maOXQm" class="codepen">See the Pen <a href="https://codepen.io/ibuki2003/pen/maOXQm/">maOXQm</a> by Ibuki (<a href="https://codepen.io/ibuki2003">@ibuki2003</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
動的に操作する方は動作しません!!

### 検証と考察
ChromeのdevToolを見てみましょう.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/236391/fe8f366f-f04b-434b-7ea8-e447c8136725.png)
あれ,titleの中身,どちらも無いですね…
前者には代わりにアトリビュート`data-original-title`にその中身が入っているようです.[^1]
[^1]: ブラウザ標準のツールチップが表示されないように退避させているようです(推測です)

## Try2
ではdata-original-titleにデータをバインドしたらうまくいくんでしょうかね?
<p data-height="265" data-theme-id="0" data-slug-hash="dwOmRz" data-default-tab="js,result" data-user="ibuki2003" data-pen-title="Vue and Bootstrap Tooltip test 2" class="codepen">See the Pen <a href="https://codepen.io/ibuki2003/pen/dwOmRz/">Vue and Bootstrap Tooltip test 2</a> by Ibuki (<a href="https://codepen.io/ibuki2003">@ibuki2003</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
残念ながらこちらもだめでした.どうやらtitle要素をコピーして上書きされてしまったようです.

### 検証と考察
tooltip対応メソッドはDOM描画前に呼ばれているようなので
DOM描画後に呼ばれるようにするといいようです.

## Try3
調べてみたところVueにはupdatedというものがあるようです.
公式によると
> データが変更後、仮想 DOM が再描画そしてパッチを適用によって呼ばれます。
> このフックが呼び出されるとき、コンポーネントの DOM は更新した状態になり、このフックで DOM に依存する操作を行うことができます。

さて,これを使ってみましょう.
<p data-height="265" data-theme-id="0" data-slug-hash="roWdJx" data-default-tab="js,result" data-user="ibuki2003" data-pen-title="Vue and Bootstrap Tooltip test 3" class="codepen">See the Pen <a href="https://codepen.io/ibuki2003/pen/roWdJx/">Vue and Bootstrap Tooltip test 3</a> by Ibuki (<a href="https://codepen.io/ibuki2003">@ibuki2003</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
今度こそうまく行ったみたいですね!

# まとめ
`$(...).tooltip()`は`updated`にて呼ぶようにする.
OSMCにNode-Redを入れる

まずはメモで

●環境
 OSMCのイメージを書き込んだRaspberryPi 2B

 osmc@osmc:~$ uname -a
 Linux osmc 4.14.78-2-osmc #1 SMP PREEMPT Sun Oct 28 14:59:13 UTC 2018 armv7l GNU/Linux

●やったこと

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

sudo apt-get install build-essential

（以下の参考ページ：https://discourse.osmc.tv/t/solved-cannot-install-rpi-gpio/71906 ）
sudo apt-get install python-pip python-dev gcc
sudo pip install wheel
sudo apt-get install python-setuptools
sudo pip install rpi.gpio

（以下の参考ページ：https://github.com/nodesource/distributions ）
curl -sL https://deb.nodesource.com/setup_11.x | sudo -E bash -
sudo apt-get install -y nodejs

（以下の参考ページ：https://nodered.org/docs/hardware/raspberrypi ）
sudo npm i -g npm
bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered )

sudo systemctl enable nodered.service
sudo reboot
SSHポートフォワードの備忘録

#はじめに
本日、サーバ移行の関係でSSHポートフォワードを貼り直したのですが、
コマンドが非常に分かりづらかったので備忘録

#設定方法
##ローカルポートフォワーディング
-Lオプションで設定します。

```markdown:local_forwarding
ssh -L [ローカルポート番号]:[リモートホスト名]:[リモートポート番号] [ユーザ名]@[中継ホスト名]
```

以下に例を示す。このコマンドはlocalで実行する。
localとproxy_server間はssh接続なので鍵認証出ない場合パスワード認証が必要になる。

```bash:local_forwarding_example
ssh -L 1234:serverA:22 test@proxy_server
```

接続図 ： [local:1234] -(ssh)-> [proxy_server] -> [ServerA:22]

localの1234ポートにssh接続をすると、ServerAの22ポートに転送され、ServerAにログインできます。

##リモートポートフォワーディング
-Rオプションで設定します。

```markdown:remote_forwarding
ssh -R [リモートポート番号]:[ローカルホスト名]:[ローカルポート番号] [ユーザ名]@[リモートホスト名]
```

以下にコマンド例を示す。このコマンドは中継サーバで実行する

```bash:remote_forwarding_example
ssh -R 1234:local:22 user@serverA
```

接続図： [local:22] <- [proxy_server] <-(ssh)- [ServerA:1234]

ServerAの1234ポートにSSH接続すると、localの22番ポートに転送されlocalにログインできます。

#その他オプション
- -N : ssh上記コマンドで接続先のターミナルが起動しますが、-Nで抑制できます。
- -f : バックグラウンド実行になるので常にフォワーディングし続けます。

#おわりに
同じフォーマットで指している場所が違いすぎるので混乱する…
現環境では-Rを使っていましたが、ググって出てきた情報が殆ど-Lでかなり理解に時間がかかりました。

#参考文献
- [楽しいトンネルの掘り方(オプション: -L, -R, -f, -N -g) — 京大マイコンクラブ](https://www.kmc.gr.jp/advent-calendar/ssh/2013/12/09/tunnel2.html)
- [SSHによるポートフォワーディング - ふなWiki](http://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=SSH%A4%CB%A4%E8%A4%EB%A5%DD%A1%BC%A5%C8%A5%D5%A5%A9%A5%EF%A1%BC%A5%C7%A5%A3%A5%F3%A5%B0)
「&」を雑に解釈しよう（C++）


# この記事は下記の人におすすめ

- &がむずかしいんだよー
- 仕様書を読みたいわけじゃないんだ
- 正確な認識じゃなくても，ざっくり使い分けがわかればとりあえず良し
- 結局プログラムの動きにはどう関わってくるの？
- 似ている書き方の機能の違いが一覧したい
- 左辺値（lvalue）はLv，右辺値（rvalue）はRvと省略してるかも。
 - prvalue, xvalueは手に負えないので整理できてない。
- ついでにconstとも絡めて全体を見回したい。

**勉強中（整理中）なので，間違ってたら教えてください！**
ただ，趣旨として「雑に解釈できれば良い」と思っているので正確な表現ということにおいては見逃してほしいです。

# 変数宣言にて

|宣言|値の渡し方例|値コピー処理|一言メモ|
|---|---|---|---|
|int a;|a=10;<br>a=x;|有り||
|int* a;|a=&x;|なし|ポインタ|
|int& a = x;|a=x;|なし|参照（左辺値参照）は既にある左辺値の別名をつける感じ|
|int&& a;|a=10;|なし|右辺値参照は一時オブジェクトにアドレスをつける感じ。aそのものはLvとなる。RvをLvにする役目？|
|const int& a;|a=10;<br>a=x;|なし?|read only|

# 関数の引数として

|引数の型 |値の渡し方|値のコピー処理|取りうる値|一言メモ|
|---|---|---|---|---|---|
|f(int x)|値|あり|Lv, Rv両方|xは非破壊| 
|f(int* x)|アドレス|なし?|Lvのアドレス|*xでアクセス|
|f(int& x)|アドレス?|なし?|Lvのみ|xでアクセス|
|f(int&& x)|アドレス?|なし?|Rvのみ|右辺値参照と表現されるが，正しくは転送参照, ユニヴァーサル参照らしい?|
|f(const int& x)|アドレス?|なし?|Lv,Rv両方|xはread only|

# constもついでに説明すると

## constのついた変数

変数にconst修飾がついている場合は「[constおじさん](https://qiita.com/ktetsuo/items/9edc244f544ffedf0b28)」を読むといい。
表にすれば下記のようです。ダブルポインタのconstは鬼ですね。

|const修飾の仕方|違い|
|---|---|
|const int x| xの値は変更できない（=不変，=immutable） |
|int const x| 同上 |
|const int* x| xの値は変更可能。*xは変更不可能。ポインタは書き換え可能 |
|int* const x| xの値は変更不可能。*xは変更可能。ポインタ先の変数書き換え可能 |
|const int* const x| xの値も*xの値も変更不可能。 |
|const int** x| もうめんどい。constおじさん見て。 |
|int* const* x| もうめんどい。constおじさん見て。 |
|int** const x| もうめんどい。constおじさん見て。 |
|int const** const x| もうめんどい。constおじさん見て。 |
|int* const* const x| もうめんどい。constおじさん見て。 |
|int const* const* x| もうめんどい。constおじさん見て。 |
|const int** const x| もうめんどい。constおじさん見て。 |
|const int* const* x| もうめんどい。constおじさん見て。 |
|const int* const* const x| もうめんどい。constおじさん見て。 |


## &が関数を修飾して，constとも関連して

&とconstがつくメンバ関数の呼び出し方の違いは下記のようです。

|メンバ関数の型|違い|
|---|---|
|f(x) & | *thisがlvalueの時呼ばれる|
|f(x) && |*thisがrvalueの時呼ばれる|
|f(x) const & |*thisが const lvalueの時呼ばれる|
|f(x) const && |*thisが const rvalueの時呼ばれる|
|f(x) | 上記の対応がないときに呼ばれる（要検証）|

# 右辺値？左辺値？

「lvalueは名前付きのオブジェクト、rvalueは一時的に生成される無名のオブジェクト」と表現されることがある。でも調べてみるとやっぱりいろいろ不具合があるっぽい。例えば下記のパタンが上記解釈では例外になる。

- ヒープに確保したオブジェクトは名前がないlvalue
- 配列の要素も名前のないlvalue

自分は**「lvalueはアドレスをコンパイラが意識しているがrvalueはアドレスをコンパイラが気にしていない。」**という解釈で理解しようと思う。
JavaScriptでループの中で非同期処理を書く

for文やmap関数の中でasync/awaitを使うときの書き方をメモします。
各非同期処理を逐次的に実行する方法と、非同期的に実行する方法の2つがあります。

#### 1. 同期的に実行
![キャプチャ2.gif](https://qiita-image-store.s3.amazonaws.com/0/93999/10fc997f-0804-5d3e-01f4-1b3f8c813b44.gif)

#### 2. 非同期的に実行
![キャプチャ2.gif](https://qiita-image-store.s3.amazonaws.com/0/93999/7e52e301-fa5d-87bb-39a2-ec35adeb29d5.gif)

awaitを使いたい非同期処理は以下

``` sleep.js
// 引数に指定した秒数だけ待つsleep関数
// Promiseを返す
function sleep(second) {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve()
        }, second * 1000)
    })
}
```

## 1. 同期的に実行する方法

for文の中で`await`を使って書くと、forループの中身を順番に処理してくれるので、同期的に実行してくれます。ここではカウンタを使ったfor文を書いていますが、`for .. of`文を使っても同じ挙動になります。

``` syncLoop.js
async function syncLoop() {
    // 1~5までのランダムな整数の配列を生成
    const ran_arr = Array(5).fill(0).map(() => Math.floor(Math.random() * 5 + 1))
    
    // for文を使ってループ処理する
    for (let i = 0; i < ran_arr.length; i++) {
        await sleep(ran_arr[i]) // n秒待つ
        console.log(i+1 + "番目の処理が完了！！" + "待ち時間は" + ran_arr[i] + "秒！！")
    }
    console.log("終了！！")
}

// 実行
// awaitはトップレベルで使うことができない(ES2017時点)ので
// asyncをつけた即時関数を作って呼び出している
(async ()=>{
    console.log("同期的に呼び出す")
    await syncLoop()
}).call()
```

## 2. 非同期的に実行する方法

mapを使います。mapの引数に指定する関数を`async`関数にしておくことで、mapの中で呼ばれる処理を非同期に実行しつつ、mapの返り値である`Promise<void>[]`を`Promise.all()`関数で待ち受けることで、 すべての処理の完了を待つことができます。

``` asyncLoop.js
async function asyncLoop() {
    // 1~5までのランダムな整数の配列を生成
    const ran_arr = Array(5).fill(0).map(() => Math.floor(Math.random() * 5 + 1))
    
    // mapを使ってループ処理する
    await Promise.all(ran_arr.map(async (n, i) => {
        await sleep(n) // n秒待つ
        console.log(i+1 + "番目の処理が完了！！" + "待ち時間は" + n + "秒！！")
        return
    }))
    console.log("終了！！")
}

// 実行
// awaitはトップレベルで使うことができない(ES2017時点)ので
// asyncをつけた即時関数を作って呼び出している
(async ()=>{
    console.log("非同期的に呼び出す")
    await asyncLoop()
}).call()
```

1番目の方法は次のループの処理をブロッキングしてしまうので、基本的には2番目の方法を使っておいて、どうしても非同期処理の実行順序を制御したいときのみ1番目の方法を使うのが、性能的な面で良いと思います。

以上
Flaskチュートリアル

## インストール
pythonでのWebフレームワークの中でも、軽量のFlask。

まずは手持ちのRaspberry PiでFlaskを触ってみようと早速インストール

```
$ pip3 install flask
$ pip3 install Werkzeug
```



## 必要に応じてファイアーウォールの基本設定

Raspbianにはデフォルトでは入っていないので、今回はインストールから始めて、ポートを許可しておきました。

```
$ sudo apt install ufw
$ sudo ufw allow 5000
```

#参考文献
[Flaskの簡単な使い方 - Qiita](https://qiita.com/zaburo/items/5091041a5afb2a7dffc8)
他にも[公式docs](http://flask.pocoo.org/docs/1.0/)を参考に作っていきたいと思います。

#制作したプロダクト
[【画像認識】自己商品（作品）紹介システム（その2 | Flaskで爆速WebApp化） - Qiita](https://qiita.com/p3ishnm2/items/28ab6ce2e884aa4fe7f6)
twitterをw*rdっぽくするchrome拡張を作ろう

　
クリスマス関係なくてすいません。

# 初めに

皆さん、職務中にTwiiterを堂々とやりたいと思ったことはありませんか？
或いは上司に見つかるリスクに怯えながら人知れずやっていたりした事はありませんか？

私はないです。
Twitter見る専ですし。

でも実際そう思ってた方は多いんじゃないでしょうか。
実は先日、そんな皆さんにとって衝撃的なニュースが飛び込んできました。

[業務中に堂々Twitterしたい！→TwitterをSlack風に表示できるChrome拡張を開発する天才的サボリ](http://nlab.itmedia.co.jp/nl/amp/1811/20/news128.html)

これはすごい。作者さんは天才に違いないですね。
ただ残念な事に、このChrome拡張はまだ一般公開されていないとの事。残念。我々にはやはり職務中にTwitterをやる権利はないのか。
...否、我々はプログラマです。原理が分かればこれと同じようなものを自前で作れるのだ！
というわけで作っていきましょう。

# なぜW*rd？

全く同じもの作っても面白くないのと、あとSlackって導入してない会社も有るんじゃないかと思って信頼と安心の某M社製品にしました。某M社から怒られないように表向きはLibreOfficeを参考にしたということにしましょう。(裏向きは2016)

# 完成イメージ

<img width="960" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/263653/564e2c42-60b8-6ecb-3699-f657288b8944.png">


完成品はこちらにおいて置きますが...自分で作ったということにしておいて下さい。これから作り方教えるので。

https://github.com/gmshiba/t2w

# 制作開始

まず作業用のフォルダを作りましょう。で、配下にtwitterフォルダとimgフォルダを置きます。
そしてmanifest.jsonを置きます。
manifest.jsonには以下みたいな感じで書いて下さい。これでこのディレクトリは拡張機能として認識出来るようになります。

```json
{
    "name": "t2w",
    "author": "gmshiba",
    "description": "Make Twitter's screen look like w*rd.",
    "version": "0.1.0",
    "manifest_version": 2,
    "web_accessible_resources": ["img/*"],
    "permissions": ["storage"],
    "content_scripts": [
        {
            "matches": ["https://twitter.com/*"],
            "css": ["twitter/style.css"],"js": ["twitter/script.js"]
        }
    ]
}
```

そしたらCSSとJSのファイルをtwitterフォルダに置きます。
基本的には書き換えたい要素のスタイルを検証で探して、それをCSSで上書きしていく形になります。スタイルがかち合う場合は元のスタイルが優先されるようなので```!important```をつけましょう。

```css
/* twitter臭がするのでハッシュタグは色なしにしてしまいましょう */
b, s {
    font-weight: bold !important;
    color: #000 !important;
}
```

問題は既に```!important```が付いている要素の書き換えです。これは仕方ないのでJSでDOMごと書き換えてしまいましょう。
jQueryとか引っ張ってきて使うのも面倒なので生のJSのメソッドを使います。

```javascript
document.head.insertAdjacentHTML('beforeend', '<style>.u-size1of3 { width: initial !important; }</style>');
```

で、色々書き換えたものがこちら。(途中の書き換えたCSSはgithubにあがってるやつを参考にしてください)

<img width="960" alt="スクリーンショット (57).png" src="https://qiita-image-store.s3.amazonaws.com/0/263653/3a0fdcf7-9dcc-d716-9dfa-8edf6f72f6fc.png">


まぁ最初に比べればだいぶそれらしくなりましたが、やっぱりW*ordのナビゲーションバーがないとまだ全然ですね。
でも流石にあれをCSSで作るのはきついのでハリボテの画像を貼り付けましょう。どうせダミーですし。画像などのリソースを使用するにはmanifest.jsonのweb_accessible_resourcesに使用したいリソースを追加すれば良いです。さっきのmanifest.jsonにすでに記述されています。
で、画像を差し込むためのコードです。Chrome専用のAPIを使用します。

```javascript
var nav = document.querySelector('.global-nav-inner');
nav.insertAdjacentHTML('afterend','<div id="navbar-w"></div>');
var image = document.createElement('img');
image.src = chrome.extension.getURL('img/navbar.png');
image.style.width = '100%';
image.alt = 'navbar';
document.getElementById('navbar-w').appendChild(image);
```

imgフォルダに画像があればこれで表示されるはずです。
ナビゲーションバーと、あと横のメモリも画像として貼り付けましょう。

これで最初の完成イメージになります。
```chrome://extensions```から拡張機能の管理画面に飛んで、デベロッパモードにしてからフォルダを画面にドラッグアンドドロップすると拡張機能として登録できます。
F11で全画面表示にするとさらにそれっぽくなりますよ。
それでは皆さん良きツイ廃ライ...クリスマスを。
Rustの非同期フレームワークtokioを少しずつ試しながら勉強する　その１

この記事は、[Rust Advent Calendar その２](https://qiita.com/advent-calendar/2018/rust2) の25日目の記事です。

tokioいいらしいよ！という話を、最近良く聞くので、試してみようとしたんだけど、どうやって使ったら良いのかわからない・・・
サイトのサンプルとか見てみたけど、Futureとかよくわからない・・・
そんなお悩みのあなたに！！

私も最初そうでした。
で、少しずつ動かしながらやってみたら、だんだんわかってきたので、その軌跡をここに残しておきます。

*対象読者*
- Rustの基本的な構文がわかっている人。実際にコーディングしたことがある人。
- tokio による非同期処理の実装方法を知りたい人。


> *注意事項（2019.8.19追記）*
> 本記事で使っている Future は、futures-rs( https://github.com/rust-lang-nursery/futures-rs )の0.1です。
> 今は Future もstdに取り込まれ、async/await も実装間近ですので、この記事の内容は参考程度に考えてもらうと良いかもしれません。


### tokio
tokioのサイトはこれ。
ソース眺めたりするのに、手元に git clone しておくと良い。
https://github.com/tokio-rs/tokio

### 準備
プロジェクトを作ったら
Cargo.tomlを編集して、依存ライブラリに tokio と futures を追加

```toml
[dependencies]
tokio = "0.1.13"
futures = "0.1.25"
```

### なにはともあれ tokio::run してみる

https://github.com/tokio-rs/tokio
ここにあるサンプルを見てみると、main()の最後に

```Rust
// Start the Tokio runtime
tokio::run(server);
```

とある。
server は何者かわからないが、とにかくこれで tokioランタイムを起動する、ということらしい。


さて、tokio::run()の引数は何を要求されるのだろう？リファレンスを見てみる。
https://docs.rs/tokio/0.1/tokio/runtime/fn.run.html

```Rust
pub fn run<F>(future: F) 
where
    F: Future<Item = (), Error = ()> + Send + 'static, 
```

とある。
Future!!! つまり未来！！
未来って何？

またリファレンスを見てみる
https://docs.rs/futures/0.1.2/futures/trait.Future.html

```Rust
pub trait Future {
    type Item;
    type Error;
    fn poll(&mut self) -> Poll<Self::Item, Self::Error>;

    fn wait(self) -> Result<Self::Item, Self::Error> where Self: Sized { ... }
    fn boxed(self) -> BoxFuture<Self::Item, Self::Error> where Self: Sized + Send + 'static { ... }
//この下にずっと、たくさんメソッドが書いてある
```

Futureはトレイト。メソッドがいっぱいあって、なんじゃこりゃあ！ってなるけど、よく見ると、Required Method（＝こちらで実装しないといけないメソッド）は、

```Rust
fn poll(&mut self) -> Poll<Self::Item, Self::Error>
```

だけ。
あと、関連型として、ItemとErrorを定義せよ、とある。

んーじゃあ、試しに Future を実装する struct を作ってみますか。

その際考えないといけないのは、
- Itemに何を指定するか
- Errorに何を指定するか
- poll() の中で何をするか
- poll() は何を返せばいいか

Item, Error... 何を意味するのかは置いといて、もう一度 tokio::run() の定義を見てみると、


```Rust
pub fn run<F>(future: F) 
where
    F: Future<Item = (), Error = ()> + Send + 'static, 
```

Item = (), Error = () とある！じゃあどちらも () にしとけば良いってことね。

poll() の中で何をするか。とりあえず println! でなんか書いておこう。

poll() は何を返せばよいか。定義によると、

```Rust
fn poll(&mut self) -> Poll<Self::Item, Self::Error>
```

poll は Pollを返せと。

・・・・解せぬ。
Pollの定義を見てみる。

```Rust
type Poll<T, E> = Result<Async<T>, E>;
```

説明によると
> Ok(Async::Ready(t)) ----- 成功！
> Ok(Async::NotReady) ----- まだ結果が取れてない！
> Err(e) ----- 失敗した！

このどれかを返せということらしい。
んじゃ、まずは成功を返しとけばいいか。

ということで、できたソース。

```Rust
use tokio::prelude::*;  //tokioでよく使うものをまとめて使えるようにする

struct FutureTest {
}

impl Future for FutureTest {
    type Item = ();
    type Error = ();
    fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
        println!("poll called!");
        Ok(Async::Ready(()))
    }
}

fn main() {
    let f = FutureTest{};

    tokio::run(f);
}
```

出力
```poll called!
```

poll呼んでくれた！

・・・で、これ何が嬉しいの？
その２につづく。

今回作ったソースはこちら
https://github.com/mas-yo/learn-tokio-step-by-step/tree/master/learn-tokio-1


その２
https://qiita.com/mas-yo/items/c5cbfe4dfbbe1cd9f947
QiitaにHelloWorld!

# はじめに
製造系の会社で開発の仕事をしているdadaと申します。
最近は直接開発というよりも、開発インフラの整備が多い気がしていますが。
Qiitaの記事にはかなりお世話になってきましたが、自分で備忘録を兼ねて描いてみようと思いました。

#興味のある分野
##プログラミング言語
- C++ : 仕事でメインで使っている言語
- Shell Script : 自動化のためのスクリプト作成
- python : shの代わりに使ってみたら使いやすくて勉強したいと考えてます

##インフラ関係
- Docker
- Jira 
- Bitbucket
- Confluence
- Jenkins

#ついでに
HelloWorldということで、ちょっと**Markdown**の練習をしてみようと思います。

>引用してみたり

- スクリプトを描いてみたり

```shell:test.sh
#!/bin/bash
echo "Hello World!"
```

- DockerFileをおいてみたり


```docker:Dockerfile
FROM nginx

ARG SSH_KEY

# apt-get
RUN apt-get update && \
    apt-get install -y vim && \
    apt-get install -y git && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# get setting file
WORKDIR /root
RUN git clone https://github.com/dada4386/linux_setting.git &&\
    cp -ra linux_setting/. . &&\
    rm -rf linux_setting
```

昔のWikiみたいで書きやすくていいですね。
5Gに期待するところ

#はじめに
この記事は[トレタアドベントカレンダー](https://qiita.com/advent-calendar/2018/toreta)19日目の記事です。

トレタにてフロントエンドで働いています。
なぜフロントエンド開発者が5Gについて気になっているかといいますと光遅い問題に起因しています。
インターネットの仕組みではブラウザなどのクライアントがサーバーからデータを取得して表示させます。
サーバーとは物理的に離れているため必ず時間がかかります。
例えば、クライアントが日本でサーバーがアメリカにある場合は200msほどの時間がかかります。

これではせっかく性能の良いサーバーを使ったとしてもクライアントまでの距離のせいでレスポンスが遅いということがあります。
これではリアルタイム性が必要なアプリケーションやコンテンツでは魅力が半減してしまいます。

#5Gを使えば
端末の速度で10Gbps以上
1ms以下の低遅延
同時接続デバイスの多量化
基地局でのMECなどです。

速度増加は動画などのデータ量が多いコンテンツには嬉しいです。
低遅延では自動運転や遠隔手術、ドローンの操作などが期待されています。
同時デバイス多量化では多量のIoTデバイスやイベントなどで一箇所に集まっても問題なく通信が行えるようになります。
そして、一番気になっているのがMobile Edge Computingになります。

#Mobile Edge Computing
MECは5G基地局からインターネットに繋がる間にサーバーなどのリソースを置けます。
<img width="648" alt="スクリーンショット 2018-12-19 19.24.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/5303/68aac34d-7160-0225-a016-96f733b3013c.png">
https://www.etsi.org/images/files/ETSIWhitePapers/etsi_wp28_mec_in_5G_FINAL.pdf

５Gの低遅延や速度を最大限発揮することが出来ます。

例えば、イベントでの動画をほぼリアルタイムに端末に送ったり、CDNとして利用することにより、初回のアクセスでもすばやくサイトを表示することが可能です。
これまでにいくつかの実証実験はされており、実際のサービスインにはどうなるのかが楽しみです。

https://tech.nikkeibp.co.jp/dm/article/WORD/20150605/421863/
http://pr.fujitsu.com/jp/news/2017/10/12-1.html

しかし、実証実験段階のためボトルネックや実際に理論通りにできるのかなど課題はたくさんありそうです。
先日行われたHTML5 Conference 2018では`HTTP の今と未来 ー BBR, HTTP/2, QUIC の基礎から 5G 試験ネットワークでのブラウザベース評価試験まで`というセッションが行われ、世界で初めての調査結果を発表されました。
少し長いですが、現状がしれてとても良い資料です。
[HTTPの今と未来 HTTPの基礎から５G試験 ネットワークでの評価まで](https://www.slideshare.net/dynamis/httpp-and-5g-fixed1)

#まとめ
5Gの技術はキャリアなどの垣根をなくしてサービス提供者も利用者も享受できる
インターネッツで仕事している人は全員知っていないとマジヤバイ。

#資料
[5G（第5世代移動通信システム） | 企業情報 | NTTドコモ](https://www.nttdocomo.co.jp/corporate/technology/rd/tech/5g/)
[5G | エリア：スマートフォン | au](https://www.au.com/mobile/area/5g/)
[5G（第5世代移動通信システム）に向けたソフトバンクの取り組み | 法人のお客さま | ソフトバンク](https://www.softbank.jp/biz/5g/)
[5Gにおける MEC (Mobile Edge Computing) の概要](https://qiita.com/osaphex/items/99f673924a8f236a10f7)
[小売業におけるマルチアクセス・エッジ・コンピューティング (MEC)](https://www.intel.co.jp/content/www/jp/ja/communications/multi-access-edge-computing-brief.html)
cocos2d-xをLinuxにGitHubの方からインストールする（追記あり）

# 動機
急にカレーが食べたくなったのでcocos2d-xをインストールすることにしました。
嘘です。
C++のコードを書きたくなりました。
あとゲームフレームワークというものに興味があります。

cocos2d-xの[公式サイト](http://www.cocos2d-x.org/)に行って、ダウンロードページでcocos2d-x-3.17.zipを右クリックしてダウンロードを選ぶと、残念！中身はhtmlです！
普通にクリックするとダウンロードが始まります。けどこれはsが付かない普通のhttpです。
ハッシュも見当たりません。
こんなものは神が許してもRMSが許しません。
幸いにしてGitHubへのリンクがありました。
もちろんこっちはhttpsです。

## 取得
`git clone https://github.com/cocos2d/cocos2d-x.git`
で持ってきます。

## 依存パッケージのインストール
`./install-deps-linux.sh`を実行することになるのですが
中身を見るとsudoしてます。httpでコレは怖いです。

俺の環境だと修正が必要でした。
> -DEPENDS+=' libpng12-dev'
> +DEPENDS+=' libpng-dev'
> +DEPENDS+=' cmake'

あと--force-yesはよくないそうです。
> -sudo apt-get install --force-yes --yes $DEPENDS > /dev/null
> +sudo apt-get install --yes $DEPENDS > /dev/null

ここで安定版に切り替えます。
（install-deps-linux.shは最新のほうがすっきりしてるので先に実行しました）
`git checkout -b stable refs/tags/cocos2d-x-3.17`
以降の処理はsudoしないので比較的安全です。
`python download-deps.py`
そして
`git submodule update --init`

## 設定
`./setup.py`を実行すると.bashrcを書き換えてくれます。
なので一度抜けるか`source ~/.bashrc`を実行します。

## 実行
どこかにプロジェクト用のディレクトリ（仮にProjectsとします）を作ってから`cocos new MyGame -p com.your_company.mygame -l cpp -d Projects`とか実行するとcmakeでずんずんビルドして最後に実行されます。
ロゴが出るだけのデモですが。

## 感想
ゲームフレームワークとしての実力はまだ試していませんが、HTTPでダウンロードしてsudoとかセキュリティ的に雑な感じがしました。

## 追記
以前から問題視されていたのでしょうか？これを書いてから一ヶ月もしないうちに公式サイトがhttpsに移行しました。
SmalltalkJenga

# きっかけ
Smalltalk歴は半年程度なので最初は「Smalltalk初心者から見たSmalltalkについての小話」的なものを書こうと思ったのですが、簡単にできて面白そうなネタを提供していただいたのでこちらで[Smalltalk Advent Calendar 2018](https://qiita.com/advent-calendar/2018/smalltalk)の19日目に参加させていただきます。

Smalltalkはダイナミックなプログラミング環境が大きな特徴の一つですよね。自作のクラスだけではなく標準のクラスを拡張してシステムそのものの挙動を変えることもできてしまうため、強力な反面使い方を誤るとシステムが壊れてしまう場合もあります。

……しかし、その「システムが壊れてしまう」タイミングというのはいったいいつなのでしょうか？ どれくらいのクラスが残っていればシステムは無事に動いていられるのでしょうか？

そんな疑問に答えてくれるのが[SmalltalkJenga](https://gist.github.com/KazunoriUeda/8ac1842756a5f21939e3126ae0c5e82e)です。
Smalltalkのクラスをジェンガのピースに見立て、ランダムにシステムから消していく。たったそれだけのプログラムです。

※1 実際に遊ぶ際は`"target removeFromSystem."`というコメントアウトしているクラスを削除している部分を元に戻してください。
※2 Smalltalkは書き慣れてないのでソース自体にツッコミどころが満載かもしれませんがご容赦ください。
※3 今のところ動作確認はPharo 7.0 - 64bit(development)でしかしていません。

## SmalltalkJengaの遊び方
[こちら](https://gist.github.com/KazunoriUeda/8ac1842756a5f21939e3126ae0c5e82e)のファイルをSmalltalkに取り込み、Playground/Workspaceで

```
SmalltalkJenga play.
```
を実行すると、Transcriptに

```
Turn 1!
Delete IceBitbucketRepositoryType!
```

という風にターン数とランダムなクラス名が表示され、該当クラスが削除されます。
目指せ全クラス制覇！（Pharo7だとこのクラスを除いて記事執筆時点で7814個クラスがあるようです）

最初に試してみた際には18回目で`ClyClassHierarchy`というクラスが消えたことによってエラーが発生し、まともにソースコードが見れなくなってしまいました（一応システム自体はフリーズしていないのでまだ生きていると言えば生きているのですが）。

![スクリーンショット 2018-12-19 18.31.35.png](https://qiita-image-store.s3.amazonaws.com/0/323383/217bf3ef-200b-d6ff-3700-9262fc05faef.png)

名前から推察するにどうやらシステムブラウザのCalypsoのクラス階層関連のクラスでしょうか。これが消えたことでシステムが深刻なダメージを受けたようです。
ちなみにもっと重要なクラス(例えば`Object`とか)を消してしまうと致命傷を受けてシステムがフリーズします。
再起動した時に最後のセッションを復元するかどうか聞いてきますが絶対にNoと答えましょう。

## 今後の展望
Smalltalkにまだ慣れきっていないので今回は完全にランダムにクラスを消すだけですが、今後はもう少し対話的に入力して消すクラスを指定できるようにしていきたいと思います。
プレフィックスや正規表現を入力させて一気にクラスをまとめて消せるようにしたり、一度にたくさんクラスを消すと高得点になったりとかすると面白そうです。
他にも改善点やこうすると面白そう、といったご意見等あればぜひ教えていただければと思います。

あと結局「システムが壊れてしまう」のがどのくらいかについて明確な回答を用意できていないので、自動化して平均どれくらいまでクラスが消えても大丈夫なのかを調べたり、
機械学習等でシステムが壊れない消し方を学習させて実際にどれくらいまでクラスを削減できるのか試してみたりできたら良いな、と思います……毎回システムがクラッシュしてしまうので難しい気がしますが。

余力があれば冒頭で触れていた「Smalltalk初心者から見たSmalltalkについての小話」的なものも今年のAdvent Calendarで書いてみたいと思います。

それでは。
iTerm2でQuicklookを使う

# 概要
macOS用のターミナルアプリ、iTerm2ではQuicklookが使えます。もうcat/batいらず。

# 使い方
ファイル名、URLなどをTapticエンジン搭載のトラックパッドで、深く押し込むだけ。
![output.gif](https://qiita-image-store.s3.amazonaws.com/0/132881/51fb0a7e-d013-efd6-1a50-ed923bb55bc6.gif)
GitHubの使い方

<h1>これを説明する上で</h1>
GitHubにおける操作を行った上での話になる
→詳細はこれの前に上げている『githubでひとまずレビューしてもらう』で

<h1>GitHubのリモートリポジトリによる変更確認</h1>
ローカルディレクトリ（ローカルレポジトリ）で内容を変更したら、リモートリポジトリのほうに変更確認のメッセージが届くので、上のFetch originをクリックしリモートリポジトリのほうの変更を認める
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309084/50c728f2-40ac-1bc6-f4b2-5265ec7c2362.png)

<h1>レビュー者の確認</h1>
レビュー者が被レビュー者に対してクラウド上でコードを修正すると、GitHubのホーム上でPull Requestsが届くので確認する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309084/c747c72e-62ae-e1b5-7f49-fdc3ea5bb1f2.png)

<h1>変更内容の確認と承認</h1>
Pull Requestsをクリックするとレビュー者のメッセージが届いているので、それを開き、内容の変更を確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309084/21e68b55-42b5-41b3-62ae-22860808009f.png)

変更した内容を確認したら、下のmerge pull requestを開いてconfirm mergeをクリックする。内容の変更がネット上で承認されたことになる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309084/ce21aba2-f66b-3107-dd2c-992044cf5838.png)　　⇒　　　![image.png](https://qiita-image-store.s3.amazonaws.com/0/309084/041735d8-62d7-8801-824c-70a0d68ec796.png)

<h1>ローカルに落とし込む</h1>
次にネット上で承認された変更をローカルにも落とし込む作業が必要になってくる。
リモートリポジトリを開くと、pull originがきていることが分るので、クリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309084/35edb156-5547-3889-c0e2-5fdcef2b7d58.png)

ついでにfetch originもクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309084/391d53bd-8302-ce1c-7cf4-e59717a23b96.png)

ローカルの変更も完了