OmniAICreator/Qiita-1.07M huggingface dataset:
PowerShell で SharePoint Online に CSOM でアクセスしてみる

[ブログからの転載](http://1bed.saloon.jp/?p=2457)

しぇあぽいんとさんと仲良くなるために、まずは Windows では一番慣れている PowerShell を使って SharePoint Online へアクセスしてみたメモ。

CSOM (クライアント側オブジェクト モデル) を使って、リスト一覧を取得してみます。


## 環境

* Windows 10 Pro
* PowerShell 5.1

## 事前準備

SharePoint Online 用の SDK がインストールされていない時はインストールします。

* SharePoint Online Client Components SDK のダウンロードとインストール  
  [https://www.microsoft.com/en-us/download/details.aspx?id=42038)](https://www.microsoft.com/en-us/download/details.aspx?id=42038)  
  ※64 bit と 32 bit を間違わないように

## サンプルコード

ユーザーが miyamiya@example.com、SharePoint Online の URL が https://&lt;tenant>.sharepoint.com/sites/example と仮定してサンプルコード書く。


```ps1
# SDK の読み込み
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null

# 取得する SharePoint Online の URL
$url    = 'https://<tenant>.sharepoint.com/sites/example';

# ユーザー名
$user   = 'miyamiya@example.com';

# パスワード
$secure = Read-Host -Prompt "Enter the password for ${user}(Office365)" -AsSecureString;

# SharePoint Online 認証情報
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($user, $secure);

# SharePoint Client Context インスタンスを生成
$context = New-Object Microsoft.SharePoint.Client.ClientContext($url)
$context.Credentials = $credentials

# サイトにあるリストを取得
$lists = $context.Web.Lists

# 取得予約
$context.Load($lists)

# リスト取得実行
$context.ExecuteQuery()

# リストの作成日時とタイトルを表示
$lists | %{ "Created: {0}, Title: {1}" -f $_.Created, $_.Title }
```

## 考察

一旦 Load で予約して、ExecuteQuery で実際に取得するのが慣れるのに時間がかかりそう。

## 参考

* [SharePoint Online に対して PowerShell を使用する方法](https://blogs.technet.microsoft.com/sharepoint_support/2014/10/19/sharepoint-online-powershell/)
HBase hbckについて その3

HBaseにはhbckという、リージョンやテーブルの整合性や完全性をチェックしたり、壊れていたりした場合に修復するツールがあります。この記事では、そのhbckの使い方や仕組みを説明したいと思います。バージョンはHBase 1.1.2 (HDP 2.5) をベースにしています。

本記事は以下の記事の続きです。

HBase hbckについて その1
http://qiita.com/brfrn169/items/3c4c3c1b04c36db250f6

HBase hbckについて その2
http://qiita.com/brfrn169/items/d62a4b128ed623748262

# その他のオプション

今回は、ここまでに説明したオプション以外のオプションについて説明していきたいと思います。

## -metaonly

`-metaonly`を指定するとhbase:metaテーブルの整合性のみをチェック・修正します。

## -noHdfsChecking

`-noHdfsChecking`を指定すると、HDFS上の.regioninfoファイルの情報をチェックしたり、HDFS上の問題(ホール、オーバラップ等)の修正を行いません。hbase:metaの情報がHDFS上と完全に一致してることを前提のチェック・修正を行います。

## -ignorePreCheckPermission

hbckは、正しくチェック・修正を行うために、最初にHDFS上のパーミッションチェックを行います。`-ignorePreCheckPermission`を指定するとこれをスキップすることができます。

## -checkCorruptHFiles

`-checkCorruptHFiles`を指定すると、実際にHFileをオープンしその内容のチェックを行います。また、`-sidelineCorruptHFiles`を指定すると、HFileが破損していた時にそのHFileを退避させます。この時、退避場所はhbaseのデータディレクトリ内の、"hbase.hfile.quarantine.dir"プロパティで指定されたディレクトリ以下になります。

## -boundaries

`-boundaries`を指定すると、hbase:meta上のリージョンの境界と実際のHFileの境界が正しいかどうかをチェックします。この際には実際にHFileの内容を読み込みチェックします。

## -repair

`-repair`は以下のオプションのショートカットオプションになります。

```
-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans -fixHdfsOverlaps -fixVersionFile -sidelineBigOverlaps -fixReferenceFiles -fixTableLocks -fixOrphanedTableZnodes
```

## -repairHoles

`-repairHoles`は以下のオプションのショートカットオプションになります。

```
-fixAssignments -fixMeta -fixHdfsHoles
```

# まとめ

今回でhbckのシリーズを終わりにします。ここまで、3回に渡ってhbckの説明をしてきましたが、HBaseのトラブルシューティングの際に参考になれば幸いです。
aws-cli + jq でロードバランサー（ELB, ALB）のロギング設定を確認する

# 遭遇した課題

AWSではロードバランサー（ELB, ALB）のアクセスログをS3上に保存することができるわけですが、将来のことをあまり良く考えずに場当たり的に設定した結果、以下のような課題にぶち当たりました。
起動しているロードバランサーが数台であれば、WEB管理画面からポチポチ確認すれば良いのですが、10台超えたあたりからしんどくなってきます。。。

* そもそもアクセスログ有効になってるのか？
* どのS3バケットのどんなパスに保存しているのか？

そこで、以下のように aws-cli + jq を使うといくらか苦痛が緩和されました。

# 手順

## ELB の場合

実行したコマンド

```bash
$ aws elb describe-load-balancers | jq -r '.LoadBalancerDescriptions[].LoadBalancerName' > /tmp/elb-names.txt

$ cat /tmp/elb-names.txt | while read NAME \
do \
echo $NAME \
aws elb describe-load-balancer-attributes --load-balancer-name=$NAME \
| jq '.LoadBalancerAttributes.AccessLog | "s3://\(.S3BucketName)/\(.S3BucketPrefix)"' \
echo \
done
```

出力例

```bash
# ロギング設定なし
elb-hogehoge1
"s3://null/null"

elb-hogehoge2
"s3://bucket2/prefix"

elb-hogehoge3
"s3://bucket2/prefix"
```

## ALB の場合

実行したコマンド

```bash
$ aws elbv2 describe-load-balancers | jq -r '.LoadBalancers[].LoadBalancerArn' > /tmp/alb-arns.txt

$ cat /tmp/alb-arns.txt | while read ARN \
do \
echo $ARN | cut -d'/' -f3 \
aws elbv2 describe-load-balancer-attributes --load-balancer-arn $ARN \
| jq '"s3://\(.Attributes[] | select(.Key=="access_logs.s3.bucket").Value)/\(.Attributes[] | select(.Key=="access_logs.s3.prefix").Value)"' \
echo \
done
```

出力例

```bash
# ロギング設定なし
alb-hogehoge1
"s3:///"

alb-hogehoge2
"s3://bucket2/prefix"

alb-hogehoge3
"s3://bucket3/prefix"
```
Easy Masking TransitionがUnity5.5以降で動かないけど動かす

久しぶりにEasy Masking Transitionを使ってみようと思ったらエラーになっていたので
ついでに記事にすることにした。

エラーになったのはUnity5.6.0b8
ちなみにUnity5.3.2とかでインポートしたら普通に動いたのでそこでインポートしたものをUnity5.6.0b8に持っていけば普通に動いたというw

何がダメだったのかとかは追ってないですw
ユーザーレビューによれば5.5から動かないそうなので、持っている人で動かないぞばかやろーって人は古いUnityとかでインポートして持ってってみてください。

前にもこれで使えるようになったアセットあったな。意外と古いバージョンのUnityもあると役に立つ。

左が動かなかった時のDemo1 (Viewer) 右が正常なDemo1 (Viewer)
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/53aa2869-84ed-b835-4569-288e709e8b04.gif" width="300"><img src="https://qiita-image-store.s3.amazonaws.com/0/46444/90dc9975-68c7-9511-e05b-60be51b3da4f.gif" width="300">

2年半前くらいに記事で書いたときは
<a href="http://befool.co.jp/blog/ayumegu/unity-study-transition/" target="_blank">Unityでトランジション(Easy Masking Transition)</a>
MeshrendererだったけどちゃんとCanvasに対応してる。RawImageだね。

<h2>インポートしたところ</h2>
<img width="229" alt="スクリーンショット 2017-04-11 14.55.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/540301e1-b0c8-07db-9e16-c45b19e7ac42.png">

<h2>使い方</h2>

昔は画像を使うやつと色だけので2つprefabがあったけど今はどちらの場合も
Easy Masking Transition.prefabをCanvasの下におけばOK

画像を指定するときはインスペクタのRawImageに画像をセット。
EM TransitionのGradation TextureにEasyMaskingTransition/Textures/Gradationsの下にずらっとあるなかなか好きなものをセット。これだけ。

<img width="273" alt="スクリーンショット 2017-04-11 14.57.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/417ef707-5eaa-7261-1be1-b37b8d604650.png"><img width="150" alt="スクリーンショット 2017-04-11 15.01.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/c04fd2cf-528d-9825-2735-7d1db45f46bd.png">

あとはUIの前にTransitionが表示されない！ってのは
Materialの設定の一番下Render Queueの値を大きくすれば手前にくるよ。
デフォルトが2450とかだったので。
<img width="270" alt="スクリーンショット 2017-04-11 15.11.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/bd3be9ba-ef74-8244-5867-d7f4911a3b0d.png">

あとはおおおの好みにコールバックとか速度のカーブとか決めるだけ！
うん。相変わらずお手軽です。

<h2>こんなの出来たよ</h2>
Transitionのカーブを変えたりすればこんな演出も出来ます＾＾
Transition終了のcallbackなどもインスペクタで設定できるよ！
Scriptから動かすときはEMTransitionのPlay関数を呼ぶだけ。
![Unity5.6-3.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/bb47c5c4-44f1-ac45-30cd-ce308e420bf2.gif)


はい、ここまで。
AtomでUML図を描く

# AtomでUML図を描く

## 概要

表計算ソフトで図を描くのに疲れたのと、図をバージョン管理するのが微妙だったのですが、AtomとPlantUMLがこの問題を解決してくれそうな気がしてます。

テキストであればバージョン管理との親和性も良いですね。

- Atom([https://atom.io/](https://atom.io/)):  
  素晴らしいエディタです。これ以上の説明はいらないでしょう。  
- PlantUML([http://plantuml.com/](http://plantuml.com/)):  
  テキストからUML図を生成するツールです。専用の言語でUMLを書くことになりますが、シンプルなので学習コストは高くありません。

PlantUMLは実行可能JARファイルでも提供されているため、テキストから図を生成することは簡単に試せます。  
また、PlantUMLの公式サイトでは入力されたテキストから動的に図を生成するサンプルが動作するため、とりあえずPlantUMLに触ることも簡単です。  

## Installation

私の環境(ソフトウェア)は以下の通りです。

```yaml
- macOS: 10.12.4
  software:
    - Atom: 1.16.0
      packages:
        - plantuml-viewer: 0.7.1
        - language-plantuml: 0.2.0
    - MacPorts: 2.4.1
      ports:
        - Graphviz: 2.40.1_1
```

Atomのpackgeのplantuml-viewerが "AtomでUML図を描く" をすべてやってくれます。最高のpackageです。language-plantumlは _.plantuml_ ファイルをSyntax highlightingしてくれます。便利なpackageです。

Windowsでも同様の環境を構築してPlantUMLできますが、手元に環境がないため詳細を書けません。

### MacPorts and ports

MacPortsはmacOS用のパッケージ管理システムです。今回はPlantUMLに図を描画させるためにGraphvizが必要なので、これでGraphvizをインストールします。

MacPortsは [https://www.macports.org/](https://www.macports.org/) からダウンロードできます。ダウンロードしたインストーラを実行します。これで `port` コマンドが使えるようになります。

Graphvizは次のコマンドでインストールします。これで `dot` コマンドが使えるようになります。

```shell-session
$ sudo port install graphviz
...
$ which dot
/opt/local/bin/dot
```

### Atom and packages

Atomは素晴らしいエディタです。これでplantumlを書きます。

Atomは [https://atom.io/](https://atom.io/) からダウンロードできます。私はダウンロードしたZIPを解凍して `/Applications` に設置してます。

packagesはAtomのメニューの `Atom > Preferences... ⌘,` からの `Settings > Install` でpackage毎に検索してインストールします。

plantuml-viewerのSettingsの `Graphviz Dot Executable` に `dot` のパス( `/opt/local/bin/dot` )を設定します。インストールしたpackageのSettingsはAtomのメニュー `Atom > Preferences... ⌘,` からの `Settings > Packages` の各packageのSettingsボタンで遷移できます。

## Demo

例として "AtomでUML図を描く環境" を描いてみました。plantumlの書き方は模索中です。(肝心のUML図に自信がないです...)

_.plantuml_ ファイルをAtomでオープンしてメニューの `Packages > PlantUML Viewer > Toggle View ^⌥P` を実行するか `ctrl-alt-p` で図のプレビューが表示されます。プレビューは _.plantuml_ を変更する度に更新されます。

**env.plantuml**

```plantuml
' Created by takayoshiotake on 2017-04-16
@startuml
object "AtomでUML図を描く環境" as o_env {
  version: 1.0
}

  object "macOS" as o_os {
    version: 10.12.4
  }
  o_env <|.. o_os

  object "Atom" as o_atom {
    version: 1.16.0
  }
  o_os o-- o_atom

    object "plantuml-viewer" as o_atom_plantumlviewer {
      version: 0.7.1
      note: Package of Atom
    }
    o_atom o-- o_atom_plantumlviewer

    object "language-plantuml" as o_atom_languageplantuml {
      version: 0.2.0
      note: Package of Atom
    }
    o_atom o-- o_atom_languageplantuml

  object "MacPorts" as o_macports {
    version: 2.4.1
  }
  o_os o-- o_macports

    object "Graphviz" as o_graphviz {
      version: 2.40.1
      which: /opt/local/bin/dot
    }
    o_macports o-- o_graphviz
    o_atom_plantumlviewer ..> o_graphviz: <<use>>
@enduml
```

**env.png**

![env.png](https://qiita-image-store.s3.amazonaws.com/0/97440/9d1deee0-60d2-256e-85ad-ae5e555f95c2.png)

plantuml-viewerのpreviewを `Save As...` する際に、ファイル名に _.png_ を付けるとPNGイメージで保存できます。拡張子がない場合はEPSになるようです。(SVGも出力できます)

plantumlの基本的な書き方は公式サイトが参考になります。
OSXでRDKitをソースからビルドするときに出るboost関係のエラーをなんとかする

## Q：RDKitのビルド時、 make 中に下記のようなエラーがでてビルドが進まない

```shell-session
$ make
[  0%] Built target inchi_support
[  1%] Built target RDGeneral
[  2%] Built target RDGeneral_static
[  3%] Built target testDict
[  4%] Built target testRDValue
[  4%] Linking CXX shared library ../../lib/libRDBoost.dylib
[  4%] Built target RDBoost
[  4%] Built target RDBoost_static
[  4%] Linking CXX shared module ../../../rdkit/rdBase.so
Undefined symbols for architecture x86_64:
  "boost::python::detail::init_module(PyModuleDef&, void (*)())", referenced from:
      _PyInit_rdBase in RDBase.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [rdkit/rdBase.so] Error 1
make[1]: *** [Code/RDBoost/Wrap/CMakeFiles/rdBase.dir/all] Error 2
make: *** [all] Error 2
```

## A: boostのライブラリの問題なので `--with-python3 --without-python` を付けてインストールし直す

```
brew uninstall boost-python
brew install boost-python --with-python3 --without-python
```
AgileJapan2017 基本講演レポート

# AgileJapan2017 基調講演レポート
AgileJapan2017に参加したいくつかのセッションをレポートにまとめたいと思います。

まずは基調講演のレポートです。

## AgileJapan2017に参加した感想
今年初参戦だったので、どれくらいの人が集まるのかわからないまま会場入りしたところ参加者が非常に多くて驚きでした。

船越タワーホールの大ホールが満席とのこと。（一部座れないように区切られていたが、それにしても多かった。）

全セッション終了後のネットワーキングセッション（懇親会）も料理、ドリンクともに非常に美味しいものばかりでした。

各セッション内容、セッション発表者共に素晴らしいものが多く非常に刺激を受けた。

### 基調講演：“モダンアジャイル”

Joshua Kerievsky氏

#### セッション概要

- モダンアジャイルとは

- モダンアジャイル4つの基本理念

---

## 参加セッションレポート

### 基調講演 "モダンアジャイル"

まず始めにJoshua氏があげた、失敗するプロジェクトの共通点。

```
失敗するプロジェクトの共通点

1. ユーザストーリーが大きくなりすぎている
2. スプリントがプレッシャーになっている
3. Doneの定義が間違っている
```

Joshua氏は __今までのアジャイルでは時代遅れだと感じ、モダンアジャイル4つの基本理念を確立する__ 

![モダンアジャイル](https://anagileway.files.wordpress.com/2016/10/modernagilejp.png "モダンアジャイル")

#### モダンアジャイル4つの基本理念
```
1. 人々を最高に輝かせる（Make people awesome）
2. 安全を必須条件にする（プログラムの安全、労働環境の安全、経済的安全）
3. 高速に「実験」 & 「学習」
4. 継続的に価値を届ける
```

__1. 人々を最高に輝かせる（Make people awesome）__ 

まず、何よりもJoshua氏が強調するのは __「我々がこれから作るものは本当に人々を最高にさせることが出来るものなのか？」__ ということ。

Doneの定義はエンドユーザに効果を与えるかどうか。エンドユーザに効果がないものに時間を費やすのは間違っているという考えからだ。

そのような考えからJoshua氏は以下のこと述べる

```
・良いプロダクトではなく良いユーザを作ろう。

・ユーザが自分の製品（サービス）を使うことですごいやつになることを考えよう。
```

---

__2. 安全を必須条件にする（システムの安全、労働環境の安全、経済的安全）__

Joshua氏は『安全』であることの重要性に気づき『[Anzeneering](https://www.industriallogic.com/blog/anzeneering/)』を提唱する。

[Anzeneering](https://www.industriallogic.com/blog/anzeneering/)を簡単にまとめると、 __人は恐怖や不安があると最大限の力を発揮出来なくなる。そのため働く人間の最大の力を発揮させるには恐怖や不安と取り除くことが必要だ__ というもの。

またJoshua氏はGoogleの調査で __人は恐怖があると素早く行動を起こせない__ ことが科学的にも判明しているということも紹介していた。
（※恐怖や不安はシステムだけではなく、労働環境、収入なども含まれるとのこと）

これにより失敗するプロジェクト共通点 `2. スプリントがプレッシャーになっている` を解決しようというものである。

---

__3. 高速に「実験」 & 「学習」__

Joshua氏は『Amazon FirePhone』を例にあげ、プロジェクトに失敗はつきものだと言う。

だからこそ先述した失敗するプロジェクトの共通点は

```
1. ユーザストーリーが大きくなりすぎている → 高速で行うためユーザストーリーを小さくしなければ行けない
3. Doneの定義が間違っている → 素早く失敗に気づくためにしっかりと定義しなくてはいけない
```

となるべきだと言い、 __Outputs（出力・リリースしたこと）__ を評価するのではなく、 __Outcomes（結果）__ を重要視しなければいけないことを述べた。

高速に｢実験｣ & 「学習」を回す中で重要なのは __失敗に早く気づくこと__ だという。

『失敗に早く気づくため』ユーザストーリーは小さく、Doneの定義を正しく行う。

---

__4. 継続的に価値を届ける__ 

モダンアジャイル基本理念の1〜3を継続的にユーザへ届ける。

---

Joshua氏はモダンアジャイルも各開発環境に合わせてカスタマイズしていく必要があることを述べつつも、最後は『Make people awesome』で締めくくった。

---

#### セッション感想
とても為になる話を聞けて光栄でした。どうプロジェクトを進めるべきかの根本の考えを聞けたことは今後の私の仕事に対する姿勢にも影響すると思います。Make people awesome. 良いキーワードです。

本来であればもっと細かく色々な話があったのですが、レポートとなるとすべてを伝えきれないことに歯がゆさを感じます。

またセッション自体英語で行われ、私の拙いリスニング能力と同時通訳での理解なので、英語のニュアンスが私に伝わりきれていない可能性があることを考えると悔しく、人並みの願望ではありますが、もっと英語勉強しようと思った次第です。

近日中にマイクロソフト社における __Visual Studio Team__ のセッションの話が非常に面白かったんので、レポートにまとめたいと思います。
ラムダ式と流れるようなインターフェースで楽しくプログラミングしよう

業務でJava8を使うようになってから、ラムダ式を使ってもう少し流暢なコードは書けないかと模索してきました。
最近やっと良さげなコードが書けたので、是非Java技術者の皆さんに共有したく、初めてQiitaで記事を書いています。

今回はサンプルのみ記載して、裏側の仕組みなどは別途紹介できたらなと思います。

https://github.com/mt-village/nagare

サンプルはコーヒーを淹れる手順を模したプログラムになっています。

```Java:
public void easygoing() {
    WholeCoffeeBeans wholeBeans = WholeCoffeeBeans.inGrams(50);
    GroundCoffeeBeans groundBeans = Mill.grind(wholeBeans);
    Water water = Water.inMilliliters(500);
    HotWater hotWater = Kettle.boil(water);
    Coffee coffee = Dripper.drip(groundBeans, hotWater);
    CoffeeAddict saya = new CoffeeAddict();
    saya.drink(coffee);
}
```
日本語で書くと、ミルでコーヒー豆を挽いて、ヤカンでお湯を沸かして、ドリッパーで抽出したコーヒーをサヤさんが飲むと、となります。わざと入れ子無しで丁寧に書いているのですが、型をいちいち書かないといけないのでかなり面倒です。

同様の処理を以下のようにも書けます

```Java:
public void impatient() {
    new CoffeeAddict().drink(Dripper.drip(
            Mill.grind(WholeCoffeeBeans.inGrams(50)), Kettle.boil(Water.inMilliliters(500))));
}
```
だいぶ短くなりましたが、2重の入れ子構造になっていて、中から外の順に解釈しないといけないため、人間の脳には若干厳しい感じです。

nagareで追加した8クラスを使うと以下のような記述が可能になります。

```Java:
public void nagare_prepositive() {
    CoffeeAddict saya = new CoffeeAddict();
    Do.when(WholeCoffeeBeans.inGrams(50), Water.inMilliliters(500))
            .then(Do.first(Mill::grind).and(Kettle::boil))
            .then(Dripper::drip)
            .done(saya::drink);
}
```
```Java:
public void nagare_postpositive() {
    CoffeeAddict saya = new CoffeeAddict();
    Do.first(Mill::grind).and(Kettle::boil)
            .then(Dripper::drip)
            .done(saya::drink)
            .by(WholeCoffeeBeans.inGrams(50), Water.inMilliliters(500));
}
```
```Java:
public void nagare_logic_and_exec() {
    Saver<Coffee> brewCoffee = Do.when(WholeCoffeeBeans.inGrams(50), Water.inMilliliters(500))
            .then(Do.first(Mill::grind).and(Kettle::boil))
            .then(Dripper::drip);
    CoffeeAddict saya = new CoffeeAddict();
    saya.drink(brewCoffee.let());
}
```
基本的な考え方はJava8で追加されたStreamに近い感じです。1番上は最初に引数を与える書き方、2番目は最後に引数を与える書き方、3番目はロジックと実行を分離した書き方です。

左から右(上から下)の順に一連の処理が書けるので、慣れてくると思考とコードが一致してなかなか楽しいです。
是非、趣味で書くコード等で試してみて下さい。(趣味でJavaを書く人がいるのか分かりませんが)

サンプルも単体テストとして入れてますので、裏側の仕組みと合わせて興味のある方は覗いてみてください。
https://github.com/mt-village/nagare
複数列にまたがるデータ一覧から検索条件に一致する値を取り出す方法

![検索条件に一致.png](https://qiita-image-store.s3.amazonaws.com/0/160563/1b893600-cd4d-ca5a-bf4b-cba3152415c7.png)


#利用シチュエーション

* 複数列にまたがる既存のデータから特定の条件に一致する値を抽出したい時

##直面した問題
　×　VLOOKUPだとキーにする値は1列しか指定できない


#記述方法
```
=INDEX(抽出対象範囲,条件1と条件2の両方に当てはまる件数,列)

<記述例>
=INDEX($I$2:$I$4,SUMPRODUCT(($D$2:$H$4=A2)*ROW($A$1:$A$3)),1)
```

> **前提条件**
> A列にドメイン名、D列からI列に元となるデータを記載
> ![Excel条件.png](https://qiita-image-store.s3.amazonaws.com/0/160563/39172939-61d8-0287-f4e8-8f79b50fbf31.png)


---

> **抽出結果**
> ![Excel抽出結果.png](https://qiita-image-store.s3.amazonaws.com/0/160563/270ae878-4209-9b99-deed-4883d42a0df2.png)


---

> **解説**

> * SUMPRODUCT関数で特定の条件を指定し、条件に一致した行数をROW関数で抽出
> * INDEX関数で指定した列から上記で抽出した行数の値を抜き出す

> ####個々の関数の説明####
> INDEX関数は指定された行と列が交差する位置にあるセルの値を返す

> |         | 書き方                            | 利用例          |
> |:--------|:---------------------------------|:---------------|
> | 書式    | INDEX(範囲, 行番号, 列番号, 領域番号) | INDEX(I2:I4,1) |
> | 引数1   | 1つまたは複数のセルのを範囲を指定      | I2:I4          |
> | 引数2   | 指定した範囲の上からの行数を指定       | 1              |
> | 引数3   | 指定した範囲の左からの行列数を指定     |                 |
> | 引数4   | 複数の領域を選択した場合、どちらの範囲を使用するか指定      ||

> SUMPRODUCT関数は指定した複数条件の配列の合計(件数)を返す

> |         | 書き方                            | 利用例                    |
> |:--------|:---------------------------------|:-------------------------|
> | 書式    | SUMPRODUCT(範囲1,範囲2,...)        | SUMPRODUCT((D2:H4=A2)*1) |
> | 引数1   | 選択した範囲から一致する条件を指定     | (D2:H4=A2)              |
> | 引数2   | 選択した範囲から一致する条件を指定     | 1                       |
> SUMPRODUCT(範囲1,範囲2)で選択した範囲の合計
> SUMPRODUCT(条件1*条件2)で条件に一致する件数

> ROW関数は指定したセル参照の行番号を返す

> |         | 書き方                       | 利用例          |
> |:--------|:----------------------------|:---------------|
> | 書式    | ROW(範囲)                    | ROW(A1:A3)     |
> | 引数1   | 1つまたは複数のセルのを範囲を指定 | A1:A3          |

#サンプル

* [Googleスプレッドシート](https://goo.gl/b8KZmn)

#参考
##VLOOKUP関数を利用して複数列を検索値として指定したい場合

複数列を検索値として指定したい場合は、前述のINDEX関数を用いたほうが楽ですが、VLOOKUP関数を用いて複数列を指定することも可能です。

##記述方法
検索をする列を指定して、なければ次を指定する入れ子方式で記載。

`=IFERROR(VLOOKUP($A2,$D$2:$E$4,2,),IFERROR(VLOOKUP($A2,$F$2:$G$4,2,),IFERROR(VLOOKUP($A2,$H$2:$I$4,2,),IFERROR(VLOOKUP($A2,$J$2:$K$4,2,),IFERROR(VLOOKUP($A2,$L$2:$M$4,2,),)))))`
プログラミング言語Go読書会#5(3-3.5.4)[2017/04/12]

[Go読書会 #5 ](https://lancers-engineer.connpass.com/event/54757/) が[ランサーズ株式会社](https://www.lancers.co.jp/)で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容は[プログラミング言語Go](https://www.amazon.co.jp/dp/4621300253/?&_encoding=UTF8&tag=amesho-22&linkCode=ur2&linkId=7e29043d833086d36f8b64c2ed3721b2&camp=247&creative=1211)を冒頭から皆で読み進めていくというものです。

## 進捗した内容

+ 3章 基本データ型
  + 3.1 整数
  + 3.2 浮動小数点
  + 3.3 複素数
  + 3.4 ブーリアン
  + 3.5 文字列
    + 3.5.1 文字列リテラル
    + 3.5.2 Unicode
    + 3.5.3 UTF-8
    + 3.5.4 文字列とバイトスライス

## 話題に上がった話

### 3.1 整数

ここだと、C言語だとshort,int,longなどになっていましたが、Goだとint8,int16...int64といった形に統一されたことが話題に上がりました。確かにこの方が分かりやすいです。型で表現可能なビットを超えるとオーバーフローを起こして、型に収まらない上位のビットは黙って破棄されるそうです。動的言語でこのへんを割とよろしくやってくれるものに慣れている人は要注意でしょう。

あとは、Web開発で目にすることはあまりないのですが、ビット演算が話題になりました。参加者の方にバイオ系では割とビット演算を使うという話をお聞きしました。Perlだと[バイオインフォマティクスのためのPerl入門](https://www.amazon.co.jp/gp/product/487311103X/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=487311103X&linkCode=as2&tag=amesho-22&linkId=fedc085f1d714ff6f9bf09f911cd51f3)があったりするのでバイオ系では疲れているみたいです。

もう一つは、fmt.Printfを使うときに以下の様に第1引数の中で指す第二引数をしていすると、同じ値を何個も並べる必要が無いことが例からわからりそこも話題になりました。

```
fmt.Printf("%d %[1]o %#[1]o\n", o)
```

### 3.2 浮動小数点

ここだと、[IEEE754](https://ja.wikipedia.org/wiki/IEEE_754)を全部読んだことある人いますかと聞いてみたんだけど、いませんでした。自分もWikipediaで読んだぐらいで見たことはないです。確か有料で良いお値段するという話になりました。

個人的には、浮動小数点の限界値がmathパッケージに記述されていると言うことできになって[確認](https://golang.org/pkg/math/#pkg-constants)してみました。

NaN(not a number)がうかつに比較すると全部falseになるという話が気になって、[定義場所]()をみにいったり、なぜその値になったのかを[確認](https://github.com/golang/go/issues/9919)しにいったりしました。

NaN() の中身

```
// NaN returns an IEEE 754 ``not-a-number'' value.
28	func NaN() float64 { return Float64frombits(uvnan) }
```

uvnanの値

```
package math
     6
     7	const (
     8		uvnan    = 0x7FF8000000000001
```

最終的に0x7FF8000000000001この値がGCCからきたことは分かったのですが、なんでこれになったのかはまだ分かっていません。

### 3.4 ブーリアン


ここで面白かったのは、&&と||の優先順位の覚え方が乗っていて、&&が乗算で||が加算だからこれを覚えていれば()とか使わずに綺麗にコード書けるね。と書かれていたところです。そこまで気を遣って書かれてるんですね。


### 3.5 文字列

ここだと、「文字列が不変なバイト列」であること「部分文字列演算」が話題になりました。Cのように配列へ直接違う文字をいれて変更することが出来ないとか、（私の知っている範囲だと)関数型の用にs[i:j]という記法を用いて対象範囲の新たな文字列を生成するという
演算のコトです。

### 3.5.3 UTF-8

UTF-8デコーダーが、期待していない入力バイトを処理するとUnicode置換文字`\uFFFD`が生成されることが話題になりました。実際に組んだことがある人から、この文字見たことあるという話が出てきました。

### 3.5.4 文字列とバイトスライス

ここでは、path/pathnameでOS間移植を前提にする場合はつかったほうがいいという話と、bytes.Bufferがファイルの代わりにioを必要とするところで使えることが話題になりました。


ここまで呼んだところで、時間になりました。次回は 3.5.5 文字列と数値の変換 からです。
目的思考ってなんか嫌じゃないですか

# 仕事の目的を考えなさいとよく言われるけれど
なんか嫌な気持ちになる。
目的を考えることは大事だとはわかってはいるけれど・・・。

# なんで嫌なんだろう
・窮屈さを感じる？
・人の目的に従いたくないから？（じゃあ会社員辞めなさいって言われるかもしれないけどお金ないし・・・）
→じゃあ嫌でもお金稼ぐために従えよってことだけど・・・。
・目的思考をしない人は無能みたいな風潮への反抗心？
→別に目的思考しなくても仕事を上手くやれてればいいじゃん（そして私は実際上手くいってないから目的思考の導入について悩んでいる）

# 目的思考をすれば構造を自分の下に置いて上手くやれるじゃん的な考えが嫌なんだろうか
一つ一つの目的を正確に捉えたら、仕事の全体像が見えてなんかコントロールしてる感出る的な風潮が嫌？
→世界ってそんなに単純なのだろうか？
→構造を自分の下に置けているつもりになっているだけじゃないのだろうか？
→でも人は科学的思考ですべてではないけれど物事の法則や傾向を掴み、以前より暮らしやすい世の中を作っているのも事実

# 目的思考=万能の道具みたいな風潮が嫌なのかもしれない
もちろん目的思考を唱える人たちもそれが万能だとは思っていないだろうけど。
目的思考を使えば、使わないよりは上手くいくよっていうことなんだろうけど。

# つまり（仕事ができていない）私はしばらく目的思考を導入してみます
ぐだぐだ考えてしまうけど、今まで避けてきたやり方をやってみるいい機会だし・・・。
MastodonのメールをGmailから送る

オレオレドンを立ててたんですが、概ねはReadme通りでよかったんですが、メールのあたりでちょっとつまづいたので記録に残します。

と言うか、ここ
http://karur4n.hatenablog.com/entry/2015/03/07/234600
を読めば解決なんですが、Gmailを利用するに当たって、Gmailアカウント側の用意も必要ですというお話でした。

それさえできれば、

```
SMTP_LOGIN=ユーザーID@gmail.com
SMTP_PASSWORD=Gmailのパスワードかアプリパスワード。上のサイト参照

SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SMTP_OPENSSL_VERIFY_MODE=none
SMTP_DOMAIN=gmail.com
```

って感じでよろしいかと。

一応この辺もみとくいいかも。
https://github.com/tootsuite/mastodon/blob/7609593e4833e32064313148c616053022274408/config/environments/production.rb#L98
JavaScript アロー関数を説明するよ

なんとなく使っていたアロー関数を言語化してみました。

さっそくアロー関数の説明に入ろうと思うのですが、その前提である**関数リテラル**について説明します。

# 関数リテラルとは
リテラルとはソースコードに直接べた書きした文字や数字のことです。

例

```js
var name = "taro";
var age = 18;
//"taro"　18　がリテラル
```

つまり関数リテラルとはソースコードに直接べた書きされた関数のこと。
JavaScriptでは関数はデータ型のひとつなので、変数に代入したり、関数の引数として渡したり、戻り値として関数を返すことが可能です。

関数リテラルの例

```js
let getTriangle = function(base,height) {
 return base * height / 2;
};
console.log('三角形の面積は' + getTriangle(10,2));//三角形の面積は10
```

関数リテラルは宣言した時点では名前を持たないことから　**匿名関数**　**無名関数**　と呼ばれます。
上記の例では`function(base,height){...};`と名前のない関数を定義した上で変数getTriangleに格納しています。

以上が関数リテラルの説明になります。
ここでなぜ関数リテラルの説明をしたかというと、アロー関数は関数リテラルをシンプルに記述する方法だからです。


# アロー関数とは

アロー関数とは　その名の通り、`　=>`(矢)を使って関数リテラルを記述します。
さっそく例を見ていきましょう。

例

```js
let getTriangle = (base, height) => {
  return base * height / 2;
};
console.log('三角形の面積は' + getTriangle(10,2));//三角形の面積は10

```

上記の例ではfunctionの代わりに=>が使われていますね。
アロー関数は基本的に以下の様に書きます。

```js
(引数,...) => {...関数の本体...}
```

`function` を使った場合を再掲しますので、見比べてみてください。

```js
let getTriangle = function(base,height){
 return base * height / 2;
};
console.log('三角形の面積は' + getTriangle(10,2));//三角形の面積は10
```

# よりシンプルにアロー関数を記述する

アロー関数は条件によってさらに簡素化できます。

## 1,本体が一文である場合

本体が一文である場合、ブロックを表す{...}を省略できます。
また、文の戻り値がそのまま戻り値とみなされるので、return命令も省略できます。

例

```js
let getTriangle = (base, height) => base * height / 2;
console.log(getTriangle(10,2));//10
```

## 2,引数がひとつの場合

引数がひとつの場合、引数をくくるカッコも省略できます。

例

```js
let getCircle = radius => radius * radius * Math.PI;
console.log(getCircle(10))//314.1592653589793;
```

## 3,引数がない場合

引数がない場合はカッコを省略せずに記述します。

```js
let show = () => console.log('Hello, world!'); 
show(); //Hello, world!
```

# thisの固定

アロー関数では、thisはアロー関数が宣言された場所によって決まります。
つまり定義したコンテキストでthisを固定します。
これによって`var self = this;` を書かなくてよくなったりします。

以上で簡単にはなりますがアロー関数の説明を終わります。
Alexa Skill 開発メモ　開発用Amazonアカウント用意と、Alexa.appの入手方法



# Amazonアカウント用意と、Alexa.appの入手方法

以下は日本国内からAlexa Skillを作ろうとした時に必要となったアカウントのメモです。

### <font color=orange>Amazon.comのアカウント</font>
https://www.amazon.com/ （アメリカのアマゾンサイト）で作りました。
自分が作ったときは、クレカも住所は日本のもので大丈夫でした。
もちろん、買い物はしません。

### <font color=orange>AWSのアカウント</font>
https://aws.amazon.com/（AWSのサイト）で作りました。
日本とアメリカで共通のサイトです。
私はAmazon.comと同じメールアドレスで作りました。
なお、主に使うのは「バージニア北部」となります。
クレジットカードの登録義務があってドキドキですが、最初は無料枠があるので、
説明をよく読みながら、無料枠の範囲で使っています。
- Lambda
- EC2
- EIPも1個だけなら使える


### <font color=orange>developer consoleのアカウント</font>
https://developer.amazon.com/
Amazon.comのアカウントでサインインできるはず。

### <font color=orange>Alexa.appを入手</font>

<img src=https://qiita-image-store.s3.amazonaws.com/0/173392/61b71c4f-ad85-10ee-02a5-cceaa1f22b42.png width=300>

iOS、Android対応のアプリです。
2017年4月16日現在、日本のAppStore/GooglePlayではこのアプリを配信してないので、
USかUK、あるいはドイツのストアで入手する必要があります。
IPhoneの場合のUSストアからの入手方法を参考までに書いておきます。
- [ここら辺を参考に](http://enjoypclife.net/2014/06/23/north-america-uc-itunes-account-apple-id-japan/)北米のAppStoreのアカウントを作る
- [ここら辺を参考に](https://ischool.co.jp/2016-05-20/)USAppストアに接続
- Alexa Appをダウンロード　https://itunes.apple.com/us/app/amazon-alexa/id944011620?mt=8

なおAndroidは海外アカウント作成の難易度が高いので、お勧めしません。
アプリダウンロードサイトから野良アプリをインストールしても動くかどうかは不明です。


### <font color=orange>Amazonアプリの削除</font>

同じiPhoneにamazon.appが入っていたら、削除する。
![amazonapp.png](https://qiita-image-store.s3.amazonaws.com/0/173392/5c2c1e59-b4ba-9850-e99e-6357432c363b.png)
どうやらアプリ間で連携しており、amazon.appに入っているログイン情報を参照してしまうようです。
ということは、日本のamazonアカウントをログオフして、Amazon.comのアカウントでログインしなおすだけでも大丈夫かもしれません。
いずれにせよ、<font color=orange>Amazonでの買い物はWebブラウザでする羽目になります。（笑）</font>
5分で終わらせるNFSファイル共有

# 5分で終わらせるNFSファイル共有
環境
 ・Centos7

※serverのIPを`192.168.0.1`、clientのIPを`192.168.0.2`とします。
## server側
yumでnfs-utilsをインストール

```bash
yum -y install nfs-utils
```
共有するディレクトリを作成しておきます。

```bash
mkdir /mnt/public
```
`/etc/exports`を編集

```text:/etc/exports
/mnt/public 192.168.0.2(rw,async,no_root_squash) #rw権限、rootでの接続を許可する場合の設定
```
ファイアウォールの設定も忘れてはいけません。

```bash
firewall-cmd --permanent --zone=public --add-service=nfs
firewall-cmd --reload
```

サービスを起動＆自動起動の設定。

```bash
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs-server
systemctl enable nfs-server
```
## client側
yumでnfs-utilsをインストール

```bash
yum -y install nfs-utils
```
マウントするディレクトリを作成しておきます。

```bash
mkdir /mnt/hoge
```
`/etc/fstab`を編集して、起動時マウントの設定をします。

```text:/etc/fstab
192.168.0.1:/mnt/public /mnt/hoge nfs defaults 0 0
```
マウントする。

```
mount -v 192.168.0.1:/mnt/public /mnt/hoge
```
以上です。お疲れ様でした。

## とはいえ
確かに5分で設定を終わらせることは可能ですが、長期的利用するのであれば一つずつ設定を確認して行うほうが良いのには間違いありません。
この記事は設定をある程度理解した上でのチートシートとしての利用をおすすめします。

## エラー
`mount: wrong fs type, bad option, bad superblock on`
nfs-utilsがインストールされていないかも。

`mount: can't find /mnt/hoge in /etc/fstab`
fstab書きましょう。

`mount.nfs: mount: No route to host`
firewallを確認してみてください。
複数のgitブランチのマージを自動化するgitmumerge

#概要
[複数のgitブランチのマージする際のベストプラクティス](http://qiita.com/cocoa_maemae/items/bbe6cde20cc1afde0c04)の投稿で紹介した[他人の修正を消さないためのマージ方法](http://qiita.com/cocoa_maemae/items/bbe6cde20cc1afde0c04#他人の修正を消さないためのマージ方法)を自動化するgitmumergeというシェルスクリプトを紹介する。

#gitmumerge
https://github.com/cocoa-maemae/gitmumerge
cuiのgitクライアントを単純にシェルスクリプトでラップしたものである。普段手動で複数回git mergeする操作を、一回のコマンドでまとめて自動的にマージすることができる。

### 動作環境
今のところbashのみに対応している。bashが動けばOSは何でも構わない。
cuiのgitクライアントは必須ですのであらかじめインストールしておく。
```
(debian系)
sudo apt-get install git
(redhat系)
sudo yum install git
```

### gitmumergeのインストール。
```
git clone https://github.com/cocoa-maemae/gitmumerge ~/.gitmumerge 
echo 'export PATH="$HOME/.gitmumerge/bin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile

//バージョン確認
gitmumerge -v
```

### 使い方
まずはマージを実行したいgitリポジトリをcloneしてclone先ディレクトリに移動する。
```
(例)
git clone <対象リポジトリへのパス>
cd <clone先ディレクトリ>
```

clone先ディレクトリに移動したら先ほどインストールしたgitmumergeの出番。
-d(--destination-branch)の後に開発に使ったブランチをマージする最終ブランチ名を、-c(--candidate-branches)の後に開発に使ったブランチ名を指定する。-cの後はスペース区切りで複数ブランチの指定が可能である。
例えば、[Gitのブランチのマージ方法に対する考察](http://qiita.com/cocoa_maemae/items/bbe6cde20cc1afde0c04#他人の修正を消さないためのマージ方法)で挙げた例、masterブランチに対してdev1,dev2,dev3ブランチをマージしたいときは下記のように指定する。

```
(例)
gitmumerge -d master -c dev1 dev2 dev3
```

この例を実行するとmaster->dev1, dev1->master, master->dev2, dev2->master, master->dev3, dev3->masterという順番にマージしてくれる。マージする前に必ず[Y/n]を聞くようにしています。コンフリクトが発生した場合はその時点で強制終了する。
![for_quiita.gif](https://qiita-image-store.s3.amazonaws.com/0/55214/163c2f5d-61c7-a21d-e276-0a76188dbec4.gif)

終了メッセージの"Merging branches has done"が出てくれば完了です。あくまでgit client側でマージしているだけなので、リモートリポジトリに反映させるためには、この後-d(--destination-branch)で指定したブランチ(上述の例ではmaster)をpushする必要がある。そこは今のところ手動である。

(例)ローカルリポジトリのmasterにマージしてからpushまでの流れ
![gitmerge1.png](https://qiita-image-store.s3.amazonaws.com/0/55214/6baadf6b-34ef-378b-b173-cd834d2f9b46.png)

また、例ではmasterに対して開発用のdev1,dev2,dev3ブランチをマージしたが、実際の運用でmasterに直接開発ブランチをマージしている人はあまりいないと思う。マージのミスでmasterブランチを破壊してしまう可能性があるためである。masterの前にdevelopmentなどの別のブランチに一度マージする方が安全である。

gitmumergeはcuiのgitクライアントのラッパーでローカルリポジトリのマージを自動化している。リモートリポジトリはGitHub,GitLab,BitBucket,GitBucket, etc... git系のホスティングサービスであれば何でも対応できる。
docker execするときに「No such file or directory」と言われる

# docker execするときに「No such file or directory」と言われる
いつも同じとこで詰まっていい加減覚えたいこと。
例えば、dockerで立てたmysqlコンテナのバックアップを実行したい時、

```bash
docker exec mysql bash "mysqldump > /var/lib/mysql/mysqldump_database.dump"
```
を実行すると、

```
bash: mysqldump > /var/lib/mysql/mysqldump_database.dump: No such file or directory
```
と怒られます。
## 解決策
単純に、

```bash
docker exec mysql bash -c "mysqldump > /var/lib/mysql/mysqldump_database.dump"
```
と、`-c`オプションをつけることでうまく実行できます。

## 理由
`-c`オプションは引数をstring型と明示して実行させるもので、
どうやら、`-c`オプションがないと""で囲まれていてもそれがコマンドだとうまく認識されないようです。
複数のgitブランチをマージする際のベストプラクティス

# 概要
複数人の開発者がgitを利用して開発する時、複数の開発ブランチを作成し、ブランチを平行運用するのが一般的である。最終的に複数のブランチは一つのブランチへとマージされる必要がある。ここでは、複数の開発ブランチを最終的に一つのブランチにマージするときのマージ方法について考えてみる。

#基本的なマージ方法とその課題
例えばmasterブランチから派生させた複数の開発ブランチdev1,dev2,dev3をそれぞれ別の開発者が修正し、最終的にmasterブランチにマージする際、図1の手順でマージしたことはないだろうか？

図1
![git_branch_merge1.png](https://qiita-image-store.s3.amazonaws.com/0/55214/5344bacc-fbd3-07cc-9340-51ab0f0bfb00.png)
単純で分かりやすいマージ方法のため、git初心者の方は一度はこの方法でマージしたことがあると思う。しかし、このマージ方法には欠点がある。それは、他人の修正を上書きして消してしまうことがある。
図1の例だと、dev1が最初にmasterにマージされているので、dev2が先にマージされたdev1の修正を上書きして消してしまう、もしくはdev3が先にマージされたdev1やdev2の修正を上書きして消してしまうことがある。

#他人の修正を消さないためのマージ方法
他人の修正を消さないようにマージするためには、図2のようにマージしたいブランチの修正を最初にマージするような方法を取る。

図2
![git_branch_merge2.png](https://qiita-image-store.s3.amazonaws.com/0/55214/2c738e72-6556-1877-9dd1-3dd962ddb475.png)
図2の例だと、dev2をmasterにマージする前にmasterにマージされたdev1の修正がdev2にマージされる。dev3をmasterにマージする前にdev1とdev2の修正がdev3にマージされる。dev1,dev2,dev3ブランチの修正は確実に消えることなくmasterブランチにマージされる。

#残る課題
図2のようなマージ手順であれば、複数の開発者が複数のgitブランチを平行開発していても、他人の修正を上書きして消してしまうことはない。しかしながらマージする回数が増えてしまうため、その分マージにかかるコストが増える。
そこで、図2のマージ手順を自動化したgitmergeというシェルスクリプトを書いてみた。インストール方法や利用方法は[複数のgitブランチのマージを自動化するgitmerge](http://qiita.com/cocoa_maemae/items/5908e3b3699c9cea4e8b)で紹介している。
PowerShell で SharePoint Online にアクセスしてみたメモ

[ブログからの転載](http://1bed.allright.life/?p=2451)

しぇあぽいんとさんと仲良くなるために、まずは Windows では一番慣れている PowerShell を使って SharePoint Online へアクセスしてみたメモ。

## 環境

* Windows 10 Pro
* PowerShell 5.1

## 事前準備

SharePoint Online 用の SDK をインストールします。

* SharePoint Online Client Components SDK のダウンロードとインストール  
  [https://www.microsoft.com/en-us/download/details.aspx?id=42038)](https://www.microsoft.com/en-us/download/details.aspx?id=42038)  
  ※64 bit と 32 bit を間違わないように

## サンプルコード

ユーザーが miyamiya@example.com、SharePoint Online の URL が https://&lt;tenant>.sharepoint.com/sites/example/SitePages/Home.aspx と仮定してサンプルコード書く。

```ps1
# SDK の読み込み
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null

# アクセスする URL
$url  = 'https://<tenant>.sharepoint.com/sites/example/SitePages/Home.aspx'

# ユーザー名
$user = 'miyamiya@example.com'

# パスワードは都度入力
$secure = Read-Host -Prompt "Enter the password for ${user}(Office365)" -AsSecureString

# 認証情報生成
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($user, $secure)

# WebRequest インスタンス生成
$request = [System.Net.WebRequest]::Create($url)

# 各種設定
$request.Credentials = $credentials
$request.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f")
$request.Accept = "application/json;odata=verbose"
$request.Method = [Microsoft.PowerShell.Commands.WebRequestMethod]::Get

# レスポンスの取得
$response = $request.GetResponse()

# ストリームデータ取得
$readStream = New-Object System.IO.StreamReader ($response.GetResponseStream())

# 取得したデータを表示
$readStream.ReadToEnd()
```

## 考察

REST API を叩いて JSON を返すサンプルを参考にしましたが、別に REST API を叩きたいわけではなかったので、とりあえずアクセスした画面を HTML で保存するだけを行ってみました。

恐らくユーザー名とパスワードを使うのはあまり良くないのだろうけど、一般ユーザーではこの方法しかないんじゃないかな？と思っています。

## 参考

* [Using the SharePoint REST Service with Windows PowerShell](https://www.itunity.com/article/sharepoint-rest-service-windows-powershell-1381)
Trinityの結果からcompleteだけを抜き出す

#わざわざ書くほどでも無いけど
備忘録代わりにおいておきます
Trinityの結果ファイルからTransdocodeで予測されたcompleteな配列だけを取り出すスクリプトです

```py:compgene_finder.sh
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from Bio import SeqIO
import csv


fasta_in = sys.argv[1]                            #１番目の引数にfastaファイルを指定する。
for record in SeqIO.parse(fasta_in, 'fasta'): #fastaファイルを開くSeqIOを使ってパースする(1項目づつ読み込む）
        id_part = record.id                       #fastaのID部分を読み込む
        desc_part = record.description                       #fastaのID部分を読み込む
        seq = record.seq                          #fastanの配列部分を読み込む
        if 'type:complete' in desc_part:
                fasta_seq = '>' +  desc_part + '\n' + seq      #fasta形式に整えて
                print(fasta_seq)                  #標準出力にfastaを出力
```
KotlinのSpekでデータドリブンテスト

#Kotlinのテストフレームワーク
色々あるけど、今回はJetBrainsが開発しているSpekを試してみた。
本家サイト
　http://spekframework.org/
###他の記事
http://qiita.com/yo1000/items/9f7148505895fd1d6760
http://qiita.com/tenten0213/items/95978e20e74a06e45a98

#特徴
- テストの意図を明確にするように文章をテストコードに埋め込める
- デフォルトではJUnit5ベース
- Assersionライブラリは含まれないので色々なライブラリを選択可能（JUnit5と一緒ね）

#今回やること
- いつのまにか追加されていたdata-driven-extensionを試す
- assertionライブラリとしては「kluent」を利用
https://markusamshove.github.io/Kluent/

#build.gradle
```groovy
group 'sample-kotlin'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.1.1'

    repositories {
        jcenter()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M3'
    }
}
repositories {
    jcenter()
    maven {
        url "http://dl.bintray.com/kotlin/ktor"
    }
    maven { url "http://dl.bintray.com/jetbrains/spek" }

}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'org.junit.platform.gradle.plugin'

junitPlatform {
    filters {
        engines {
            include 'spek'
        }
    }
    platformVersion '1.0.0-M3'
}

sourceCompatibility = 1.8


dependencies {

    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" //Kotlin

    testCompile "org.junit.jupiter:junit-jupiter-api:5.0.0-M3"
    testCompile 'org.jetbrains.spek:spek-api:1.1.0'
    testCompile 'org.amshove.kluent:kluent:1.19'//アサーションライブラリ
    testCompile 'org.jetbrains.spek:spek-junit-platform-engine:1.1.0'
    testCompile 'org.jetbrains.spek:spek-data-driven-extension:1.1.0'//spekデータドリブンテスト用

  
}

```

#テスト対象Function
```kotlin:sample.kt
package sample
fun add(x: Int, y: Int): Int = x + y
```
#テストコード
```kotlin:sampletest.kt
package sample
//インポートは省略
class DataDrivenSpekTest : Spek({
    describe("関数addは") {
        on("%sと%sを加算した場合",
                data(10,20, expected = 30),
                data(-10,10, expected = 0)

        ) { a, b, expected ->
            it("$expected を返却する") {
                add(a, b) shouldEqualTo expected
            }
        }

    }
})
```
#結果
<img width="464" alt="スクリーンショット 2017-04-16 15.57.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/30836/5cf22074-ab6c-c230-f3b0-710b7853bebc.png">
※Intellij Idea  Eclipseでは未検証。IdeaではSpekのプラグインがある。
https://plugins.jetbrains.com/plugin/8564-spek

#ちと改良
今の所、spek-data-driven-extensionは入力値、期待結果合わせて４列までのデータにしか対応していない。問題ない気もするが、もし、テストケースの説明なんかを入れたりして、５列以上のデータを扱いたいのならKotlinのdataclassと1.1からできるようになった分解宣言で対応すれば良い

```kotlin:sampletest2.kt
data class InputData(val x: Int, val y: Int) {
    override fun toString() = "入力値[$x , $y]"
}

class DataDrivenSpekTest2 : Spek({
    describe("関数addは") {
        on("%s:%sを加算した場合",
                data("基本条件",InputData(10,20), expected = 30),
                data("負の数の計算",InputData(-10,10), expected = 0)

        ) { _,(a, b), expected ->
            it("$expected を返却する") {
                add(a, b) shouldEqualTo expected
            }
        }

    }

})
```
<img width="464" alt="スクリーンショット 2017-04-16 16.12.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/30836/889b4bce-fa65-f9db-07de-609baedc9349.png">
Rubyのrstripで消えない空白の対処法

```ruby
text = ", works in St Petersburg and uses Tekhnologishesky Institut station every day. \n" + "    "
text.rstrip
# => ", works in St Petersburg and uses Tekhnologishesky Institut station every day. "
```
最後の空白が消えない。
この空白の文字コードを調べてみる。

```ruby
text.rstrip.last.bytes{ |b| print b.to_s(16) + " " }
# c2 a0 => " "
```

`c2 a0`らしい。`to_s(16)`で16進数にしているため、16進数を意味する`0xC2 0xA0`でググってみる。

ヒット
[UTF-8 encoding table and Unicode characters](http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=0x)

<img width="741" alt="Screen Shot 2017-04-16 at 16.01.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/34733/104e9187-7d19-6097-98a4-b31ee9444c87.png">

`ruby NO-BREAK SPACE`でググる。

ヒット
[How do I remove a non-breaking space in Ruby](http://stackoverflow.com/questions/4859438/how-do-i-remove-a-non-breaking-space-in-ruby)

```ruby
irb(main):001:0> d = "foo\u00A0\bar"
# => "foo \bar"
irb(main):002:0> d.gsub("\u00A0", "")
# => "foo\bar"
```

とのこと。

```ruby
text.rstrip.gsub("\u00A0", "")
# => ", works in St Petersburg and uses Tekhnologishesky Institut station every day."
```

完了。

追記。
[ソースコード中に0xC2A0(UTF-8のNO-BREAK SPACE)が混ざり実行できなくて困った話](http://gosyujin.github.io/2013/08/26/utf8-space-c2a0/)
> 「半角スペースらしき空白」は NO-BREAK SPACE という文字で htmlで使う`&nbsp;`と同じもの。

> 表示する分には(レイアウトなどに気を付ける必要はあるものの)特に問題はないが、ソースコードの空白としては不適切。

> 本文の C2A0 を半角スペース 20 に置換してやる事でソースコードはソースコードとしてよみがえる。

`&nbsp;`だったのか。一旦`gsub`で置換した後に`rstrip`したほうが良さそう。

```ruby
text.gsub("\u00A0", "").rstrip
```
Django REST Frameworkのjsonが文字化けする件の対処法


## ある日突然jsonが文字化けしました:joy:

原因: Chromeのアップデート :joy:
以下の通りです....
2017/04/11
http://var.blog.jp/archives/70125676.html

## というわけで、REST Frameworkの設定を直して行きます:muscle:

### 現状クッソ文字化けしている

![スクリーンショット 2017-04-16 午後3.12.29.png](https://qiita-image-store.s3.amazonaws.com/0/33553/bb688769-a902-fe25-6712-485dcbccebb3.png)


### :bulb:対処方法

`UTF-8`を指定した`UTF8CharsetJSONRenderer`クラスの作成
`REST Framework` のドキュメントにはデフォルトでUTF-8と書いてあるが.........笑

```py3:renderers.py
from rest_framework.renderers import JSONRenderer

class UTF8CharsetJSONRenderer(JSONRenderer):
    charset = 'utf-8'
```

```
'DEFAULT_RENDERER_CLASSES': (
    # ここをコメントアウト！
    #'rest_framework.renderers.JSONRenderer',
    # 作ったやつに変更する。(僕はdiaryというディレクトリの中にあるので、自分のパスに変更お願いします。)
    'diary.renderers.UTF8CharsetJSONRenderer',
)
```

### :cat:キタ！！！！！！

![スクリーンショット 2017-04-19 3.04.17.png](https://qiita-image-store.s3.amazonaws.com/0/33553/da3eaa23-26cb-9096-4be5-de146e070ee0.png)
ブレンド可能なアニメーション再生機能をブループリントで作ってみた

やっとやり方を見つけることが出来たので、書きます。

# やりたいこと

UE4 を使っていて、自分が欲しいと思ったアニメーション再生機能はこれです。

* ブループリントや C++ で【Play】と命令すれば、アニメーションが再生される。
* ループする/しないや再生スピード、ブレンド時間などは再生する時に決められる。
* 再生対象となるのは、「アニメーションシーケンス」と「ブレンドスペース」
* 同じアニメーションを再生し直すことが出来る。

今回は、この要望を満たすアニメーション再生機能を作りました。

# アニムグラフを組む
まず、アニムグラフを以下のように組みます。
![BlendAnimation.png](https://qiita-image-store.s3.amazonaws.com/0/43814/7db8cb1e-f1b1-6b34-c47f-d00d539c85f3.png)

見ての通り、アニメーションシーケンスとブレンドスペースの再生情報をダブルバッファリングして、その情報を各アセットプレイヤーや 「Blend Poses By int」ノードに渡しています。

以下、補足です。

## アニムグラフノードの入力データピン表示について
ご存知の方も多いと思いますが、アニムグラフノードのパラメータは入力データピンを表示させて外からパラメータを入力することが可能になっているものがあります。

例えば、「Animation Sequence Player」ノードでは、以下のように結構な数のパラメータがピン表示できるようになっています。
![AnimSequencePlayer.png](https://qiita-image-store.s3.amazonaws.com/0/43814/ecf919ca-ea8f-637b-f5cd-c48a509d4b57.png)

このチェックを入れると、ノードに入力データピンが追加され、変数からデータを入力することが可能になります。

## 「Blend Poses By int」ノードの注意点
「Blend Poses By int」ノードはデフォルト挙動が **「Active Child Index」を変えても前の再生情報がリセットされない** ようになっています。

例えば、「Active Child Index」を「0 -> 1 -> 0」と切り替えて再生するとします。もし、一回目の「0」でアニメーションを最後まで再生し終わってた場合、二回目の「0」ではその再生し終わった時間から再生が始まります。

なので、前に再生していたアニメーションの長さ次第で、二回目の「0」では **アニメーションが再生されない、もしくはアニメーションが途中から再生される** といった状態になってしまいます。

これを回避するためには、「Blend Poses By int」ノードの「 **Reset Chiuld on Activation** 」にチェックを入れる必要があります。
![ResetChildOnActivation.png](https://qiita-image-store.s3.amazonaws.com/0/43814/042b6b72-75fa-4c4a-9b81-c680dd5c586a.png)

ここにチェックを入れておけば、「Active Child Index」が変わるたびに再生情報がリセットされるようになります。

# 再生命令を発行する関数を組む
次に、アニメーション BP に再生命令を発行する関数を用意します。

【Play Anim Sequence】
![PlayAnimSequence.png](https://qiita-image-store.s3.amazonaws.com/0/43814/6d011562-d846-8dba-631c-33ff3d416d2f.png)

【Play Blend Space】
![PlayBlendSpace.png](https://qiita-image-store.s3.amazonaws.com/0/43814/fda30fb3-039a-decb-cdeb-a7a8672f54d9.png)


見ての通り、データの書き込み先となるバッファのインデックスを切り替えてデータを書き込み、「Active Child Index」の値を更新するだけの関数となっています。（「IncrementIndex」ノードは自前で用意したノードで、加算した配列のインデックスを 0 ～ Length - 1 の間でループさせるためのノードです。）

「Active Child Index」の値は毎回切り替えているので、同じアニメーションを再生し直すことも可能です。

また、ブレンドスペースの場合は、後でブレンドスペースの軸の値を変更できるように別途関数を用意します。

【Set Blend Space Axis Value】
![SetBlendSpaceAxisValue.png](https://qiita-image-store.s3.amazonaws.com/0/43814/d834f172-faa3-642d-2faf-cb2f843ce768.png)

あとはアニメーションを変更したい時にこれらの関数を呼べば、アニメーションが変更できるようになります。

# 最後に
これで自分の望むアニメーション再生関数を用意することが出来ました。

ただし、これは全てアニメーション BP に書かれているので、アニメーション BP が増えたら、それをそのままコピペするか、アニメーション BP を複製する必要があります。

流石にそれは面倒なので、次の記事では処理を C++ で組んで、アニメーション BP 依存にならないようにしてみます。
awsサポート、ビジネスサポートとリザーブドインスタンスに関する落とし穴

## 2017年5月18日記事編集

別件でawsの方から連絡をいただき、その際に本件を口頭確認したところ「さらに落とし穴」としていたところは誤解であることが判明（以前サポートからいただいた文面的にはそうとしか読めない気もするんだけど、、）。


## 本記事の対象者

ビジネスサポートをケチってるような私のような人。

## すぐに解約すればお安いんでしょ！？という気軽な気持ちでビジネスサポートにすると痛い目に

「ビジネスサポートは必要なときだけ契約できる」的な記事を見て安心しきっちゃってました、、、

## リザーブドインスタンスにもサポート料金が！

かかってくるんだろうけど日割りでしょ？まぁ最悪1ヶ月分の10%かな！？なんて高をくくってたら、、、ビジネスサポートは初回請求月にリザーブドインスタンスの残額x10%の料金がかかります！！3年のリザーブドインスタンスを買って2ヶ月目にサポートをお願いした日にゃ結構なお値段がかかります！！

この事実を知らないと、リザーブドインスタンスを厚めに使って~~ケチ臭く~~頑張っているところほど「逆に」涙目状態になるので要注意。

## ~~さらに落とし穴~~

~~先程「初回請求月」と書きましたが、**ビジネスサポートに入る都度**同ルールが適用されるので、ビジネスサポートは一度入ると基本継続するべきで、入ってはやめ、入ってはやめするものではありません！（すべてオンデマンドで賄っているなら話は別かもですが）。~~

一度払ったリザーブドインスタンスへのサポート料金は再発生しないとのことです。

## 結論

まずは、「ビジネスサポートにすると請求がどの程度になりそうでしょうか？？」とサポートしてもらうのが安全だと思います（この質問はベーシックタイプで可能だと信じてる、、）。

## 蛇足

個人的に小規模サイトがビジネスサポートを使わないで頑張っている場合の問題としてぱっと思いつくのは

* ELB（CLB, ALB）の暖機
* amazonレベルのミスでこちらではにっちもさっちもいかない状態になっている

なシチュエーションだけど、前者は手動暖機で行う方向で（従量部分のコストは仕方ない！）。後者は、、、どうするんだろうねぇ、、、（EC2の動作がどうしても意図通りにならなくamazonに確認してみたら、「うちのミスでした。すみませんでした！」ってオチを経験したことがあるので、有り得る話なんだよねぇ、、、）。

個人的な現状としては、もう払うもんは払っちゃったので、後者のリスクを考えて月に10%上乗せの料金でビジネスサポート継続もありかなぁ、なんて、、、

ちなみにこの記事を書くために払った授業料は約10万円。自身の浅学さが忌々しいぜ！！！！！

同じ過ちを犯す人が一人でも減りますようにという願いを込めて♪

[AWS サポートのプランの料金](https://aws.amazon.com/jp/premiumsupport/pricing/)
go言語を始めてみた　その２　codeIQの問題に挑戦

codeIQの[3233](https://codeiq.jp/challenge/3233)に挑戦しました

ダイアルを回す回数と総メモリ数から回し方が何パターンあるのか求める問題です。

タイトル通りgoで回答を書いて提出。
結果は処理時間オーバーでした。。
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/153576/a8884033-3654-1d87-c334-acaaa4da6fd8.jpeg)

再帰を使っているので回す回数が大きくなってくると厳しいですね


やってて少しつまったところとしては、
標準入力のsplitですね

```
reader := bufio.NewReader(os.Stdin)
input, _ := reader.ReadString('\n')
inputList := strings.Split(input, " ")
times, _ := strconv.Atoi(inputList[0])
length, _ := strconv.Atoi(inputList[1])
```

こう書いていたら何故か２番目の数字が取得できず。。
どうやらinput変数の末尾に改行文字が入っているのが原因のようです
splitの前に

```
input = strings.TrimRight(input, "\n")
```

を入れたら取得できるようになりました。

あとは計算量を減らせばいけるはずなのですが、どう減らせばいいのか。。
1台のPCで複数のGithubアカウントを使い分ける


仕事用、自分用というように複数アカウントを持っていて1台のPCで使い分けたい場合に見るメモです。

# 背景
もともと1台のPCでアカウントAはSSH、アカウントBをHTTPSで使用していました。
が、何か変な操作したのかアカウントBでpushする時にアカウントAで認証しにいくようになってしまい、アカウントBがHTTPSで使えなくなってしまいました。
解決方法がわからず、両方SSHにしてしまえと思ったのが事の始まりです。

# 前提
- アカウントAはすでに設定も終えて使えている状態である
- Macでの手順である 

# 手順
1. アカウントBのSSHキーを発行
2. アカウントBのSSHキーをGithubに登録
3. ~/.ssh/configを作成
4. アカウントBのリポジトリの設定

## 1.アカウントBのSSHキーを発行

まずは既存のSSHキーファイル名を確認。

```
$ cd ~/.ssh
$ ls
id_rsa id_rsa.pub
```

ファイル名を被らないように、アカウントBのSSHキーを作成。

```
# 例:ssh-keygen -t rsa -C username@email.com -f id_rsa.accountB
$ ssh-keygen -t rsa -C [アカウントBのemail address] -f [file name]
```

## 2.アカウントBのSSHキーをGithubに登録

Githubのヘルプ参照
https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/

## 3. `~/.ssh/config` を作成

最低限以下を設定すれば良さそう。

```config
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa
    Port 22
Host github.com.sub
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa.accountB
    Port 22
```

|項目|設定値|
|---|---|
|Host|アカウントA、アカウントBを識別できる名前|
|HostName|github.comを設定|
|User|gitを設定|
|IdentitiyFile|それぞれのアカウントのキーファイルを設定|
|Port|22を設定|

## 4. SSHキーの登録
アカウントBのSSHキーを登録する。

```
$ ssh-add /Users/your_home/.ssh/id_rsa.accountB
Enter passphrase for /Users/your_home/.ssh/id_rsa.accountB: # githubのログインパス
Identity added: /Users/your_home/.ssh/id_rsa.accountB (/Users/your_hoe/.ssh/id_rsa.accountB)
```



それぞれのHost名で接続確認しよう。

```
$ ssh -T github.com
Hi アカウントA! You've successfully authenticated, but GitHub does not provide shell access.

$ ssh -T github.com.sub
Hi アカウントB! You've successfully authenticated, but GitHub does not provide shell access.
```

※ Hi ~ のところが両方同じアカウント名の場合どこかがおかしいです。

## 5.アカウントBのリポジトリの設定
リポジトリ毎に設定が必要なので少し手間、でもしょうがない。
アカウントBのリポジトリへ移動し、名前とメールアドレスを設定しよう。

```
$ cd アカウントBのリポジトリ
$ git config user.name "アカウントBのユーザーネーム"
$ git config user.email "アカウントBのメールアドレス"
```

リモートのURLを設定する。

```
# 例:git remote add origin git@github.com.sub:accountB/repository.git
$ git remote add origin git@[アカウントBのHost]:[アカウントB]/[repository name].git

# 例:git remote set-url origin git@github.com.sub:accountB/repository.git
$ git remote set-url origin git@[アカウントBのHost]:[アカウントB]/[repository name].git
```

いじょ。
[ユースケース駆動開発実践ガイド]の学習メモ（第２章 ドメインモデリング）

本記事は、[ユースケース駆動開発実践ガイド](http://amzn.to/2pkNY90) の学習メモです。

第１章は、ICONIXプロセス全体の説明のため、第２章から

#第２章 ドメインモデリング

##ドメインモデリングとは
ドメインモデルを作成すること

##ドメインモデルとは
本質的にはプロジェクトの用語集。
ただし、単語間の関係をグラフィカルに表現する。
簡易的なクラス図（属性や操作がない）のようなもの。
汎化・集約関係を使用する。

##ドメインモデル作成のガイドライン
- 2時間ほどで作成させる。
80%ほどで良い、残りはおいおい修正していく

- モデルを一貫性のある名前とする
「ショッピングカート」「買い物かご」「買い物用手押し車」等の曖昧な名前を使わない

- ユースケースを書く前にドメインモデルを作る
ユースケースはドメインモデルの言葉で記載するから

- 画面・GUIの部品クラスを配置しない
ドメインモデルは純粋に問題領域に焦点を当てるべき
PHPで読取専用プロパティを手軽に実現する


## はじめに
ドメイン駆動開発ではimmutableなクラスを使う機会が少なくありませんが（ex.ValueObject）、実装が単純＆面倒なあまりせっかちなプログラマの勤労意欲を阻害しがちです。「プログラマは怠惰であれ」の精神に基づき、PHPでインスタントにReadOnlyなクラスを実装する方法を考えてみましょう。


## まずは教科書的に書いてみる
メンバをprivateにした上でgetterを作るパターン。
コンストラクタ以外のタイミングではメンバのセットを受け付けません。
作りが明快な一方、プロパティの数だけgetterを作る手間が発生します。
※`@property-read`はIDE補完用の記述です。

```php:Human.php
/**
 * @property-read string $name
 * @property-read int    $age
 */
class Human {
    
    /** @var string */
    private $name;
    
    /** @var int */
    private $age;
    
    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }
    
    public function getName() {
        return $this->name;
    }
    
    public function getAge() {
        return $this->age;
    }
    
}

```

```php:Use.php
	
	$human = new Human('ほげ野ぴよ太', '48');
	
	$name = $human->getName();   //OK
	$human->name = 'ふが田ぴよ彦'; //NG
	
```

## 面倒なのでgetterを共通化する
マジックメソッドを利用したTraitを使い回せば、getterを個別実装せずともReadOnlyなプロパティを手軽に実装できます。（ポイントはアクセス不能なメソッドのハンドリングです）

```php:ReadOnlyTrait.php
trait ReadOnlyTrait {
    
    //__getはアクセス不能なプロパティを参照した際に呼び出されるマジックメソッド
    public function __get($name) {
        return $this->$name;
    }
    
}

```

```php:Human.php
/**
 * @property-read string $name
 * @property-read int    $age
 */
class Human {
    
    use ReadOnlyTrait;
    
    /** @var string */
    private $name;
    
    /** @var int */
    private $age;
    
    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }
    
}

```

```php:Use.php
	
	$human = new Human('ほげ野ぴよ太', '48');
	
	$name = $human->name;   //OK
	$human->name = 'ふが田ぴよ彦'; //NG
	
```


## 注意点
privateだろうがprotectedだろうが問答無用で外からプロパティを読めてしまうので、隠蔽すべき項目は個別の取り回しが必要です（当たり前ですが）。使用前に必ず適切性を一考しましょう。

## 2017/4/23 追記
[@tadsan](http://qiita.com/tadsan)の指摘事項を反映しました。[private/protectedなプロパティを外部から読み込み可能にする](http://qiita.com/tadsan/items/2049243e47495764b191)という投稿で、同コンセプトのコードをより精緻に解説してくれています。みんなも参考にしよう！（すぐに使えるライブラリ付き！）
Python: キーと値のリストから辞書を作成する

```py
keys = ['a', 'b', 'c']
values = [10, 20, 30]

dic = dict(zip(keys, values)) # => {'a': 10, 'b': 20, 'c': 30}
```

`dict(iter)` (`iter` は iterable オブジェクト) は，`iter` の各要素について `iter[i][0]` をキー，`iter[i][1]` を値とした辞書を返す (以下のコードと等価)．`len(iter[i]) != 2` なら ValueError になる．

```py
dic = {}
for k, v in iter:
    dic[k] = v
```