OmniAICreator/Qiita-1.07M huggingface dataset:
企業におけるデータ活用のフェーズをまとめてみる

# はじめに

この記事は、これまでに自分が学んできた知識をもとにデータを駆使する企業の段階を6つにわけた結果をまとめたものです。現時点での自分の思考整理が目的なので、後々更新される可能性があります。

# 企業におけるデータ活用のフェーズ

![数値分析関連事項の再定義.png](https://qiita-image-store.s3.amazonaws.com/0/94249/cea3c4a3-2cd4-8334-0146-9f81ffb6b9ee.png)

## 個

組織としてデータの活用をしておらず、個人が表計算ソフトなどを使用して、PCでデータを集計している段階です。KKDで意思決定をしているので全くデータをみない企業、データリテラシー以前にITリテラシーが低い企業はこの段階にいるでしょう。

この段階が次の段階に進むには、IT部門を設立する必要があるでしょう。もし、IT部門があるのにも関わらず、個の段階にいるのであれば、コーポレート部門とIT部門を橋渡しするための組織的な改善が必要かと思われます。基幹システム内にはデータが蓄積されているはずなので、適当な基幹システムが導入できていないか、コーポレート部門のITリテラシーが低いためにうまく活用できていない可能性があります。

## 村社会

特定の事業の中でのみデータ活用がなされサイロ化している段階です。この段階では、リレーショナルデータベースに必要なデータが蓄積されていることが多いです。

事業規模が小さいうちは全く問題ありませんが、事業規模が大きくなるに従って、リレーショナルデータベースのパフォーマンスが直接データ分析の性能限界になってしまう問題や、データが分断されているために事業横断でのシナジーを生めないという問題が起こります。

とはいえ、ニーズがないのに、最初からデータレイクを作るのは、過大な投資になってしまう恐れがあるため、オススメはしません。

## 中央集権

組織横断的なデータ活用のために、中央集権的なDWHやデータレイクが構築されている段階です。HadoopクラスタやAmazon Redshiftに多様なデータを大量に蓄積し、全量分析を行います。ビッグデータ活用と呼ばれるのは、この段階からでしょう。

この段階で、扱うデータの量と多様性が急激に増加し始め、データエンジニアやアナリストといったデータ関連の専門職が欲しくなります。

中央集権は、データが一元的に蓄積・管理される利便性があるものの、社内から依頼がデータエンジニアやアナリストに集約されるようになり、人手不足でデータ活用の速度が逆に低下する問題が起こります。人手不足を解消しようにも、データ関連の専門職は業界全体で大きく不足しています。AWS Redshiftといったクラウドサービスを利用し、必要なデータエンジニアを減らしたりするのも手ですが、データリテラシーを高める教育ができていないと、青天井にデータを蓄積したり、コンピューティングリソースを無駄に浪費してしまい、却ってお金がかかってしまうかもしれません。

## 民主化

セルフサービスBIツールなどを使用して、利用者がDWHやデータレイクを自前で利用できるようになっている段階です。中央集権における人手不足の問題が、利用者が参加することで改善されます。この段階では、社内でTableauやQlik、Power BIなどが普及しています。

しかし、人手不足の問題が解決する一方で、ガバナンスの問題が立ち上がります。利用者が個々にデータを生産するために、重要な意思決定の場で個人が試しに作ったデータが使われてしまったり、部署毎に同じ目的で異なる定義のデータが乱立してしまったりします。

誤ったデータによる意思決定は、データ活用によって得られる利益よりも大きな損害を生む恐れがあります。

## オーケストレーション

エンタープライズデータガバナンスが導入され、データの発生から消費までのデータパイプラインのオーケストレーションが適切に行われるようになっている段階です。この段階になると、社外のデータ連携も、ある程度安全に行えるようになります。

データの重要性に応じて、データクオリティSLAが適切に定義され、エンタープライズデータハブが設計されたりします。データが事業の中核を担うようになるため、社内でのデータ活用のロードマップの重要性が増します。このため、データ活用を統括するChief Data Officer（CDO）オフィスの設立が検討されるようになります。

また、ここまでくると、データサイエンティストのような、データから新たな価値を創出するような研究者に近い人材が、より欲しくなります。（この段階に至っている時点で、十二分に経営層がデータの重要性を理解しているので、データサイエンティストは自前で抱えているはずですが。）

## データ主導

機械学習などの技術により、人の業務の一部を学習した機械が代替する段階です。コンテンツフィルタリングが自動化されていたり、データディスカバリにより事業の課題点を自動的に可視化したり、履歴書の合否判断が自動化されたりと、データが事業の中に大きく組み込まれていきます。

この段階での問題は、データの活用をどこまで推進すべきかという倫理的な問題です。ビジネスにあまりに特化してしまい、倫理的な誤りを冒さないよう[Ethical OS](https://ethicalos.org/)などを参照し、倫理面からのガバナンスも進めるべきでしょう。

# おわりに

この段階分けが正しいとは思っていませんが、こういった定義を自分でしておくことにより、より仕事を進めやすくなると思っています。もし、自分のこの拙いまとめが、他の方のインスピレーションに繋がればなお嬉しく思います。
Python+Flask+MySQL on WindowsではじめるWebアプリ開発 #Step1

# はじめに

- 初心者が簡単なWebアプリを開発していきます。
- 手順をStep-by-Step方式で記載していきます。

# 開発環境

- Windows10 Home
- Python3.7.0 (pip 18.0)
 - Flask 1.0.2
 - Jinja2 2.10

# 仮想環境の構築
- venvにて仮想環境を構築する。

```txt
C:\pystudy\lesson-flask>python -m venv step1
```

# 仮想環境の有効化
```txt
C:\pystudy\lesson-flask>step1\Scripts\activate
```

# pipのアップグレード

```txt
(step1) C:\pystudy\lesson-flask>python -m pip install --upgrade pip
Collecting pip
  Using cached https://files.pythonhosted.org/packages/5f/25/e52d3f31441505a5f3af41213346e5b6c221c9e086a166f3703d2ddaf940/pip-18.0-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 10.0.1
    Uninstalling pip-10.0.1:
      Successfully uninstalled pip-10.0.1
Successfully installed pip-18.0
```

# Flaskをインストール

```txt
(step1) C:\pystudy\lesson-flask>pip install flask
Collecting flask
  Using cached https://files.pythonhosted.org/packages/7f/e7/08578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4b/Flask-1.0.2-py2.py3-none-any.whl
  :
  :
 Installing collected packages: Werkzeug, itsdangerous, MarkupSafe, Jinja2, click, flask
  Running setup.py install for itsdangerous ... done
  Running setup.py install for MarkupSafe ... done
Successfully installed Jinja2-2.10 MarkupSafe-1.0 Werkzeug-0.14.1 click-7.0 flask-1.0.2 itsdangerous-0.24
```

# インストールパッケージの確認

```txt
(step1) C:\pystudy\lesson-flask>pip freeze
Click==7.0
Flask==1.0.2
itsdangerous==0.24
Jinja2==2.10
MarkupSafe==1.0
Werkzeug==0.14.1
```

# Hello Flask
## アプリケーション

```py:hello.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def main():
    return 'Hello World.'

if __name__ == '__main__':
    app.run(debug=True)
```

## 環境変数の設定

```txt
(step1) C:\pystudy\lesson-flask>SET FLASK_APP=hello.py
```

## サーバの起動

```txt:flask実行
(step1) C:\pystudy\lesson-flask>flask run --debugger --reload
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 430-658-122
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```

## Webブラウザにてアクセス

- [http://localhost:5000](http://localhost:5000)

![flask-fig0.png](https://qiita-image-store.s3.amazonaws.com/0/89366/f02f52bb-620d-7c33-ace6-cf4c91db5dff.png)

## サーバーの停止

```txt
Ctrl+c
```

# 仮想環境の無効化
```txt
(step1) C:\pystudy\lesson-flask>step1\Scripts\deactivate
```

# 今回のまとめ

- flask runで起動するには、環境変数**FLASK_APP**にファイル名をセットする。
- または、ファイル名を**app.py**にする。

```txt
Error: Could not locate a Flask application.
You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.
```

- 開発サーバは本番環境では使わない。

```txt
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
```

# [Step2](https://qiita.com/sireline/items/b29a90a350a1171fabc2)で実施すること
- テンプレートを使ってみます。

# 参考リンク
- [Flask](http://flask.pocoo.org/)
- [Python](https://www.python.org/)
Spring AOP の 単体テストを行う方法

# やりたいこと
Spring AOPで作った業務横断的な処理を持ったクラスを単体でテストしたい。

# Spring AOP の仕組み（ざっくり）と単体テスト時の問題点
Spring AOPはDIを基に成立っており、コンポーネントを使う側がproxy(コンテナに登録したBeanそのものではなく、そのBeanに対しAOPで定義した機能を拡張(enhance)させた)インスタンスをインジェクトすることにより、AOPを実現します。
![aop.png](https://qiita-image-store.s3.amazonaws.com/0/294714/675be2e9-03c2-0b80-ace8-0f23009d34ac.png)

しかしながら、今回やりたいのは単体テストなので、DIコンテナを起動させず、コンテキストに依存しないでテストをする方法を用意したいと思います。

# 今回用意したサンプル
引数に`null`があれば`NullPointerException`を投げる処理をAOPで実装して、`TestService`（テスト用クラス）クラスのメソッドに適用させます。(NullCheckアノテーションは単なるマーカーなのでここでは省略します。)

``` java:AspectLogic.java

@Aspect
@Component
public class AspectLogic {
	@Around("@annotation(NullCheck)")
	public Object invoke(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
		System.out.println("NullCheck!!");
		Stream.of(proceedingJoinPoint.getArgs()).forEach(Objects::requireNonNull);//全引数を取得してObejcts::requireNonNullでチェック
		return proceedingJoinPoint.proceed();
    }
}

```
``` java:TestService.java

public class TestService {
	@NullCheck
	public void doSomething(Object arg) {
	}
}
```

# AspectJProxyFactoryからproxyを取得する。
Spring DIがBeanからproxyを取得する部分を自前で実装しましょう。`AspectJProxyFactory`のインスタンス
に今回作成したAspectなクラスをaddします。
ファクトリから取得したproxyを使ってテストサンプルメソッドを叩くと、AOPで定義した処理が呼ばれ、`NullPointerException`が投げられていることが確認できたかと思われます。

``` java:TestAspectLogic.java
public class TestAspectLogic {
	@Test
	public void testAspect() {

		AspectJProxyFactory factory = new AspectJProxyFactory(new TestService());
		factory.addAspect(new AspectLogic()); //ここでAspectLogicクラスを適用
		TestService proxy = factory.getProxy();

		try {
			proxy.doSomething(null);
			failBecauseExceptionWasNotThrown(NullPointerException.class);
		} catch(NullPointerException npe) {
		}

	}
}

```

```:出力
NullCheck!!
```

# まとめ
AOPもしっかりテストを書きましょう。
デザインパターンについて

# デザインパターンとは
- オブジェクト指向プログラミングにおける再利用性のある設計パターンのこと

## デザインパターンの恩恵
- 車輪の再発明を行うことなく、ベストプラクティス体得することができる
- 再利用性の高いコードを書くことができ、結果的にオブジェクト指向プログラミングの生産性や信頼性の向上を得ることができる
- 「よく出会う問題とそれに対処する良い設計」を知っていれば、良い設計をスムースに進めていくことができる

## 設計へ落とし込む際の注意点
- あくまで、良いアイディアを与えてくれそうなものを探すに留める
    - 大切なのは、なぜこれらが良い設計とされているのかを理解すること
- クラスの抽出時
    - デザインパターンから、抽象的な概念を取り入れる
- 実装とインターフェースの切り分け
    - 実装に対してプログラミングを行うのではなく、インターフェースに対してプログラミングを行う 
- 再利用性を高める
    - オブジェクトコンポジション（別のオブジェクトが持つ機能を組み合わせて利用すること）を常に考える
- 変化に強くする
    - あらかじめ起こりうる追加や変更を想定しておく必要がある
    - デザインパターンは、想定される仕様の追加や変更に柔軟に対応できる方法を教えてくれる
- 必要になるまで作るな（YAGNI/You Ain't Gonna Need It.）
    - 将来的に必要になるかも？を欲して複雑になってしまわないように
    - デザインパターンは手段であり、目的ではない

## デザインパターンの種類
「オブジェクト指向における再利用のためのデザインパターン（GOF）」から参照。

### オブジェクトの生成に関するパターン
- 参考 : http://www.techscore.com/tech/DesignPattern/index.html/

Abstract Factory

- インスタンスの生成を専門に行うクラスを用意することで、整合性を必要とされる一連のオブジェクト群を間違いなく生成するためのパターン
- Factoryクラスを切り替えることでインスタンスを切り替えることができる

#### Builder
- 同じ作成過程で異なる表現形式の結果を得るためのパターン
- オブジェクトの生成過程をより柔軟にする際に利用できる

#### Factory Method
- インスタンスの生成をサブクラスに行わせることで、より柔軟に生成するインスタンスを選択することが可能
- 機能が複雑になりクラスが多くなった際などにも利用できる

#### Prototype
- プロトタイプからインスタンスを生成することができるようにするためのパターン
- 同じクラスで複数のオブジェクトを作成する際に利用できる

#### Singleton
- オブジェクトの唯一性を保証するためのパターン
- 他クラスから新たにインスタンスが生成されないように制御する際に利用できる

### プログラムの構造に関するパターン
#### Adapter
- インタフェースに互換性の無いクラス同士を組み合わせることを目的としたパターン
- 本来繋がっていないクラス同士を関連づける時など、利用したいインタフェースを強制的に変えたいような場合に利用できる

#### Bridge
- 機能と実装を分離して、それぞれを独立に拡張することができるようにするためのパターン
- 機能の上位クラスが、集約している実装の上位クラスに処理を委譲することによって、２つの階層を橋のように結びつけることができる

#### Composite
- 器と中身を同一視することで、再帰的な構造の取り扱いを容易にすることができるパターン

#### Decorator
- 飾り枠と中身を同一視することで、より柔軟な機能拡張方法を提供することができるパターン
- 継承以外の手段で機能を追加することができる

#### Facade
- 既存のクラスを複数組み合わせて使う手順を、「窓口」となるクラスを作ってシンプルに利用できるようにするパターン

#### Flyweight
- 同じインスタンスを共有することで無駄なを生成を削減し、プログラム全体を軽くすることを目的としたパターン
- 小さなオブジェクトを数多くロードする状況で効率的に処理できる

#### Proxy
- 要求を代理人のオブジェクトが受け取り、処理をするようなパターン

### オブジェクトの振る舞いに関するパターン
#### Chain of Responsibility
- 責任者を鎖状につないでおき、いずれかの段階で、「誰か」が処理をすることを表現するようなパターン
- メッセージを他のクラスのオブジェクトに送って処理することが可能

#### Command
命令を表すオブジェクトをメソッドの引数にすることで、1つの引数で複数のデータと処理を伝えることができるパターン

#### Interpreter
インターフェースを使って、構文解析の結果をツリー構造で表示するパターン

#### Iterator
- 要素の集まりを保有するオブジェクトの各要素に順番にアクセスする方法を提供するためのパターン
- 集約オブジェクトの種類や実装に依存しない、統一的な走査方法を提供したいような場合に利用できる

#### Mediator
- 適宜判断を行い指示を出す「仲裁人」の役割を果たすクラスを利用するパターン
- クラス間の疎結合を綺麗に整理することができ、複数のオブジェクトを組み合わせて機能を実装する際に利用できる

#### Memento
- 必要な情報のみを保持しておき、必要なデータのみを復元できるようなパターン

#### Observer
- 通知の仕組みをより汎用的に利用できる形で提供するためのパターン
- あるオブジェクトの変化を別のオブジェクトに通知させることが可能

#### State
- モノではなく、「状態」をクラスとして表現するパターン
- if文を利用することなく、状態に対応した処理を行うことができる

#### Strategy
- 戦略の部分を意識して別クラスとして作成することで、柔軟でメンテナンスしやすい設計をするためのパターン
- クラスを使う人のコードを変更することなくアルゴリズムを変更することが可能

#### Template Method
- テンプレートの機能を持つクラスを作成するパターン
- 処理の流れをテンプレート化したいような時に利用できる

#### Visitor
- 受け入れる側に処理を追加することなく、処理を追加することができるパターン
- オブジェクトに動的に機能を追加するために利用できる
ジョブカンのシフト申請をExcel(spreadsheet)からコピペする

## まえがき
* ジョブカンでシフト申請をするとき、クリックしまくりでつらい。
 * 特に勤務時間・日時が自分でフレキシブルに決められる(パターン化されてない)場合、  
  1日のシフト申請に10クリックしなきゃいけない
 * 仮にシフトを10日申請する場合は100クリック(!?)
 * なのでツールを作りました
 
### 普通の申請手順
* 日付を探して「申請を追加」のセレクトボックスをクリック->「時刻指定」をクリック(2クリック)
![スクリーンショット 2018-09-30 23.46.51.png](https://qiita-image-store.s3.amazonaws.com/0/57898/64043219-c478-c5cd-d2da-80d65f12af4b.png)

* 「開始、終了、休憩開始、休憩終了」時間のセレクトボックスをそれぞれクリック->選択(各2回ずつで8回)
![スクリーンショット 2018-09-30 23.47.00.png](https://qiita-image-store.s3.amazonaws.com/0/57898/c4dc81a7-45f9-158f-52fb-361c42eae1d9.png)

* これを申請日数分繰り返す

* 作業時間的には大したことなくとも「Excel(spreadsheet)だったらこんなに手間かからないのに。。。」的な徒労感がつらい
* てかなんでExcel(spreadsheet)やcsvからimportできないの？→作ってみた


## インストール方法
* Chromeを起動する
* ChromeにTampermonkey(ツールを動かすために必要なアドオン)をインストールする  
https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja
* 拙作のjobcanコピペツールをインストールする  
https://gist.github.com/NaoyaIchikawa/0961856f32fa4dc0ea6f2fc6a9cd4024/raw/25e30e3c5ee75c9d3bf9f8bee992e5f29cdf10c8/jobcan_shift_import.user.js 
* 完了


## 使い方
###  1. Excel(Spreadsheet)に予定を記入する
* 入力フォーマット

|  日付 | 出勤時間 | 退勤時間 | 休憩開始時間 | 休憩終了時間 |
|  :------ | :------ | :------ | :------ | :------ |
|1 |11:00 |18:00 |13:00 |14:00|
|4 |11:30 |16:30 |13:00 |14:00|
|5 |10:00 |18:00 |13:00 |14:00|
|8 |11:00 |18:00 |13:00 |14:00|
|11|11:30 |16:30 |13:00 |14:00|

* 入力例 
https://docs.google.com/spreadsheets/d/1Qmxci9hWPJHZ75uOqJ8NG-GFU1c447LIuFCWNjskM_E/edit#gid=0

### 2. タイトル以外を選択し、コピーする
* 上記例では下の部分

|1 |11:00 |18:00 |13:00 |14:00|
|  :------ | :------ | :------ | :------ | :------ |
|4 |11:30 |16:30 |13:00 |14:00|
|5 |10:00 |18:00 |13:00 |14:00|
|8 |11:00 |18:00 |13:00 |14:00|
|11|11:30 |16:30 |13:00 |14:00|

### 3. jobcanのスケジュール申請ページにアクセス
https://ssl.jobcan.jp/employee/shift-pattern-request
* 「シフト申請期間」->「指定月」を選択し、表示ボタンを押す

### 4. 左上のテキストボックスにコピーした内容をペースト
* 貼付け前
![2018-09-28 10 37 58](https://user-images.githubusercontent.com/8358305/46183204-cf4fc180-c30a-11e8-9880-5275803a9e04.png)

* 貼付け後
![スクリーンショット 2018-09-28 13.45.36.png](https://qiita-image-store.s3.amazonaws.com/0/57898/05a7ad14-8084-c699-3eaf-310acb8fa640.png)


### 5. コピペ内容を反映する
* 「import実行」ボタンを押す

### 6. 申請
* 入力された内容を確認し、間違いなければ、「申請」ボタンを押す

### 7. 完了
プライベートリポジトリを含むモジュールを composer でインストールして appengine にデプロイする

# プライベートリポジトリからの checkout

第1世代の appengine は、アプリのディレクトリに必要なファイルをすべて用意しておけば、それをすべて素朴にデプロイしてくれていたのですが、第２世代の appengine にデプロイする場合は、 `composer.lock` のモジュールを google のビルドサーバでビルドしてからデプロイされます。

**vendor ディレクトリはアップロードされない** ので、しれっと `vendor` に **闇カスタム** したモジュールを置いといても、ロードしてくれませんのでご注意ください。

モジュール等を除いたWEBアプリ自体は、プライベートリポジトリでコード管理される事が一般的だと思いますが、 google のビルドサーバ `Cloud build` で `composer install` 出来ないと appengine にはデプロイ出来ません。

# プライベートリポジトリからのチェックアウト方法

composer には、プライベートリポジトリからの checkout を oauth を使って認証する仕組みがあるので、それ使います。
Google のドキュメントも存在し、日本語にも翻訳されているのでそのとおりやるだけです。

[非公開レポジトリの使用](https://cloud.google.com/appengine/docs/flexible/php/using-php-libraries#using_private_repositories)

# 実際にやってみる

composer で private repository のモジュールを使う方法。
いつもどおりやんけ、と思うかもしれませんが、 `url` は https:// から始まるこの書式のURLでないといけません。

```json:composer.json
"repositories": [
    {
        "type": "vcs",
        "url": "https://github.com/username/private_package.git"
    }
]
```
[非公開レポジトリの使用](https://cloud.google.com/appengine/docs/flexible/php/using-php-libraries#using_private_repositories) より引用。bitbucket でも同じです。

## 認証ファイル

認証用のファイル `auth.json` を `app.json` と同じディレクトリに置きます。
`app.yaml` がおいてあるディレクトリが公開ディレクトリだと、 `auth.json` にもアクセス出来てしまうので `document_root` で公開ディレクトリを限定しましょう、と書いてありますが、第2世代の appengine はフロントコントローラー形式でアクセスしなければならないので必然的に大丈夫な気がします。

それはそうとしても、フロントコントローラーのディレクトリとプロジェクトルートディレクトリは分けておいたほうが良い習慣だと思います。

`app.yaml` の `entrypoint` を公開用のディレクトリ以下にしておくと良いと思います。

# auth.json の中身

認証情報を記述した `auth.json` ですが、コードホスティングサービス毎に記述方法が異なります。

## github の場合

PC版の右上の自分のプロフィールメニューから

* **Settings**
* 左下の方のメニューの **Developer settings**
* **Register a New application** ボタン

からトークンを作ります。
`Authorization callback URL` を何でも良いので (自分の管理下で status 200を返せるURL、ぐらいには私は気を使ってますが、意味があるかどうかは知りません) 必ず入力してください。

```json:auth.json
{
    "github-oauth": {
        "github.com": "<your-github-auth-token>"
    }
}
```

[非公開レポジトリの使用](https://cloud.google.com/appengine/docs/flexible/php/using-php-libraries#using_private_repositories) より引用。

## bitbucket の場合

`https://bitbucket.org/account/user/あなたのユーザ名/` の

* **Oauth** メニュー
* **OAuthコンシューマ** の項目
* **コンシューマキーを追加** ボタン

(日本語 UI の場合)

から `consumer-key` と `consumer-secret` を得られるので、コピペで `auth.json` を作る。

注意点は　`コールバックURL` が必要なくても (appengine にデプロイするためには必要ないと思います) なにか適当な URL を入れておく必要があります。

```json:auth.json
{
    "bitbucket-oauth": {
        "bitbucket.org": {
            "consumer-key": "<your-oauth-consumer-key>",
            "consumer-secret": "<your-oauth-consumer-secret>"
        }
    }
}
```
[非公開レポジトリの使用](https://cloud.google.com/appengine/docs/flexible/php/using-php-libraries#using_private_repositories) より引用。

以上でデプロイできると思います。
Agileマインド

### この記事を書く経緯
- ２年半Agile開発をして、一区切りついたので、今の状態の記録をしようと思った
- 次のプロジェクトに生かすためにも、良かったことを書き留めておきたいと思った

### プロジェクトの規模（終了時点）
- 人
  - エンジニア10人
  - スクラムマスター1人
  - プロダクトオーナー2人(3人)
  - エンドユーザー2人

## Agileマインド
- この２年間、Agile開発にどっぷり浸って、今この時点で一番大事だと思うことはステークホルダーの「心理的安全」を確保すること
- そうすることで、よりAgileできるということ
- プロジェクト終了にあたって、名残惜しさとかもっとこのチームで働きたいとか思えるようなプロジェクトになるくらい風通しの良い雰囲気だった
- 様々な取り組みを通して、得たAgileマインドを大切にしたい

### 心理的安全をどう確保したか
始めから心理的安全性が高かったとは思っていません。チームで考えて、改善して、を繰り返しての結果です。個人的に効果があったんじゃないかと思う取り組みを列挙します。

#### ティータイム
午後2時になると、10分間チームで雑談をする時間

- 最近読んだおすすめの本とか、学生時代のサークル活動、休日の出来事とか話題はなんでも良い
- お互いのことを知ることができる

#### 気持ちのふりかえり
スプリントごとのレトロスペクティブのタイミングでそのスプリントの感情の推移に着目して一人一人話す

- 実はスプリントの最初の頃タスクの進捗が良くなくて、かなり焦ってました、とか
- あの時こんなことを考えていた、思っていた、を知ることができ、そこからチームの心理的安全性が下がっているものを特定して、対策を考えることができた
- 単純に相手の思考のプロセスを知ることができ、それを踏まえたコミュニケーションを取ることができた

#### セレモニーはオフラインで全員参加
エンジニア、スクラムマスター、プロダクトオーナー、エンドユーザー、全員でスプリントレビュー・レトロスペクティブ

- 対面で話していくことで、お互いの人柄が知れるし、お互いをより思いやれる

#### チームの分割
最大時に7人いたチームを３~4人にした

- 人数が少ない方がコミュニケーションの質も上がるし、一人一人の意見を確実に吸い上げることができる
- 一人一人が意見を発するタイミングも、量も増えるので、言えないストレスがない

#### 「とりあえずやってみよう」マインドを繰り返し唱える
何かやりたいという意見が出た時に、効果はあるのかなどやる意義に時間を費やすのではなく、例えば「とりあえず一週間だけやってみようか」と言ってみる・やってみる

- 「とりあえずやってみよう」は「失敗してもいいんだ」とセット
- やりたいことの結果を推測するよりも、やってみた方が早い
- やってみてなんか微妙だったらすぐにやめればいい

#### 失敗も成功もチームの成果
やったことが成功したら、チームみんなで喜ぶ。例え失敗したとしても、それはチームでやっちまったことなので対応策考えよう

- うまくいったら、みんなでバンザイ
- 失敗しても、そのタスクに着手した人のせいではなく、気づけなかったチームの失敗
- 失敗から学ぶことに重きを置くマインド

#### 体験入学
自分以外のチームに入って開発をしてみる

- 外に飛び出すと価値観がわっと広がる
- 雰囲気の良いチームに入ると、アイディアが見つかる

### 心理的安全を確保したからこそ作れた世界
誰もが居心地よく、楽しく、離れがたいチームが作れたからこそ、できることがある

#### 挑戦マインド
たくさんの案を考えて、たくさんの挑戦をできた

- やってみようの精神で実践して、良い大きな効果を得たものがある
- 例えば、ペアプロやモブプロ

#### フラットな関係
上下、立場関係なく意見を言い合える、発信できる環境

- エンドユーザーやプロダクトオーナーに提案をバシバシできる
- 先輩後輩関係なく、対等に議論し合える

#### 良い空気のラストラン
プロジェクトとしては、結果は残念なもの。でも最後まで、前向きにそのプロダクトの最善を考え続けるチームだった

- エンドユーザーからも最後のふりかえりに参加したいと言ってもらえた
- 最後までみんな明るく、楽しいと思える雰囲気でクローズした

#### 感謝の言葉
最後のスプリントレビューで全員がみんなの働きに感謝を言葉で伝え合うことができた


## まとめ
- 心理的安全を確保することで、よりAgileできる
- どんな手法を用いるかじゃなく、どんなマインドを持つかがAgileにおいては大事
- このプロジェクトで培ったAgileマインドを次にも生かして、今を超えるものにしたい
[Swift][iOS]iCloudDocumentsにバックアップ保存

# 概要
iCloudDocumentsにバックアップの仕方を調べる機会がありました。
いくつか参考にさせていただいた記事はありますが、詰まった部分もあったのでまとめておく。

# iCloudコンテナ作成
[こちら](https://joyplot.com/documents/2016/11/03/icloud-document-container/)のサイトを参考にしてください。

# iCloudカスタムディレクトリの作成
```Swift
private var containerUrl: URL? {
　　　　let url = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("ディレクトリ名")
  do {
　　　　　　　　try FileManager.default.createDirectory(at: url!, withIntermediateDirectories: true, attributes: nil)
 　　} catch let error as NSError {
　　　　　　　　//エラー処理
  }
    return url
}
```

# iCloudに保存しているデータのダウンロード
```Swift
FileManager.default.startDownloadingUbiquitousItem(at: (self.containerUrl)!)
```

# iCloud書き込み
```Swift
// イメージの保存
let fileURL = containerUrl?.appendingPathComponent("sample.jpeg")
let data = UIImageJPEGRepresentation(image!, 1.0)
do {
    try data?.write(to: fileURL!, options: Data.WritingOptions.atomic)
} catch let error as NSError{
    // エラー処理
}
```

# iCloud読み込み
```Swift
private var fileNames: [String]! = []
// 指定したディレクトリ内のファイル名を全て取得する
fileNames = try FileManager.default.contentsOfDirectory(atPath: (containerUrl?.path)!)
```

```Swift
 // ディレクトリから取得したファイル名を利用しデータの取得
let filePath = containerUrl?.appendingPathComponent("\(fileNames[0])")
do {
    let data = try Data(contentsOf: filePath!)
    let image = UIImage(data: data)
} catch let error as NSError {
    // エラー処理
}
```

# 参考記事
- [iOSでデータを永続化する方法](https://gist.github.com/y-takagi/9f2cea659fb3f55b56aa04530bf0af39)
- [[macOS][iOS]iCloudドキュメント・ストレージに書き込む](https://qiita.com/m_yukio/items/1e9d48173fc0670e4c17)
Incorrect response MIME type. Expected 'application/wasm' エラーの 対応

Rust × WebAssemblyのチュートリアルをやっていたら、ブラウザ上でこんなエラーに出くわしました。

```
Error importing `index.js`: TypeError: Failed to execute 'compile' on 'WebAssembly': Incorrect response MIME type. Expected 'application/wasm'.
```

↓↓↓エラーのスクショ
<img width="944" alt="スクリーンショット 2018-09-30 23.49.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/73446/08ea7386-f0fd-5c38-7997-287a55ae6ff4.png">

↓↓↓Response Headersはこんな感じでContent-Typeが無い
<img width="374" alt="スクリーンショット 2018-09-30 23.48.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/73446/8cc26164-ab21-93a4-8143-541834e42862.png">



サーバー側にMIME typeの設定を追加しましょう。

CentOS7の場合

```
$ vim /etc/mime.types
```

Vimやechoのリダイレクションなどで一番下に```application/wasm    wasm```を追加

```
x-conference/x-cooltalk                         ice
x-epoc/x-sisx-app                               sisx
application/wasm                                wasm  
```

そしてサーバー再起動しましょう。
これで自分は正常にブラウザにMIME typeが送られて実行する事ができました。

↓↓↓ 追加後のChromeのResponse HeadersのContent-Typeはこんな感じ

<img width="396" alt="スクリーンショット 2018-09-30 23.45.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/73446/61403c70-c13e-5983-357a-dc70372194f4.png">


参考：https://github.com/mdn/webassembly-examples/issues/5
【Swift4】ファイルの削除方法

##環境
- X-code 9.4
- Swift4.1



##コード

覚え書き程度ですが。

```.swift
        // パスを取得
        let libraryPath = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true).first as String?
        let cookiesPath = libraryPath?.appending("/Cookies")
        let webKitPath = libraryPath?.appending("/WebKit")
        let cachesPath = libraryPath?.appending("/Caches")

        print("------libraryPath：" + libraryPath! + "------")
        print("------cookiesPath：" + cookiesPath! + "------")
        print("------webKitPath：" + webKitPath! + "------")

        // ファイルの削除
        do {
            try FileManager.default.removeItem(atPath: cachesPath!)
            try FileManager.default.removeItem(atPath: cookiesPath!)
            try FileManager.default.removeItem(atPath: webKitPath!)
        } catch {
            // エラー処理
        }
```

```.swift
"/Cookies"
```


とか、文字列なのが、なんとなく、ただなんとなくいけ好かないけれど、
エラーになることなく実行できました。


##参考
- [removeItem(atPath:)](https://developer.apple.com/documentation/foundation/filemanager/1408573-removeitem)
React+Material-UI+Firebaseでポートフォリオサイトを爆速で作成した

#はじめに
今まで制作物をQiitaに投稿してきましたが、数が多くなりユーザーページからだと見通しが悪くなっているので、ポートフォリオサイトを作ることにしました。

また合わせて新しい技術を習得できるように、ReactとそのコンポーネントであるMaterial-UIを利用して、Firebaseでホスティングすることとしました。

#制作物
SINHALITE'S PORTFOLIO
https://sinhalite.me/
![Screenshot_2018-09-30 SINHALITE'S PORTFOLIO.png](https://qiita-image-store.s3.amazonaws.com/0/104983/254bd555-1080-6104-6a03-de0a9f7ad74a.png)


#手順
##1 - `create-react-app`でひな形作成

```terminal:
npm install -g create-react-app
```

##2 - Material-UIのインストール

```
npm install --save @material-ui/core
```

##3 - ファイル編集
ひな形のファイルを編集していきます。

Material-UIのモーダルウィンドウを使いたいため、demoページのコードを参考にしてファイルを作成します。いくつか種類があるのですが、今回はモーダル内でスクロールができるコンポーネントを使います。
[Dialog React component - Material-UI](https://material-ui.com/demos/dialogs/)

モーダルで制作したプログラムの情報を表示したいので、propsに該当のプログラムに関する情報を渡して、コンポーネント側で組み立て流ようにしました。

```jsx:モーダル
<ScrollDialog
  title="競走馬の能力予測"
  alt="競走馬の能力予測"
  img="derby.png"
  techs={["Python","pandas","scikit-learn"]}
  qiita="c177299718d2eca7c1b6"
  description={<span>hogehoge</span>}
/>
```

スタイルについては、基本1カラムで構成しています。
中央のカード部分のみフレックスボックスで構成し、PCで2列/SPで1列となるようにしました。

##4 - Firebaseにデプロイ

```
npm install -g firebase-tools
firebase login
firebase init
firebase deploy
```

#おわりに
この規模だとReactを利用する恩恵は少ないかと思いますが、モーダル画面を簡単に実装することができました。大規模になるほどコンポーネントを使い回す箇所が増えると思うので、そういった場合に便利なんだろうなあと思いました。
そしてFirebase Hosting、静的サイト公開するのには本当にうってつけですね。早い&簡単で素晴らしい:v:
DB接続

色々DBを使っているとコマンドのパラメータ等を忘れることがあるのでメモ
対象のDBは以下
Oracle
SQL Server
MySQL
PostgreSQL

内容は以下
サービス起動・停止
接続コマンド
ネットワーク設定
DB作成・ユーザ作成
管理情報取得のSQL
その他SQL
ODBC・JDBC接続
その他メモ
参考リンク

# 1.Oracle
## 1-1.サービス起動・停止
## 1-2.接続コマンド
### 1-2-1.コマンド
sqlplus <ユーザ名>/<パスワード>
sqlplus <ユーザ名>/<パスワード>@＜ホスト名＞:＜ポート番号＞/＜サービス名＞

### 1-2-2.ヘルプ
sqlplus /?

## 1-3.ネットワーク設定

## 1-4.DB作成・ユーザ作成

DBの作成は「dbca」コマンドで行う。

```sql:ユーザ作成
CREATE USER <ユーザ名>
IDENTIFIED BY "<パスワード>"
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
/

GRANT DBA TO <ユーザ名>;
```

## 1-5.管理情報取得のSQL
```sql:接続しているデータベースの確認(12c用)
show con_name;
```

```sql:文字コード確認
SELECT PARAMETER,VALUE FROM NLS_DATABASE_PARAMETERS where parameter = 'NLS_CHARACTERSET';
```

##その他SQL
```sql:文字列の16進表示
select rawtohex(列名) from テーブル名;
```

##ODBC・JDBC接続

http://apis.jpn.ph/fswiki/wiki.cgi?page=Oracle%2FInstantClient
Windows版のインストールは管理者モードで実行する必要がある。
また、64bitOSでも32bitのODBCドライバを使う場合は32bit版のBasic ODBC Updated を使うこと。
環境変数にNLS_LANGの指定をしないと、インストール時にJAを付けても日本語化されない。


##その他メモ
###コンテナとプラガブルについて
コンテナ・データベースが12cから導入され、1つのコンテナデータベースに複数のプラガブル・データベースを作成できるようになった。
###文字型のbyte数について
char(5)、varchar(5) 5byte。UTF8環境で「あああああ」とやったら『値が大きすぎます(実際: 15、最大: 5)』となった。
nchar(5)、nvarchar2(5)　5文字。rawtohexで確認したら「30423042304230423042」だったのでUTF16で格納されている。lengthbでバイト数を確認したら10byt。

### NLS_LANG
●UTF8
$export NLS_LANG=Japanese_Japan.AL32UTF8

●SJIS
$export NLS_LANG=Japanese_Japan.JA16SJIS

##参考リンク


### ORA-28040
サーバ側のsqlnet.oraに以下の内容を記載する。
SQLNET.ALLOWED_LOGON_VERSION=8
特にサービスを再起動する必要もなかった。

# 2.SQL Server
## 2-1.サービス起動・停止
Windowsのサービスか、「SQL Server Configration Manager」を使用する。

## 2-2.接続コマンド
### 2-2-1.コマンド
sqlcmd -U <ユーザ名> -P <パスワード>
sqlcmd -U <ユーザ名> -P <パスワード> -d <データベース名> -S <サーバ名>

### 2-2-2.ヘルプ
sqlcmd /?
###管理者ユーザー
sa
###メモ
SQL文の後に「go」を入力する必要がある。

## 2-3.ネットワーク設定
「SQL Server Configration Manager」を起動し、ネットワークの構成でTCP/IPを有効にする。
既定のインスタンスの場合は,ポート番号は1433

## 2-4.DB作成・ユーザ作成
```sql
create database <データベース名>;
GO
USE master;
CREATE LOGIN <ユーザ名>
WITH PASSWORD = N'<パスワード文字列>' ,
DEFAULT_DATABASE = <デフォルトの接続データベース名>;
GO
USE <データベース名>;
CREATE USER <ユーザ名>;
exec sp_addrolemember db_owner,<ユーザ名>;
GO
```

## 2-5.管理情報取得のSQL

```sql:接続しているデータベースの確認
select DB_NAME()
```

```sql:バージョン確認
select @@version;
```

## 2-6.ODBC・JDBC接続

## 2-7.CSVデータの取り込み

Management StudioからSQL Server Import and Export Wizardを使用する。
なお、Wizardを使わずに、Management Studioで、テーブルに対してEdit Top 200
でテーブルの内容を表示し、エクセルの内容を張り付けでもデータの登録は可能。

### 2-7-1.Chose a Data Source
1. Flat File Sourceを選択する。
1. Code Pageは932を選択する。
1. Advancedで型を設定する。

* datetime2 -> DT_DBTIMESTAMP2


##その他メモ
ユーザー削除でdrop userを実行すると「存在しないか、権限がありません。」
が表示される。管理ツールでは削除可能。

##参考リンク
https://blogs.yahoo.co.jp/hogesql/70749718.html

# 3.MySQL
#PostgreSQL


# Port番号
##Oracle
##SQL Server
既定のインスタンスの場合は1433
##MySQL
##PostgreSQL



# 接続コマンド

##Oracle
##SQL Server
### コマンド
sqlcmd -U <ユーザ名> -P <パスワード>
### 管理者ユーザ
sa
### 備考

### 切断
quit

##MySQL
##PostgreSQL
SpreadSheetの権限削除

##やりたい事
スプレッドシートの任意のユーザのアクセス権限を削除したい。

##問題
アクセス権限は閲覧・編集などある。
DriveApp経由でファイルを取得して権限削除しようとすると、エラーになる。

```js
// 編集権限がついているファイル
var file = DriveApp.getFileById(SHEET_ID);
// これはOK
file.removeEditor('****@gmail.com');
// ユーザーが存在しないエラー
file.removeViewer('****@gmail.com');
```

##対応
SpreadsheetApp経由でファイルを取得する。

```js

// 編集権限がついているファイル
var file = SpreadsheetApp.openById(SHEET_ID);
// これはOK
file.removeEditor('****@gmail.com');
// これもOK
file.removeViewer('****@gmail.com');
```

なんでDriveAppとSpreadsheetAppで挙動が異なるのやら。
それと、removeEditorsとか欲しい。
addEditors()はあるのになんでやねん:sweat_smile:
Xcode10で無料実機テストをすると、provisioning profileでエラーになる

## 買っちゃいました
発売日に、というか予約開始日初日に、**iPhoneXS Max**を購入しました。
今まで7Plusを使っていたので大きさも問題なく、Xも持ってなかったので初めてのFaceIDに心躍らせていました。
……という話はどうでもよく、本題はここから。
## ビルドは成功するのにインストールできない
Xcode9以前に作ったプロジェクト。
Xcode10にしてから、iPhoneXS Maxでテストするべくインストールしようとしたら、こんなエラーが。
<img width="423" alt="20180930-232933.png" src="https://qiita-image-store.s3.amazonaws.com/0/265811/8f67c658-ce78-4037-b070-c0fa2d0b8b23.png">
ちなみに、Buildには成功しています。一体何なんだ。

## 前提
* Xcode9以前に作ったプロジェクト
* 今まで使用してないテスト機で実行
* **無償開発アカウント** ←ここが重要かもしれない。

## 解決策
どうやらXcode10から、`Build System`に新しいとか古いとかができたらしい（Xcode9以前からあったのかも知れないが、気にしたことすらなかった）。
プロジェクトを開いた状態で、`File < Project Settings...`で出てくる。
<img width="536" alt="20180930-232009.png" src="https://qiita-image-store.s3.amazonaws.com/0/265811/9600cecb-e7c5-967a-843e-32919973c4df.png">
デフォルトでは`New Build System`になっているので、**Legacy Build System**に変更してDone。

無事、インストールまで出来ました。
あ、インストール後のプロファイル認証を忘れずに。

## 初めて書いた
というわけで、初めてQiitaに投稿させていただきました。
いつもお世話になる側に留まっていたのですが、この記事で少しでも他の皆さんの問題解消に繋がればいいな……。
まだまだヒヨッコですが、よろしくお願いします。
WebGLのuniformで構造体の配列をシェーダーに渡す方法

WebGLのシェーダー上で構造体の配列として宣言されたuniformに値を渡す方法です。
JavaScriptから配列のインデックスと構造体のプロパティを一つずつ指定して値を指定していきます。

```js:sample.js

gl.uniform3f(gl.getUniformLocation(program, 'u_mystruct[0].color1'), 1, 0, 0);
gl.uniform3f(gl.getUniformLocation(program, 'u_mystruct[0].color2'), 0, 1, 0);
gl.uniform3f(gl.getUniformLocation(program, 'u_mystruct[1].color1'), 0, 0, 1);
gl.uniform3f(gl.getUniformLocation(program, 'u_mystruct[1].color2'), 0, 0, 0);
```

```glsl:sample.glsl
struct MyStruct {
    vec3 color1;
    vec3 color2;
};

uniform MyStruct u_mystruct[2];

void main(void) {
    gl_FragColor = vec4(u_mystruct[0].color1 + u_mystruct[0].color2 + u_mystruct[1].color1+ u_mystruct[1].color2, 1.0);
}
```

###　参考

* [WebGLでuniform変数に配列を指定する \| 生存日記](https://spphire9.wordpress.com/2015/01/22/webgl%E3%81%A7uniform%E5%A4%89%E6%95%B0%E3%81%AB%E9%85%8D%E5%88%97%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B/)
* [WebGLのシェーダーとGLSL](https://webglfundamentals.org/webgl/lessons/ja/webgl-shaders-and-glsl.html)
Apache BeamをPython、ローカル環境でサクッと実行


# 概要

Apache Beamをとりあえず実行するための手順とサンプルプログラム、そして読むべきドキュメントをまとめる。
初めてApache Beamを動かすようなレベルを想定。Apache Beam自体の説明は割愛する。

# 手順
* Python2.7を用意する
    * Python3は使えない
* `pip install apache-beam`
    * 私が実行した時は2.5.0がインストールされた
* 下記のプログラムを実行
    * 内容は、プログラム内に書かれているそれぞれの単語の数をカウントし標準出力に出す
    * 次のサンプルプログラムを参考にしつつ簡略化した
        * https://github.com/apache/beam/blob/master/sdks/python/apache_beam/examples/wordcount_minimal.py

```python
import re
import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions


def run():
    pipeline_options = PipelineOptions([
        '--runner=DirectRunner'
    ])

    with beam.Pipeline(options=pipeline_options) as p:
        lines = (p
                 | beam.Create([
                    'cat dog cow, wolf',
                    'cat dog bear',
                    'dog ape elephant']))

        def print_wc(word_count):
            (word, count) = word_count
            print word, count

        (lines
         | beam.FlatMap(lambda x: re.findall(r'[A-Za-z\']+', x))
         | beam.Map(lambda x: (x, 1))
         | beam.CombinePerKey(sum)
         | beam.Map(print_wc)
         )


if __name__ == '__main__':
    run()
```

# ドキュメント
* https://cloud.google.com/dataflow/model/programming-model?hl=ja
    * Dataflow（Apache Beam）のプログラミングモデルについて。あっさりしていて情報量は少ないが日本語なのでうれしい。先に目を通しておくと、下記の公式ドキュメント（英語）の理解が進む。
* https://beam.apache.org/get-started/quickstart-py/
    * インストール（環境構築）手順と、サンプルプログラムの実行
* https://beam.apache.org/documentation/programming-guide/
    * Apache Beamのプログラミングがこれを読めばだいたいわかる
* https://beam.apache.org/documentation/pipelines/design-your-pipeline/
* https://beam.apache.org/documentation/pipelines/create-your-pipeline/
    * 「パイプライン」について知る
* https://github.com/apache/beam/tree/master/sdks/python/apache_beam/examples
    * サンプルプログラム
スマホUIの自動テストを始めよう。

#概要
Airtestというツールを使って、テストプレイを自動化してみようという話です

スマホアプリ開発では、頻繁にアプリのバージョンアップを行います。
その際に、基本的な機能が正しく動くか(ゲームであればチュートリアルなど)を確認するのですが、
意外と時間もかかるし、人の手でやると面倒なので、自動化したいというところから始まります。

#Airtestとは
Neteaseが開発しているマルチプラットフォーム対応のUIテストツールです。
iOS、Androidのスマホはもちろん、Windowsにも対応しています。
http://airtest.netease.com/index.html

#やってみる
##環境
今回はAirtestIDE v1.0.0を使用しました。
MacのPCとAndroidのスマホを使用します。

##セットアップ
下記ページからAirtestIDEをダウンロードし、インストールします。
http://airtest.netease.com/changelog.html

後は、adbが使用できる環境にしておいてください。

Android端末を繋いで準備OKです。

##PC上でスマホを操作する
インストールしたAirtestIDEを起動すると以下のような画面になるかと思います。
<img width="1187" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/46278/e9404434-add5-5306-c393-9dbda613034d.png">

ここで右のDevicesのMobile Phone ConnectionにAndroid端末が表示されるはずです。
されていない場合はrefresh ADBボタンを押してください。

表示されたら、Action以下のConnectボタンを押してください。
すると端末の画面がDevice Screenの部分に表示されます。
<img width="1186" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/46278/6525efc3-5731-86d8-09a0-eb3ccabb9d86.png">

この画面部分をクリックしたりすることで、Android端末を操作することが出来ます。

##操作を記録する
Airtest Assistantのビデオカメラのようなアイコンを押すと、その後Device Screenで操作したものが記録されていきます。
<img width="1186" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/46278/397c5252-8e94-2728-8253-898d08aa0751.png">

##操作を再生する
上に並ぶアイコンの再生ボタンのようなものを押すと、Script Editorに記述された操作が実行されます。
<img width="1186" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/46278/70fb7a42-1d90-bf1a-5a66-7b29292ff77c.png">

#終わり
軽く触ってみて、とりあえず環境構築までは30分もあれば出来るのではないかなと思いました。
ここから実際のアプリでの操作を記述し、運用に組み込むとしても、多少コストはありますがそこまで大変ではないかなと。
また、特定の場面でスクリーンショットを撮って、前回のバージョンと比較して、というところまで自動化できれば結構テストコストを減らせるのではと思いました。

#参考
[Airtest Project](http://airtest.netease.com/)
[書評] エンジニアの知的生産術 ──効率的に学び、整理し、アウトプットする

## 読んだ本
[エンジニアの知的生産術 ──効率的に学び、整理し、アウトプットする](https://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E7%9F%A5%E7%9A%84%E7%94%9F%E7%94%A3%E8%A1%93-%E2%94%80%E2%94%80%E5%8A%B9%E7%8E%87%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B3%E3%80%81%E6%95%B4%E7%90%86%E3%81%97%E3%80%81%E3%82%A2%E3%82%A6%E3%83%88%E3%83%97%E3%83%83%E3%83%88%E3%81%99%E3%82%8B-WEB-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774198765)
西尾泰和 [著]

この週末をかけて上記の本を読みました。
私は自分の中で読んでみたい本が沢山積まれて積読状態になってしまい
この本を読むことで効率的な学び方、少ない時間で理解を深めたい(要は楽したい)という期待がありました。


目次
はじめに
第1章 新しいことを学ぶには
第2章 やる気をだすには
第3章 記憶を鍛えるには
第4章 効率的に読むには
第5章 考えをまとめるには
第6章 アイデアを思い付くには
第7章 何を学ぶかを決めるには

ざっと読んだ感じは、現状あまり知識や経験がなく手っ取り早く楽をしたいだけの人にはオススメできないという感想です。(私のことですねwww)
読めるところはスラスラ読めるけど、読めない所は読みづらい、筆者が何を述べたいというのが見失いやすいというのが理由で、本書でも言及されていますがいわゆる私の中で経験がないというのが正しいかもしれません。

> 第4章効率的に読むには - 本の内容だけが組み立てる材料ではない
> 本の中に書かれた情報をきっかけに自分の個人的な経験も交えて自分の個人的なモデルを組み立てるのです。 

### やる気をだすには 
スラスラ読めたのが第2章でタスクの分割やポモドーロ･テクニックなど
私自身の試行錯誤した経験と当てはめる事ができ、計測することやトリンプの事例で紹介された集中力の限界についてなど
理解しながら新たな学びの獲得を得たのが大きいです。

### 記憶を鍛えるには

脳の記憶のしくみや筋肉のように繰り返すことが重要
また繰り返し読むだけではなくアウトプットやテストを繰り返すことで記憶を強化することができます。
テストをすると自身がなくなりますが、客観的にみると成果は高くなる。

## 感想

しっくり来なかったのは第5章と第6章で、思考法やフレームワークなどを使って試行錯誤した経験があるかという事で
理解力や学びについての差が大きいというのがはっきりわかりました。

ただ、今まで言語化できていなかった事象や経験が｢そうそれ!そういうこと!｣ってなるのは個人的に心地よく
もっと時間を掛けて本書を理解したいという気持ちや、ひとまずはインデックス的な使い方として本書を活用したいと考えています。

正直しっくりこない事があり、自身の理解力の無さに少し落ち込みましたが
本書の[はじめに この本を読むメリット]でも書かれていることが救いです。笑

> 本書を読んでしっくりこなかったなら今回は残念ながら材料が足りなかったようです。
> でも大丈夫です。経験は日々あなたの中に蓄積されていくのでいつか｢あ、これか｣とつながるときが来るでしょう。
> 半年たってからまたよみなおしてみてください。きっと何かが変わるでしょう。
Laravel install for mac


```bash
### brew install
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

### check
$ brew -v
```

[Homebrew]
(https://brew.sh/index_ja.html)

```bash
$ brew install composer

$ composer -v
```
																																																							
```bash
$ brew search php

$ brew info php

$ brew install php

$ brew services start php

# terminal restart
```

```bash
$ brew install mysql

$ brew services start mysql

# パスを通す
$ echo 'export PATH="/usr/local/opt/mysql/bin:$PATH"' >> ~/.bashrc

# 設定反映
$ source ~/.bashrc
ずんだの縦読み問題 JavaScript編 

## 元ネタ

[ずんだの縦読み問題 php編 - Qiita](https://qiita.com/higuyume/items/7d3c03ddbbd6f4ad7aa1)
[ずんだの縦読み問題 Go編](https://qiita.com/kentfordev/items/d9a78e34d1e8bf2e703a)
[ずんだの縦読み問題 Perl編](https://qiita.com/sapi_kawahara/items/19fcdc074fab6d55acd5)
[ずんだの縦読み問題 Ruby編](https://qiita.com/tbpgr/items/90abccf8297be0e42f8c)
[ずんだの縦読み問題 Java 12 Early-Access 版](https://qiita.com/neko_the_shadow/items/67e96e613b7f06ddc5fc)
[ずんだの縦読み問題 ShellScript編 - Qiita](https://qiita.com/VTRyo/items/8b353631711ac7e059bf)
[ずんだの縦読み問題 JavaScript編 - Qiita](https://qiita.com/clown0082/items/941f231486e95c219e75)
[ずんだの縦読み問題 Python編 - Qiita](https://qiita.com/Aizack/items/60ebd4d1e25ed671b86a)

## 実装

```js
const tweet = `忙しくてついったいじれない
さみしい
つらい
`

// 素直なやつ
console.log(tweet.split('\n').map(s => s.substr(0, 1)).join(''))

// 正規表現で削る
console.log(tweet.replace(/(.).+\n/g, '$1'))
```
【備忘録】Excelから関数型言語マスター3回目：WebにDBデータ表示 で詰まったところまとめ（Mac）

# 最初に
この記事は備忘録です。

先日、[fukuoka.ex](https://fukuokaex.fun/)さんの
[fukuoka.ex#14：Elixir／Phoenixもくもく会～入門もあるよ](https://fukuokaex.connpass.com/event/100659/)
に入門者枠として参加させて頂きました。

Elixir経験者枠の方々がもくもくされていた内容に
非常に感化され、私もあんな風なモノ作れるようになりたいなあと思った次第です。

さて、そのもくもく会において
@piacere_ex さんが纏めて頂いております
Excelから関数型言語マスターシリーズの1回目から実施しておりました。
[Excelから関数型言語マスター1回目：行の「並べ替え」と「絞り込み」](https://qiita.com/piacere_ex/items/6714e1440e3f25fb46a1)
が、環境の問題で3回目の途中で引っかかってしまい、やむなく時間制限いっぱいになっちゃいました。

その後家でいろいろ試行錯誤した結果なんとか乗り切ったのでその方法を纏めています。

# 元々の環境
Mac（10.13.6）にDocker for Macをインストールして
ホスト側にPosgreSQLを
Dockerイメージに[こちらの記事](https://qiita.com/piacere_ex/items/6714e1440e3f25fb46a1#3-docker%E3%81%A7elixir%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%AB-pull-%E3%81%99%E3%82%8B)にあるイメージを使用してました。

## 結果
PostgreSQLに繋がらない！！
どうもポートがどうのこうのとかそういうレベルじゃないっぽいので諦めました。
今回はElixirの勉強なのでこちらは飛ばすことにしました。

# 新しい環境
Mac（10.13.6）にElixirとPostgreSQLをインストールして実施

## Elixirのインストール
ターミナルを開いて

```
brew install elixir
```
を実行する

## PostgreSQLのインストール
ターミナルにて

```
brew install postgresql
```

を実行する。

### インストール後のコマンド
#### 文字コードの設定

```
initdb /usr/local/var/postgres -E utf8 --no-locale
```

#### 接続ユーザの設定

```
createuser -P -d postgres

//パスワード設定プロンプトが出るので、'postgres'と設定しておきましょう。
Enter password for new role: 
Enter it again: 
```

これで、Elixir環境とPostgreSQLの準備が出来ました。

# "mix ecto.create" の実行・・・しかし
こういうエラーが発生してしまいます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/309dc1fa-dc09-cd9d-11b5-dddefa795165.png)

@K_ichi さんの　こちらの記事[mix ecto.createが失敗するとき](https://qiita.com/K_ichi/items/230903d0868669d9deea)を拝見すると
バージョン違いがあるため駄目っぽいよっていう事でしたので
記事に従って以下のようにコマンドを入力します。

```
mix deps.get
```

すると、こんな感じで最新版のパッケージリストを出してくれますので、実際に取得コマンドを実行しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/c13cecde-744d-f3fd-31a7-2cf9251cb3e0.png)


```
mix local.hex
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/cefdf5fa-a987-4656-b83b-1259284dda28.png)

これでアップデートが完了します！

```
mix ecto.create
```
これでエラーがでなければ問題なく先に進むことができますよ！
JQueryの取っ掛かり

#前書き
JQueryを使う場面に遭遇したとき、すぐに思い出せるよう取っ掛かりとなる内容を記載する

#JQueryの基本
###セレクタ

```
// タグ要素を指定
 $('a')

// id要素を指定
 #hoge

// class要素を指定
 .hoge

// main直下のhoge
 #main > .hoge

// main配下のhoge
 #main .hoge

// aタグで特定属性を持っているもの
 $('a[href="sample.com"]')

```

#各メソッド
###取得、変更

```
// 属性を取得、変更
 .attr('href')
 .attr('href', 'sample.com')

// カスタム属性を取得
 .data('shop')

// テキスト、htmlを変更
 .text('hoge')
 .html('<a href="sample.com">click</a>')

// valueの取得変更
 .val()
 .val('hello')

// 要素の中身を削除、要素そのものを削除
 .empty()
 .remove()
```

###エフェクト

```
// 各エフェクト（引数の数字は完了までのms）
 .hide()
 .show()
 .fadeOut(800)
 .toggle() //出す消すを逆にする

 .hide(800, function(){
   alert("sample");
 })  // エフェクトが終わったあとに処理

```

###イベント

```
// クリックしたら処理
 .click(function(){
   alert("sample");
  })

// カーソルが当たる、外れる、要素上で動く
 .mouseover(function(){
   alert("sample");
  })

 .mouseout(function(){
   alert("sample");
  })

 .mousemove(function(e){
   alert(e.pageX);
 }) // eはイベントオブジェクト。各種ページの情報が入る。詳しくはAPI Document参照

// フォーカスが当たったとき、外れたとき
 .focus(function(){
   $(this).css('background', 'red');
  })
 .mouseout(function(){
   $(this).css('background', 'red');
  })

・// 値が変わったとき
 .change(function(){
   alert("sample");
  })
```

###非同期

```
// サーバーのファイルを読み込む
 $('#pushed').load('result.html')

// ※読み込み完了後に実行したい処理は書き方注意!（コールバック関数にする）
 $('#pushed').load('result.html', function(){
  alert("sample");
 })

// javaファイルにデータを送り、データを受け取る
 $.get('sample.java', {
  // nameに値を入れて渡す
  name: $('#name').val()
 }, function(data)(){
  // editedNameに値を入れて返してきた想定。data配下に入って返ってくる。
  $('#result').html(data.editedName);
 });

```

#サンプル
###ボタンを押したとき前に文字列を表出。要素のclassはpushed。

```
$(button).click(function(){
 var p = $('<P>').text('push button').addClass('pushed');
 $(this).before(P);
});
```

###body配下のid=pushedの要素をクリック or カーソルが外れたとき消す

```
$('body').on('click mouseout', '#pushed', function(){
 $this.remove();
});
```

###何番目のボタンが押されたか表示

```
for(var i = 0; i < 5; i++){
// valueに指定されたものはe.data.valueに入る
 $('button').eq(i).on('click', { value: i + 1 }, function(){
  alert(e.data.value + "番目のボタン");
 });
}
```
CloudFormationで作るCodePipelineで継続的デリバリされるECSクラスタを考えてみた

CloudFormationで作るCodePipelineで継続的デリバリされるECSクラスタを考えてみました。

# 前提

* リポジトリにはGitHubを使う
* CloudFormationで環境一式が作成される
* ECSは単一タスク定義にコンテナ2つ
    * WebとAppコンテナ
* CodepipelineはWeb, Appコンテナ用それぞれ用意

# コンポーネント

## GitHub

リポジトリを分けます。分ける理由はファイル更新時のデリバリー範囲を狭めるためです (Webコンテナの設定変更だけならAppコンテナは反映しない)。

* learning_of_codepipeline_ecs
    * CloudFormation設定ファイル
* learning_of_codepipeline_ecs_app
    * Appコンテナ用 Dockerfile
    * Appコンテナ用 Codebuild設定ファイル
* learning_of_codepipeline_ecs_web
    * Webコンテナ用 Dockerfile
    * Webコンテナ用 Codebuild設定ファイル

## CloudFormation

下記リソースの作成を行います。

* CodePipeline
* CodeBuild
    * App, WebコンテナイメージをビルドしてECRにPush
* ECSクラスタ
    * App, Webコンテナを動かす

## CodePipeline

単一PipelineでApp, WebコンテナのビルドとECSへのデプロイをやろうと思ったのですが、下記問題があったのでWebとAppで別のPipelineにしました。

* Web, Appどちらかの更新で両方のビルドが始まってしまう
* ECSへのデプロイ時に片方が常に失敗する

# 成果物

CodePipeline
https://github.com/kter/learning_of_codepipeline_ecs
Webコンテナ用
https://github.com/kter/learning_of_codepipeline_ecs_web
Appコンテナ用
https://github.com/kter/learning_of_codepipeline_ecs_app

# 備考

前述の通り、最初1つのPipelineでWeb, App両方のビルド & デプロイをしようと思ったのですが、リポジトリ更新時どちらもビルドが始まってしまう問題と、ECSのデプロイが失敗する問題で、最終的には2つに分けました。
例外処理について

#例外処理について
今までしっくりきていなかったことで、考えがまとまったのでメモります。
プログラミングのみの話でもないので、そちらも書きます。

#例外という言葉の意味
そもそも例外という言葉の意味がわかっていませんでした。
例外とは簡単にはエラーなんですが、なぜエラー＝例外なのかというと、
例外が異常に含まれるからです。
端的には上記ですが、詳しくすると、
プログラムは基本正常系と異常系に分かれており、
何も問題なく動くことを正常系、
何か問題があり想定していた動作以外のことが発生することを異常系と分類します。
例外はこの異常系に分類され、想定動作以外のことすなわち例外＝エラーという形になります。 

#例外処理コード

```example_controller.rb
def example
  begin
  #エラーが起こるかもしれないコードが書いてある
  rescue => e
  #エラーが起きた時の処理
  end
end

```

#resucueより下のエラーが起きた時の処理はちゃんと書こう
例外処理を書くのであればrescue以下はしっかり書きましょう。
ここを書かないでいると、何かしら問題が起きた時そのログを取ることができなくなってしまいます。（もしくは損害が起こらないように対処することもできない）
個人で作っている小さいサービスなどであれば問題はないですが、お客さんからお金をもらっているような大規模なサービスなどになるとかなり真剣に書かないとやばいです。もしサービスが何かしら誤作動を起こし、お客さんに損害を与えた場合、それがお客さんの操作ミスなのか、こちらのコーディングミスなのかを判別するのはそのログです。もしそのログがなければそのままこちらの責任になりかねません。
証拠を残すために必要なコーディングになリます。


こういう話を知ると、経営に関われている感じがして、一次元上のコーディングができそうだなと思いました。
そういうところも考えられるようなエンジニアにもなりたいと思いました。
「車輪の再発明」を否定するのは間違っているかもしれない

#「車輪の再発明」

>新たな付加価値が何もないものを作成するのにコストをかけることから、皮肉的なニュアンスで用いられる。再発明を行ってしまう理由としては、「既存のものの存在を知らない」「既存のものの意味を誤解している」といったことが挙げられる。主にIT業界、とくにSEやプログラマの間で良く用いられる。

[「車輪の再発明」Wikipediaより引用](https://ja.wikipedia.org/wiki/車輪の再発明)

**「車輪の再発明」** はやってはいけないこと。
こんな風潮がありませんか？
もちろんやらない方が良いケースは沢山あるのだと思います。
けれども今 **「あたりまえじゃないの？」** と思われた方、下のブログを読んで少しだけ考えて見ませんか？

自分はずっと、自前でものづくりをしてきて（何もないのでそうせざるを得ないことがほとんどだった）**得られたものがとても大きかった** なと感じています。現代のITを巡る開発現場では、既に多くの優れたフレームワークやライブラリを導入して効率アップをすることが前提に進んでいます。それらのほんの一部であっても自前で自作に挑戦するなどということは、なかなか許されることではありません。もちろん自作しないでも原理原則を学ぶこともできれば概要を理解することもできるでしょう。それを否定するわけではまったくありませんが、自作することによってより多くの知見や理解やひらめきが得られることもまた事実です。
このような考えのブログ・記事をググってみたところ、多くはないもののそれぞれ知見に溢れたものが何点か見つかりました。ここではそれらのブログ・記事を紹介してみたいと思います。

<font color="Red">
**【注意】下記のブログ・記事は、私がググって見つけた「他の方が書かれた、また多くの知見が含まれたブログ記事」です。一部引用もさせていただきました。ここにお礼と共に特記しておきます。ありがとうございます。**
</font>
この記事に触れて、**「車輪の再発明」** を少しやってもいいのかな、と感じられた方が少しでもいれば幸いです。



# もっと車輪の再発明をしよう
[もっと車輪の再発明をしよう【ビスケットのあれこれ】](https://blog.nabeen.be/2018/04/wheel-re-invention.html)
下記に冒頭を引用
>以前，若い人と話をしていたら何かを躊躇するような発言があって，聞いてみたら「それは車輪の再発明になっちゃう」ということを言っていた．どうやら，最近の若い人たちの間では車輪の再発明を極端に怖がるような流れになっているようだ．

>車輪の再発明はなぜいけないのか．Wikipediaによるとライブラリがあるのにそれを使わないと互換性が無くなるから，といったことが書いてあったがこれは，車輪の再発明なんかではない．そもそも車輪というすごい発明に対してライブラリなんていう誰でも思いつくものと比較するのは車輪に対して失礼だ．ライブラリを活用しないでオリジナルのライブラリを作っちゃうとソフトウェアのメンテナンスが大変だという現象は，そういう名前を付けて止めるようにすべきだ．車輪などといったすごい発明を借りるべきではない．

# 車輪の再発明の効用

[車輪の再発明の効用【プログラマが知るべき97のこと】](https://プログラマが知るべき97のこと.com/エッセイ/車輪の再発明の効用/)
下記に一部を引用

>車輪の再発明をしようとした結果、失敗をすることもあるでしょう。しかし、それは一度で車輪の再実装がうまくいくよりも貴重な体験になるはずです。自分の予でゼロからコードを書き、あれこれと試行錯誤をすることを通して学ぶのは、ただ技術者を読んで学ぶこととは大きく違います。試行錯誤をしている間は、悔しがったり喜んだり、感情が大きく動くことになるからです。

# 「車輪の再発明」を単純に否定することで失なっているもの

[「車輪の再発明」を単純に否定することで失なっているもの](http://nobkz.hatenadiary.jp/entry/2017/12/05/013531)
下記に一部を引用

>ソフトウェアの世界では、基本的には「車輪の再発明」は否定されている。しかしながら、本当にそうなのだろうか?と思うことが、最近、いや、ここやってきてずっと思っていることがある。そして、この匿名の記事を読んで、またなんとなく思うことをがんばってかいてみる。

# 車輪を再発明しよう

[車輪を再発明しよう](http://mojix.org/2013/04/30/reinvent-the-wheel)
下記に一部を引用
>「車輪の再発明」は、基本的に否定的なニュアンスをもっていて、「車輪を再発明すべきでない」という意味を含んでいる。しかし私の経験では、「車輪を再発明したほうがいい」場合もけっこうある。

# 車輪の再発明をすることで僕たちは理解を深めることができる

[車輪の再発明をすることで僕たちは理解を深めることができる](https://blog.nabeen.be/2018/04/wheel-re-invention.html)
下記に一部を引用

>まぁ簡単に言えば、既にあるものを使わずに「同じ機能」のものをもう一度作りなおす、いわば「無駄」の代名詞のようなものだ。

>ただこれには一点、有意義な点があって、それは「再発明することで深い理解を得られる」ということにある。
【Houdini】岩のジェネレータ作成

#はじめに
こちらのチュートリアルを日本語でまとめただけです。
[Procedural Rock Houdini Tutorial](https://www.youtube.com/watch?v=RP7wdVwp0dI&t=432s)

attributeVOPはすぐ忘れてしまうので、見返し用。

![rock.gif](https://qiita-image-store.s3.amazonaws.com/0/293594/f9af20a8-f51d-d142-e01b-da2c13ebcb4f.gif)


##Sphereノード

<img width="1434" alt="Screen Shot 2018-09-30 at 22.39.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/293594/eb023d1a-b935-ab04-56d3-87556f03db31.png">


まずはSphereを作ります。
Primitive Typeは「Polygon」です。
Frequencyをかなり上げます。
150～300くらいまで上げて大丈夫ですが、ここでは「150」。

##Rest Positionノード
サーフェスを変形しても、テクスチャがはがれないようにする為のノードです。

##Attribute VOPノード
内部に入り、進めていきます。
offset: 岩の形状
scale: 角張り加減
noise: ノイズ加減
のパラメータをいじれるように作っていきます。

<img width="1219" alt="Screen Shot 2018-09-30 at 22.41.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/293594/8c49b3fc-d36f-e005-e320-0169c50a3992.png">


###geometryvopglobal
P>「worleynoise: pos」
P>「turbnoise: pos」
P>「displacenml: P」

###parameter1(parm)
Nameを「offset」に。

###worleynoise
dist>「multiply: input1」

Frequencyの値を下げる。「0.5」など。
var1の値をvar2/3にコピペする。

###parameter2
Nameを「scale」に。
parm>「multiply: input2」

offset>fvar1/fvar2/fvar3に繋げる。　
これはworleynoiseのoffsetに、XYZの3つがあるからです。

###parameter3
Nameを「noise」に。
parm>「turbnoise: amp」

###float to vector
vec>「worleynoise:offset」に繋げる。

###multiply
product>「add: input1」

###turbulent noise
noise>「add: input2」

Frequencyを「0.6」くらいに。

###add
sum>「displacement: amount」

###displacement along normal
dispP>「geometryvopoutput: P」

#最後に
VOP難しい、、、
ただ、Houdini初めて1ヶ月も経ってないのに、こういうのを作れると楽しいですね。
Houdini Lifeを楽しみましょー！！！
ずんだの縦読み問題 Python編

Twitterで流行っていたので、先週から勉強中のPythonにて便乗してみました。

#### 他の言語での実装は以下のようなものがあります。(順不同)
* [ずんだの縦読み問題 Perl編](https://qiita.com/sapi_kawahara/items/19fcdc074fab6d55acd5)
* [ずんだの縦読み問題 php編](https://qiita.com/higuyume/items/7d3c03ddbbd6f4ad7aa1)
* [ずんだの縦読み問題 Java 12 Early-Access 版](https://qiita.com/neko_the_shadow/items/67e96e613b7f06ddc5fc)
* [ずんだの縦読み問題 Go編](https://qiita.com/kentfordev/items/d9a78e34d1e8bf2e703a)
* [ずんだの縦読み問題 JavaScript編 @clown0082さん](https://qiita.com/clown0082
/items/941f231486e95c219e75)
* [ずんだの縦読み問題 JavaScript編 @erukitiさん](https://qiita.com/erukiti/items/49ccb0211a18b6bef44a)
* [ずんだの縦読み問題 ShellScript編](https://qiita.com/VTRyo/items/8b353631711ac7e059bf)
* [ずんだの縦読み問題 Nim編](https://qiita.com/angel_p_57/items/dade937b14eef2f4d866)
* [ずんだの縦読み問題 Java 12 Early-Access編](https://qiita.com/neko_the_shadow/items/67e96e613b7f06ddc5fc)


#### 回答
```
>>> tweet = """\
... 忙しくてついったいじれない
... さみしい
... つらい\
"""
>>> splited_tweet = tweet.splitlines()
>>> print(splited_tweet[0][0]+splited_tweet[1][0]+splited_tweet[2][0])

# 出力結果
忙さつ

```

#### 感想
* 上記を通じた学びは以下
    * Pythonで複数行の値を保持するためには”””(ダブルクオーテーション3つ)で文字を囲う必要があること
    * 上記の中で文字の開始と終了時に改行させないためには入力文字前後に"\"(バックスラッシュ)を入力すること
    * 正規表現で改行を利用して文字列を分割する際にsplitlines()が利用できること
* もっと良い実装方法があればコメントいただければ嬉しいです。

#### 参考
* [Udemy Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準備をする ](https://www.udemy.com/python-beginner/)
* [Python Tips： split() を活用したい](https://www.lifewithpython.com/2018/01/python-split.html)
sortとsort_byを使って配列の要素を並び替える

## sortについて
Rubyのソート機能について学んだので、　メモ

```sort.rb
schools = ["Todai", "Kyodai", "Waseda", "Aichi"]

p schools.sort
#=> 配列の要素がstringの場合はアルファベット順に並べることができる
#["Aichi", "Kyodai", "Todai", "Waseda"]
```
```sort.rb
numbers = [4, 1, 2, 9, 5, 3]

p numbers.sort
#=> integerクラスの場合は文字が小さい順に並べてくれる
#[1, 2, 3, 4, 5, 9]
```
```sort.rb
p numbers.sort.reverse
#=> reverseメソッドを繋げれば、次は大きい順にソートが出来る
#=>[9, 5, 4, 3, 2, 1]
```
## sort_byについて
そしてsort_byだけど、私のようなプログラミング初心者にとってはこれがちょっと曲者だなと思う。

```sort.rb
animals = ["mouse", "dog", "hippopotamus", "giraffe"]
p animals.sort_by {|animal| animal.length }

#=>["cat", "mouse", "giraffe", "hippopotamus"]
```
つまりどういうこと！？　文字数が少ない順に並べてるのはわかったけどさ。
色々調べた結果、個人的には下記のように書くことでかなり理解が進んだ。

```sort.rb
a = animals.sort_by do |animal|
  animal.length
end

p a
#=> ["dog", "mouse", "giraffe", "hippopotamus"]
```
animalsに格納されてある各要素に対してlengthメソッドを使い、返り値を集めて、集まった値に対してsortをかけているということだと理解した。　これだとわかりやすい。

```sort.rb
test_score = { 'suzuki' => 90, 'sato' => 50, 'kato' => 60, 'wada' => 40 }
p test_score.sort_by {|k, v| k }

#=>[["kato", 60], ["sato", 50], ["suzuki", 90], ["wada", 40]]

test_score = { 'suzuki' => 90, 'sato' => 50, 'kato' => 60, 'wada' => 40 }
p test_score.sort_by {|k, v| v }

#=> [["wada", 40], ["sato", 50], ["kato", 60], ["suzuki", 90]]
```

ハッシュに対しても使うことが出来る。 kにはキーが入り、vにはバリューが入っている。　ブロックでkと指定すればキーに対してソートをかけて、vとすればバリューに対してソートをかけることができる。
【Unity】視点の移動

### 大きな流れ
1. GameObjectの取得とポジションの取得
2. ポジションの変更

## GameObjectの取得とポジションの取得
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class TimerAndMove : MonoBehaviour {
  GameObject camera;

  // Use this for initialization
  void Start () {
    camera = GameObject.Find("OVRCameraRig");  // GameObjectの取得
    pos = camera.transform.position;  // ポジションの変更
  }	

  // Update is called once per frame
  void Update () {
  }
}
```

- OVRCameraRigはGameObjectの名前

## ポジションの変更
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class TimerAndMove : MonoBehaviour {
  GameObject camera;

  // Use this for initialization
  void Start () {
    camera = GameObject.Find("OVRCameraRig");  // GameObjectの取得
    pos = camera.transform.position;  // ポジションの変更
  }	

  // Update is called once per frame
  void Update () {
    camera.transform.position = new Vector3 (pos.x , pos.y, pos.z + 10);
  }
}
```

- この場合z軸方向に１０ずつ移動し続ける