OmniAICreator/Qiita-1.07M huggingface dataset:
プロダクトマネージャーの資料まとめ

# プロダクトマネージャーの資料まとめ
プロダクトマネージャーの書籍やWeb記事をまとめました。
随時更新予定です。

## 書籍
### [inspired 顧客の心を捉える製品の創り方](https://www.amazon.co.jp/dp/B00TCM8TB4)

ヒューレットパッカード、NetScape、AOL、eBayなどでプロダクトマネージャーを務めたマーティ・ゲーガンによるプロダクトマネージャー論。

プロダクトマネジメントとプロジェクトマネジメントの違いを筆頭に、プロダクトマーケティング、エンジニアリング、デザインなどの他の職種との連携方法についてもまとめられてる。

エンジニアリング、デザイン手法については詳しくは説明はないものの、スクラムやインタラクションデザインなどキーワードが文中に散りばめられているため、本書を起点に知識を広げることも可能。

プロダクトマネージャー業務の全体像を広く浅く理解するための入門書。

>ダメな製品が無駄に世に送り出されるいちばんの原因は、ほとんどの場合、会社の中でプロダクトマネージャーの役割が明確にされていないことと、プロダクトマネージャーとなる人に対する教育が不十分なことにある。

### [世界で闘うプロダクトマネジャーになるための本　トップIT企業のPMとして就職する方法](https://www.amazon.co.jp/dp/B00MN5AO7E)

前半がプロダクトマネジャーの役割の説明、後半はタイトルの通りGoogle等トップIT企業におけるプロダクトマネジャー面接対策集。

プロダクトマネージャーへのなり方、キャリアの積み方など、具体的な説明も多く、デザイナーからプロダクトマネージャーへの転身方法などもあり具体的。

プロダクトマネージャーの業務を概念的に説明するだけではなく、GoogleやAmazon、Facebookといった企業毎のプロダクトマネージャーの業務や役割、採用されやすい人物像が説明されているのが面白い。

>プロダクトマネジメントは、多くのコラボレーションを必要とされる役割です。プロダクトマネージャーは通常、エンジニアリングとその他の役割　ーデザイン、品質保証、ユーザー調査、データ分析、マーケティング、セールス、カスタマーサポート、ビジネス開発、法務、コンテンツのライター、他のエンジニアリングチーム、経営陣などーとの重要な橋渡し役を担います。

### [プロダクトマネジャーの教科書](https://www.amazon.co.jp/dp/4798111929)

エグゼクティブ向けビジネススクールのプログラム責任者で、プロダクト戦略コンサルも行う著者による、まさにプロダクトマネージャーの教科書。プロダクトマネジャーのミッションと仕事内容を包括的に解説する職務マニュアルといった内容で、プロジェクトマネージャーについて体系的・網羅的にまとまっている。

思考をブレイクダウンするためのフロー図、テンプレートも多く、実務に役に立ちますが、あくまで教科書的なので一人で読み進めるのもなかなかつらい一冊…。輪読会とかおすすめ。

### [ドキュメント トヨタの製品開発: トヨタ主査制度の戦略,開発,制覇の記録](http://www.amazon.co.jp/dp/4561520899)

トヨタのプロダクト開発工程をドキュメンタリー調で説明した一冊。
マーケティングから原価計算、工場のライン状況まで目を配らせる「クルマ」開発において、主査という役割が果たす役割こそ、最近よく語られるプロダクトマネージャーそのものだと感じました。

## Web上の情報

### [プロダクトマネージャーについて](http://d.hatena.ne.jp/naoya/20151026/1445827208)

最近のプロダクトマネージャー議論の発端になったエントリー。
日本のWeb系企業でよくある「企画職」と「プロダクトマネージャー」の違いについてのまとめが個人的にはしっくりきました。

> プロダクトマネージャーはいわゆる世間で言うところの「企画職」のようにも見えますが、彼らの役割は企画を立ててあとは開発に任せて終わり･･･ではなく、その後の開発プロセスが回ってる間の開発の支援や開発中の意志決定、製品の品質確保、リリース、その後の改善の企画までをトータルに見ていくので実態としては少し異なるでしょう。

### [A Product Manager’s Job](https://medium.com/@joshelman/a-product-managers-job-63c09a43d0ec#.d81k5gdnp)

TwitterやFacebookでプロダクトマネージャーを務めたJosh Elmanはこの職業を以下のように定義しています。

> The job of a product manager is to:  
> Help your team (and company) ship the right product to your users
> (訳：プロダクトマネージャーはチームを助け、正しいプロダクトをユーザーに届ける役割である)

ポイントはプロダクトマネージャーの役割はプロダクトのCEOやオーナーではなく、チームメンバーからアイデアを吸い上げ、正しい方向へプロダクトを導くことと規定していること。

### [What's the difference between a Project Manager and a Product Manager?(プロジェクトマネージャーとプロダクトマネージャーの違いは？)](https://www.quora.com/Whats-the-difference-between-a-Project-Manager-and-a-Product-Manager/answer/Ian-McAllister)

簡潔に一言でまとめています。クール。

> Product managers own "What" and "Why".  
Project managers own "How" and "When".

まとめると、以下の様な分類です。

- プロダクトマネージャー
  - 何を作るか、なぜ作るかに責任を持つ
- プロジェクトマネージャー
  - どうやって作るか、いつまでに作るかに責任を持つ

### [2016年にスタートアップに採用される職種TOP5](https://medium.com/life-learning/the-top-5-jobs-startups-are-hiring-for-in-2016-7d8debd16eb7#.o6t4tv1ud)

今年スタートアップに採用される職種の5位がプロダクトマネージャーでした、という記事。募集要項の傾向は以下のようなものだそうです。

 - 募集の43%がコンピューターサイエンスの経歴が必須もしくは望ましい
 - 募集の25%がアジャイル開発経験を希望
 - 募集の7%がスクラム経験を希望
 - 募集の3%がカンバン経験を希望

この辺りからも、アメリカのスタートアップのプロダクトマネージャーに求められる資質がかいま見えますね。
React.jsのRefsをES2015で書いてみた

初投稿です。
これから備忘録代わりにキータに記事書いて行こうと思います。
早速ですがReact.jsのrefsのサンプルをES2015で書き直しました。
#React.jsのrefsについて
とりあえずrefsについてはこのリンクを見て頂ければと思いますが
http://js.studio-kingdom.com/react/guides/more_about_refs
stateにデータを流してDOM操作してると、jQueryでいうところのremoveやappendは使わないにしてもサンプルのようにある動作をした後に直接DOMを操作したいということが稀にあります。
そんな時にrefs使うと良いよっていう話しです。

とりあえず、上記リンクのコードをES2015化して行きます。

```js:元のサンプルコード
var App = React.createClass({
    getInitialState: function() {
      return {userInput: ''};
    },
    handleChange: function(e) {
      this.setState({userInput: e.target.value});
    },
    clearAndFocusInput: function() {
      this.setState({userInput: ''}, function() {
        React.findDOMNode(this.refs.theInput).focus();
      });
    },
    render: function() {
      return (
        <div>
          <div onClick={this.clearAndFocusInput}>
          </div>
          <input
            ref="theInput"
            value={this.state.userInput}
            onChange={this.handleChange}
          />
        </div>
      );
    }
  });
```
これを以下のようにES2015で書き直します。

```js:ES2015
class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      userInput: ''
    }
    this.handleChange = this.handleChange.bind(this);
    this.clearAndFocusInput = this.clearAndFocusInput.bind(this);
  }

  handleChange(e) {
    ReactDOM.findDOMNode(this.setState({userInput: e.target.value}));
  }

  clearAndFocusInput() {
    this.setState({
      userInput: ''
    }, () => this.refs.theInput.focus());
  }

  render() {
    return (
      <div>
        <div onClick={this.clearAndFocusInput}>
        </div>
        <input
          ref="theInput"
          value={this.state.userInput}
          onChange={this.handleChange}
        />
      </div>
    )
  }
}
```

いくつかポイントをざっくり説明します。
##setStateする時はthisをbindする
ES2015で書く時にまず気をつけないといけないのはメソッドでsetStateする時はconstructorでthisをbindしてあげないとコンソールで怒られます。

##React.findDOMNodeではなく、ReactDOM.findDOMNodeを使用する
ここは若干曖昧なので迂闊なことは言えないんだけど、v0.14でReactDOMに分離してからfindDOMNodeはreact-domの中に吸収された。
ちなみにfindDOMNodeの部分を省略しても同じ挙動だったんだけど、なんでなんだろう、、、

```js:省略した書き方
this.setState({userInput: e.target.value})
```

今回は以上！まだまだreact.jsについてはわからないことが多いですが、少しずつ理解して行きたいヾ(･ε･`*)
唐揚げもうひとつだけ

##追記 
未だにアクセスしてくださるかたが多いのに、 古いし、JS力がなくて申しわけない。
JSの部分だけ、今だとこんなかな?というのを追記します。

```js:
const predMax = xs => {
  const [ws, [y, ...ys] ] = breakBy( Math.max(...xs) )(xs)
  return [...ws, y - 1, ...ys]
}
const breakBy = a => xs =>{
  const i = xs.indexOf(a)
  return [ xs.slice(0, i), xs.slice(i)]
}
const iterGen = f => xs => function*(){
  let a = xs
  while (true){
    yield a = f(a)
  }
}()

const a = iterGen(predMax)([10,8,6])
for (const _ of Array(10)){
  console.log(a.next().value)
}
```
 
## 以下、元記事
[関数型プログラミングはまず考え方から理解しよう](http://qiita.com/stkdev/items/5c021d4e5d54d56b927c#comment-773b5d31db41ea719056)を読んで、勉強になったし、自分でもやってみたのでメモ。のつづき。

[唐揚げつまんでみた](http://qiita.com/ttatsf/items/66680350eeb64956c207)でいろいろ教えていただいて、最終的にはこんな風になりました。

Haskell:

```haskell
predMax xs =   ws ++   pred y  : ys
    where
        (ws, y:ys) = break (== maximum xs ) xs

main = print $ take 10 $ tail $ iterate predMax [10,8,6]
```

JavaScript:

```javascript
(function() {
   // window.onload = function(){
        iterate = function(f,xs,n){
            if(n === 1) return [f(xs)];
            return [f(xs)].concat(iterate(f, f(xs), n - 1 ));
        };

        predMax = function(xs) {
            var indexMax = xs.indexOf( Math.max.apply( null, xs ) );
            return xs.slice(0, indexMax ).concat( 
                         [xs.slice(indexMax, indexMax + 1 )[0] - 1 ]
                        , xs.slice(indexMax + 1, xs.length )
                    );
       }

       console.log(iterate(predMax, [ 10, 8, 6 ], 10 )); 
   // }
}())
```

JSの方もHaskellと似たようなことをしています。
だいたいこれで自分としては満足なのですが、
#まてよ、俺は別にインデックスを知りたいわけではなかったな
、とか思いはじめ、もうちょっとだけHaskellによるように手を入れてみました。

```javascript
(function() {
   // window.onload = function(){
        iterate = function(f,xs,n){
            if(n === 0) return [f(xs)];
            return [f(xs)].concat(iterate(f, f(xs), n - 1 ));
        };
        tail = function(xs) {return xs.slice(1);};
        head = function(xs) {return xs[0]};
        maximum = function(xs) {return Math.max.apply( null, xs )};
        breakBy = function(a,xs) {
            return [ xs.slice(0,xs.indexOf(a)), xs.slice(xs.indexOf(a)) ] ;
        };
        pred = function(x) {return x - 1 };
        fst = function(xs) {return xs[0] };
        snd = function(xs) {return xs[1] };
        
        predMax = function(xs) {
            var breakByMax = breakBy(maximum(xs), xs);
            return fst(breakByMax).concat( 
                        [ pred( head( snd( breakByMax )))  ]
                        , tail( snd( breakByMax))
                    );
       };
         
       console.log( tail( iterate( predMax, [ 10, 8, 6 ], 10 ))); 
   // }
}());
```
```javascript
//結果
[ [ 9, 8, 6 ],
  [ 8, 8, 6 ],
  [ 7, 8, 6 ],
  [ 7, 7, 6 ],
  [ 6, 7, 6 ],
  [ 6, 6, 6 ],
  [ 5, 6, 6 ],
  [ 5, 5, 6 ],
  [ 5, 5, 5 ],
  [ 4, 5, 5 ] ]
```

なるだけHaskell風の関数にしてみました。
```iterate()```もHaskell流に戻しました。
```breakBy(x, ys)```はHaskellの ~~```break```にあたります。~~```break (== x) ys```にあたります。

行は増えたけど、インデックス操作や```slice()```で切り刻んでる感が隠れていい感じ。
と思ったのですが、何か問題があればコメントお願いします。

だれかこんなことやってる?とぐぐったらやっぱりいらっしゃいました。[
JavaScript Haskell 化計画　息切れ版](http://tnomura9.exblog.jp/12487454/)参考にさせていただきました。ありがとうございました。
2020年に向けてScratch を勉強してみる ~インストール編~

# Scratch勉強してみた
## はじめに
巷で有名なプログラミング教育。
日本では、2020年を境に義務教育にプログラミングが導入されるという噂（現在は方針のようです）
それが影響して子供の習い事の人気ランキングの上位にランクインしているとか、いないとか。
個人的には２０２０年は東京オリンピックより、プログラム教育がどうなっていくかの方が興味湧いてきました。

既に各地域の学校では下記の報告書にあるように、実験的に取り組みが行われています。
http://jouhouka.mext.go.jp/school/programming_zirei/

高校では工業高校でもないのにEclipseでJava書いているんですねー。

そこで小学生で導入されているのがScratch。
教育方面は興味があるので、この機会に触っておこうと思います。

## Scratch って？
Scratchは[ビジュアルプログラミング](https://ja.wikipedia.org/wiki/%E3%83%93%E3%82%B8%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)を行うソフトウェア。

マサチューセッツ工科大学（MIT）が、子供のプログラム教育を目的に開発しているソフトウェアです。
プログラムを通して問題解決能力を身につけるのはもちろん、今後ITが普及するにあたって、ITを前提とした創造力を養っていきたいようです。


## 導入~インストールまで~
1. 下記サイトへ移動
https://scratch.mit.edu/scratch_1.4/
![スクリーンショット 2016-05-21 10.24.51.png](https://qiita-image-store.s3.amazonaws.com/0/99413/bb669bd9-92a9-8701-f701-ba4065828bfb.png)

2. ダウンロード
使用しているOSに従ってダウンロード。
今回はmacなので、りんごをクリックします。
3. appファイル起動
ダウンロードしたファイルを解凍して起動します。
インストールまでの作業はこれだけ。あら、簡単。
![スクリーンショット 2016-05-21 10.29.14.png](https://qiita-image-store.s3.amazonaws.com/0/99413/e14ac129-5a66-a965-b225-57258b16e9ef.png)

なんか、後はUIに従っていじっていれば、猫ちゃんが動くらしい。
ふむ、ふむ。 

## まとめ
とりあえずインストールまで。
ここまで１時間かからなかったです。
UIも感覚でいじっていればある程度までプログラムできそうな、分かりやすいＵＩというイメージ。

プログラム教育楽しそうですね。
いつか遠い未来、自分の子供と一緒にプログラムしたい。

Scratchは大学３年の時に研究室で課題として出されて以来でした。
（課題は研究室全員と一致団結してサボりました）
その時は、何が何だかわからなかったのですが、２０２０年のこの動向が見えていたら、もう少し専門的に勉強したかったなと思う今日この頃。

今からプログラム教育系のボランティア始めようかな。

## 参考
http://www.atmarkit.co.jp/ait/articles/1603/21/news012.html
http://www.atmarkit.co.jp/ait/articles/1602/02/news112.html
jspm 0.17 Beta をReact.jsを使う

最初に、
ここではjspm 0.17 Betaを使うので、安定版を使いたい場合は
jspm 0.16 stableがあるのでそちらをお勧めします。http://jspm.io/docs/getting-started.html



#jspm@betaのインストール

```
$ npm install -g jspm@beta
```

適当なディレクトリを作り、その中で初期化します。
いろいろ聞かれますが、全てEnterでデフォルトにしました。

```
$ jspm init
```





jspm管理でrect-domをインストール

```
$ jspm install react-dom
```



'Hello World'と表示するコンポーネントを新規に作成。

```src/component.js
import React from 'react';
export class HelloWorld extends React.Component {
  render() {
    return React.createElement('h1', null, 'Hello World');
  }
}
```

renderを行うviewコンポーネントを作成。

```test.js
import React from 'react';
import ReactDOM from 'react-dom';
import {HelloWorld} from 'src/component.js';

let container = document.getElementById('container');
let component = ReactDOM.render(React.createElement(HelloWorld), container);
```

```index.html
<!docype html>
<meta charset="utf-8">
<script src="jspm_packages/system.js"></script>
<script src="jspm.browser.js"></script>
<script src="jspm.config.js"></script>
<body>
  <div id="container"></div>
  <script>
    SystemJS.import('test.js');
  </script>
```

ローカルサーバーを起動しブラウザでhttp://localhost:8888/
を立ち上げて"Hello World"と表示されればok。
（ここではpythonでSimpleHTTPServerを起動）

```
$ python -m SimpleHTTPServer 8888
$ open http://localhost:8888
```


ブラウザでソースコードをみると変換前とトランスパイルされたコードが確認できるし、両方のコードでブレークポイントを置くことが可能です。

https://github.com/keng0o/jspm-app
コンソールを出さすにバックグラウンド実行（golang）

# windows用

何もオプションを付けずにbuildするとコンソールが出てくるexeが作られるが、
下記のオプションをつけるとコンソールが表示されずに実行できるexeが作成できる

```
go build -ldflags -H=windowsgui hello.go
```

確認バージョン
v1.6.2

# mac用

```
go build -o hello.app/Contents/MacOS/hello
```
Zybo > BTN5を押したときだけLEDが点灯する実装

```txt:動作環境
Vivado/XSDK 2015.4
Windows 8.1 pro
```


http://qiita.com/7of9/items/373c79ea652db4e69da0
のリンク先を参考にBTN5を押したときにLED(LD4)が点灯する実装をしてみた。


```c
#include "xparameters.h"
#include "xgpiops.h"
#include "xstatus.h"
#include <xil_printf.h>

#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID

#define LED_DELAY		10000000
#define OUTPUT_PIN		7	/* Pin connected to LED/Output */
#define INPUT_PIN		51	/* Pin connected to Switch/Input */

#define printf			xil_printf	/* Smalller foot-print printf */

static int GpioInputOutputExample(void);
int GpioSetup(u16 DeviceId);

XGpioPs Gpio;	/* The driver instance for GPIO Device. */

int main(void)
{
	int Status;

	Status = GpioSetup(GPIO_DEVICE_ID);
	if (Status != XST_SUCCESS) {
		printf("GPIO Setup Failed\r\n");
		return XST_FAILURE;
	}

	Status = GpioInputOutputExample();
	// will not return here by while(1)
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	return XST_SUCCESS;
}

int GpioSetup(u16 DeviceId)
{
	int Status;
	XGpioPs_Config *ConfigPtr;

	/* Initialize the GPIO driver. */
	ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
	Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
					ConfigPtr->BaseAddr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	return XST_SUCCESS;
}

static int GpioInputOutputExample(void)
{
	u32 Data;
	volatile int Delay;

	XGpioPs_SetDirectionPin(&Gpio, OUTPUT_PIN, 1);
	XGpioPs_SetOutputEnablePin(&Gpio, OUTPUT_PIN, 1);
	//
	XGpioPs_SetDirectionPin(&Gpio, INPUT_PIN, 0);

	// init
	XGpioPs_WritePin(&Gpio, OUTPUT_PIN, 0x0);

	while(1) {
#ifndef __SIM__
		/* Wait a small amount of time so the LED is visible. */
		for (Delay = 0; Delay < LED_DELAY; Delay++)
			;
#endif
		Data = XGpioPs_ReadPin(&Gpio, INPUT_PIN);
		if (Data == 0x1) {
			XGpioPs_WritePin(&Gpio, OUTPUT_PIN, 0x1);
		} else {
			XGpioPs_WritePin(&Gpio, OUTPUT_PIN, 0x0);
		}		
	}
	return XST_SUCCESS;
}
```
fswebcamでピントを合わせる&ぶれない画像を撮影する方法

# 背景

Raspberry pi で定点観測カメラシステムを作成しているのですが、古い webcam (Buffalo の BSW20KM01H) でfswebcamを用いて撮影していると、いまいちピントが合いませんでした。

# 結論

--skip オプションである程度オートフォーカスと自動露光のための時間(例 --skip 10)を取ってから、実際に撮影する露光時間を短くする(例 -F 1)とすると、きれいに撮影できました。


# 内容

fswebcamにはいろいろなオプションが用意されています。主要なものは、

-p, --palette：どのような色画像にするか（png, jpeg, grey など）
-r, --resolution：解像度(webcamに合わせて設定、デフォルトが384x288だが、640x480、1280x1024などでもよい)
__-F, --frames：撮影するフレームの数（露光時間に対応）、短いほどぶれない__
__-S, --skip：撮影しないが露光を行い、webcamによってはオートフォーカスや自動露光を行う__

-l, --loop：指定した時間でループさせて撮影を行う (-l 10 で10sごとに撮影を行う)
-v, --verbose：撮影中の追加情報を見れる
--log：ログをファイルに出力できる

です。この中でも -F と -S の調整が重要です。
ちなみに、僕のwebcamは10fpsほどしか出ないので、-F 10 とすると、撮影に1秒かかります。

## オプションを変化させた結果

カメラの前で手を振った写真を上記のオプションを変えながら撮影しました。-r は 640x480 です。

-F 1 -S 0

![f1skip0.jpg](https://qiita-image-store.s3.amazonaws.com/0/36752/8966ff56-fc36-a1a6-4f25-b6e778bf0f43.jpeg)

-F 1 -S 10

![f1skip10.jpg](https://qiita-image-store.s3.amazonaws.com/0/36752/a4d30e72-c90d-e210-49ab-195ed87410c7.jpeg)

-F 1 -S 20

![f1skip20.jpg](https://qiita-image-store.s3.amazonaws.com/0/36752/cf400ef9-25b1-afea-937b-d9a641c4320b.jpeg)

-F 10 -S 0

![f10skip0.jpg](https://qiita-image-store.s3.amazonaws.com/0/36752/9011cfcb-82b3-0491-8e9b-70785242a06d.jpeg)

-F 20 -S 0

![f20skip0.jpg](https://qiita-image-store.s3.amazonaws.com/0/36752/eea91ee6-2a25-4da4-e581-c138e87b45a4.jpeg)


綺麗に撮れた写真がどちらも真ん中に被写体がないのが申し訳ないのですが、-F 1 としている分だけブレが少ないのに対し、-F 10 以上に設定しているものは、ブレブレなのがわかります。
また、-F 1 -S 0 にしたものは、露光時間が短すぎて全体的に暗い写真になってます。

__ただし、これらのパラメータはwebcamの性能によって大きく変わるので、最近のwebcamであれば、解像度を上げたり、-S を短くしても問題ないかもしれません__
Kernel#ppのHash表示を新記法(>1.9)に変える	


## TL;DR

`Kernel#pp`(Pretty Print)で表示するHashオブジェクトについて、キーがシンボルのものを以下のような古い記法（ハッシュロケット形式）から新しい記法へ変える方法を紹介します。

```ruby:古い記法（ハッシュロケット）
{ :font_size => 10, :font_family => "Arial" }
```

```ruby:新しい記法（Ruby1.9以上）
{ font_size: 10, font_family: "Arial" }
```

## 問題意識

特に`irb`や`pry`では、変数のオブジェクト内容を表示することが多いですが、表示が必ずハッシュロケット形式の古い記法になってしまっていて、新記法派の人はモヤモヤしていました。
出力をコピペするときも、ペースト先で新記法へ直す必要がありました（[一括置換する方法](http://qiita.com/jnchito/items/b2e4289c5ae8bc1b2ee9)もありましたね）。

## 解決方法

そこで、`Hash`オブジェクトが`Kernel#pp`で表示される時に呼ばれる、`Hash#pretty_print`メソッドを設定することで新記法表示となるようにします。

## 具体例

先に具体的な表示の違いを見てみましょう。

### 古い記法（ハッシュロケット形式）

```ruby:pry
[1] pry(main)> { a: 0, b: "b", c: { :ca => :ca, cb: {}, "(｀・ω・´)": [], "cd": "cd" * 20 }, "d" => :d, "e-f": :ef }
=> {:a=>0,
 :b=>"b",
 :c=>
  {:ca=>:ca,
   :cb=>{},
   :"(｀・ω・´)"=>[],
   :cd=>"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"},
 "d"=>:d,
 :"e-f"=>:ef}
```
 
### 新しい記法へ変更すると
 
```ruby:pry
[1] pry(main)> { a: 0, b: "b", c: { :ca => :ca, cb: {}, "(｀・ω・´)": [], "cd": "cd" * 20 }, "d" => :d, "e-f": :ef }
=> {
  a: 0,
  b: "b",
  c: {
    ca: :ca,
    cb: {},
    "(｀・ω・´)": [],
    cd: "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
  },
  "d" => :d,
  "e-f": :ef
}
```

スッキリしました。コピペしても大丈夫ですね。
なお、シンボル型のキーの場合は、元の記法に関わらずできるかぎり新記法で表示しようとします。

また、改行可能な位置(breakable point)も少し調整したので、見やすくなっていると思います。

## 実現方法（変更方法）

実現は簡単です。以下のファイルを作って`require`します。ファイル名は任意です。

```ruby:hash_pretty_print.rb
require 'pp'
class Hash
  def pretty_print(q)
    if empty?
      q.text '{}'
      return
    end
    q.group 2, '{' do
      q.breakable
      q.seplist self do |k,v|
        if k.is_a? Symbol
          if k.inspect[1] === '"'
            q.text %|"#{k}": |
          else
            q.text "#{k}: "
          end
        else
          q.pp k
          q.text ' => '
        end
        if v.is_a? Enumerable
          q.pp v
        else
          q.group 1 do
            q.breakable ''
            q.pp v
          end
        end
      end
    end
    q.breakable
    q.text '}'
  end
end
```

`irb`や`pry`では、実行時に指定すると良いでしょう。

```
% irb -r./hash_pretty_print
% pry -r./hash_pretty_print
```

他にも`Ruby on Rails`では、`#{Rails.root}/config/initializers/hash_pretty_print.rb`などに置いておけば、`rails console`でも自動的に読み込まれますね。

よかったら使ってみてください。
Enjoy ruby life!

## 参考

- [library pp (Ruby 2.3.0)](http://docs.ruby-lang.org/ja/2.3.0/library/pp.html)
- [Module: PP::PPMethods (Ruby 2.3.0)](http://ruby-doc.org/stdlib-2.3.0/libdoc/pp/rdoc/PP/PPMethods.html#method-i-pp_hash) *source
- [Class: Hash (Ruby 2.3.1)](http://ruby-doc.org/core-2.3.1/Hash.html)
Vagrant1.8.1以下＋Ansible2の組み合わせで ansble_local provisionerを使う


----
すでにVagrant1.8.5がリリースされている 2016/07時点ではこのページの内容は不要なノウハウとなった。どうしてもという理由がなければ、Vagrant1.8.4 以上[^1]を使うことをおすすめする。

[^1]: 筆者の環境(Boxは`boxcutter/centos71`を利用)ではVagrant1.8.5でバーチャルホストへのSSHのログインキーの設定に失敗してログインできない事象が発生して検証不能だった。Vagrant1.8.4では、そのような不具合なく動作し、このバットノウハウが不要であることを確認した。
----

以下は2016/05時点での記述であり、その時点でのVagrantとAnsibleの最新バージョンは次の通り。

- Vagrant：1.8.1
- Ansible：2.0.2

## 2つのansibleプロビジョナ
VagrantでAnsibleを利用する場合、次の2種類のプロビジョナがある。

- ansible プロビジョナ
- ansible_local プロビジョナ

別にプロビジョナを使うことは必須ではないが、Vagrantファイルに書いておけば `vagrant up`や`vagrant provision`で実行できるので便利。

ansibleプロビジョナはVagarntを実行するホスト側でAnsibleが実行される。
ansible_local プロビジョナはVagrantで構築するゲスト側でAnsbileが実行される。ゲストOSにansibleがインストールされていない場合には自動的にインストールされ、実行される。

Vagrant+Ansibleを使う場合、ホスト側にAnsibleをインストールする必要がなくなるansible_local プロビジョナのほうが便利。

## Vagrant 1.8.1で ansible_local プロビジョナを使うとエラーが発生する。
しかし、現時点(2016/05)では ansible_localプロビジョナはAnsible2に対応できていないようで、次のようなエラーがでて実行できない。

```
The Ansible software could not be found! Please verify
that Ansible is correctly installed on your guest system.

If you haven't installed Ansible yet, please install Ansible
on your Vagrant basebox, or enable the automated setup with the
`install` option of this provisioner. Please check
https://docs.vagrantup.com/v2/provisioning/ansible_local.html
for more information.
```

でも、ゲストOSに入って、`ansible --version` を実行すると 2.0.2がインストールされている。
どうして動かないのか？

ansible_localプロビジョナは `ansible-galaxy --help`を実行してそのステータスコードが0の場合、ansibleがインストールされていると判定するが、Ansible2から0以外が返ってきてしまうのでAnsibleがインストールされていない！というエラーになってしまうようだ。

## ワークアラウンドな対処方法

でどうするか？ 次のコードをようにしてこのバグを回避した。

```ruby
  begin
    Vagrant.require_version(">= 1.8.2")
  rescue
    config.vm.provision "shell", inline: <<-SHELL
      echo '#!/bin/bash' > /usr/local/bin/ansible-galaxy
      echo '/usr/bin/ansible-galaxy "$@" || exit 0' >> /usr/local/bin/ansible-galaxy
      chmod 755 /usr/local/bin/ansible-galaxy
    SHELL
  end
  
  config.vm.provision :ansible_local do |ansible|
    ansible.playbook = "provisioning/site.yml"
  end
```

やっていることは、ansible_local プロビジョナの前にshellプロビジョナを実行し、次のファイルを作って、`/usr/bin/ansible-galaxy` のステータスコードを強制的に0にしてプロビジョナのAnsibleのインストールチェックを騙すようにする。

```bash:/usr/local/bin/ansible-galaxy
#!/bin/bash
/usr/bin/ansible-galaxy "$@" || exit 0

```
`begin 〜 rescue`で囲っているのは、Vagarnt 1.8.2より低いバージョンでのみ実行されるようにするため。このansible_localプロビジョナのバグはVagrant 1.8.2で修正される模様。
Zybo > LED example > Zybo用にOUTPUT_PINを7に変更して動いた > XGpioPs_ReadPin()が失敗している

```txt:動作環境
Vivado/XSDK 2015.4
Windows 8.1 pro
```

## Lチカ

http://qiita.com/7of9/items/ae916624c13a59ba2992
と関連して、すぐに思いついたのはGPIOのサンプル実行。Lチカしてみる。

system.mssのps7_gpio_0のImport ExamplesからGPIOのサンプルコードを取込んだ。hello_bsp_xgpiops_polled_example_1というプロジェクトが作られた。

src以下にあるxgpiops_polled_example.cのヘッダー部分を見ていると、以下の記載がある。

>`*		      Updated the examples for a ZC702 board .
` 
...

> `#define OUTPUT_PIN		10	/* Pin connected to LED/Output */`

ZC702とZYBOはGPIOが異なる。

http://qiita.com/7of9/items/9f35a6b14f4898690237
のリンク先にあるPS側のLEDのピン番号はMIO7だから、以下のようにしてみた。

```
#if 1 // zybo
#define OUTPUT_PIN		7	/* Pin connected to LED/Output */
#else
#define OUTPUT_PIN		10	/* Pin connected to LED/Output */
#endif
``` 

アプリを実行してみるとMIO7に対応するLD4が点灯した。

## 変更後の問題

しかしながら、上記の変更をすると変更前は

```
GPIO Polled Mode Example Test
Data read from GPIO Input is  0x1
Successfully ran GPIO Polled Mode Example Test
```

だったのが以下になってしまった。

```
GPIO Polled Mode Example Test
GPIO Polled Mode Example Test Failed
```

1つ目のXGpioPs_ReadPin()の値が0になってしまう。

```
Data = XGpioPs_ReadPin(&Gpio, OUTPUT_PIN);
if (Data != 1 ) {
    return XST_FAILURE;
}
```

XGpioPs_SetDirectionPin()にてLEDのGPIOをOUTPUT方向にしているのに、それに対してReadPin()をしている点。また、ZYBO用のGPIO変更前はそれでReadPin()の値が1になっていた点、が未消化。

```
/*
 * Set the direction for the pin to be output and
 * Enable the Output enable for the LED Pin.
 */
XGpioPs_SetDirectionPin(&Gpio, OUTPUT_PIN, 1);
```

関連 http://dev.widemeadows.de/2014/03/06/zybo-board-driving-the-ld4-led-using-the-btn4-button/
よくつかうsqliteのコマンド

よく使うsqliteのコマンドのメモ

```株式データテーブル.sql
■データベースに入る(ファイルがあるディレクトリに行って)
sqlite3 finance.db　

■テーブルを作る
create table stock_master(
up_date date,
code int,
name varcher(200),
category_code_33 int,
category_name_33 varcher(200),
category_code_17 int,
category_name_17 varcher(200),
model_code int,
model_name varcher(200),
market varcher(200),
 primary key(up_date,code)
);

■作成したテーブルの構造(カラム名やカラムの型)を調べる
.schema テーブル名

■中間テーブルの作成
CREATE TABLE 新テーブル AS SELECT * FROM 既存テーブル


■別途用意したファイルからデータを読み込む(ファイルがあるディレクトリに行って)
.import FILE名 TABLE名

■値の区切り文字の確認と設定
.show
.separator ,

■出力モードを設定
.mode MODE名

csv      カンマ区切りで出力
column   カラム毎に左揃えで出力
html     HTMLのTABLE形式で出力
insert   INSERT文として出力
line     各カラム毎に行を分けて出力
list     区切り文字でカラムを区切り1行で出力(デフォルト)
tabs     タブ区切りで出力
tcl      TCLのlist形式で出力

■出力先をファイルへ変更する(csv)
.headers on
.mode csv
.output ファイル名
select * from テーブル名;


■元に戻す
.output stdout
```

#pythonでいじる

```
◼︎sqliteを使ってデータ分析
# ライブラリの読み込み
import sqlite3
# データベースへ接続
conn = sqlite3.connect('./sqlite.db')
# カーソルの作成
cur = conn.cursor()
#　すべての行を入れる
sql='select price from stock_data where code ="1323";'
cur.execute(sql)
row = [item[0] for item in cur.fetchall()]


◼︎グラフ
import matplotlib.pyplot as plt
plt.plot(row)
put.hist(row)
plt.show

```
Zybo > XADC > XAdcPs_GetAdcData() / XAdcPs_GetMinMaxMeasurement() / XADCPS_CH_TEMP / XADCPS_MAX_TEMP / XADCPS_MIN_TEMP

```txt:動作環境
Vivado/XSDK 2015.4
Windows 8.1 pro
```

http://qiita.com/7of9/items/ae916624c13a59ba2992
で実行したコードの整理。

```
The Current Temperature is 49.179 Centigrades.
The Maximum Temperature is 52.078 Centigrades.
The Minimum Temperature is 43.681 Centigrades.
```
となっている部分は以下が対応する。

```xadcps_polled_printf_example.c
...

/*
 * Read the on-chip Temperature Data (Current/Maximum/Minimum)
 * from the ADC data registers.
 */
TempRawData = XAdcPs_GetAdcData(XAdcInstPtr, XADCPS_CH_TEMP);
TempData = XAdcPs_RawToTemperature(TempRawData);
printf("\r\nThe Current Temperature is %0d.%03d Centigrades.\r\n",
			(int)(TempData), XAdcFractionToInt(TempData));


TempRawData = XAdcPs_GetMinMaxMeasurement(XAdcInstPtr, XADCPS_MAX_TEMP);
MaxData = XAdcPs_RawToTemperature(TempRawData);
printf("The Maximum Temperature is %0d.%03d Centigrades. \r\n",
			(int)(MaxData), XAdcFractionToInt(MaxData));

TempRawData = XAdcPs_GetMinMaxMeasurement(XAdcInstPtr, XADCPS_MIN_TEMP);
MinData = XAdcPs_RawToTemperature(TempRawData & 0xFFF0);
printf("The Minimum Temperature is %0d.%03d Centigrades. \r\n",
			(int)(MinData), XAdcFractionToInt(MinData));

...
```

以下のような使い方のようだ。

- XAdcPs_GetAdcData() : 通常のAD取込みデータを取得. XADCPS_CH_TEMPを指定。
- XAdcPs_GetMinMaxMeasurement() : ある期間のAD取込みデータの最大もしくは最小を取得。XADCPS_MAX_TEMPやXADCPS_MIN_TEMPを指定。

XADCPS_MIN_TEMPなどはxadcps.hにて定義されている。
Zybo > XADC sample > Import Examples / Run

```txt:動作環境
Vivado/XSDK 2015.4
Windows 8.1 pro
```

ずいぶん久しぶりにZyboを扱っている。Adam Taylorのblogで読んだXADCコードを試した。

自分で入力しようと思っていが、Example Codeをすぐに試せるようだった。


`1. XSDKにおいて、作成したapplicationにあるsystem.mssを開く

`2. ps7_xadc_0の記載の右側のImport Examplesをクリック

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5ed7ba85-4cbb-40c5-4ff9-44d5deddceba.png)

`3. xadcps_polled_printf_exampleを選択してOKを押す (割込みでなくポーリングとしている)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e26ca33d-d0ed-dd73-e70b-ebb0886c305f.png)

hello_bsp_xadcps_polled_printf_example_1というプロジェクトが作成される。これを実行した結果が以下。

```
Entering the XAdc Polled Example.

The Current Temperature is 49.179 Centigrades.
The Maximum Temperature is 52.078 Centigrades.
The Minimum Temperature is 43.681 Centigrades.

The Current VCCPINT is 0.988 Volts.
The Maximum VCCPINT is 0.995 Volts.
The Minimum VCCPINT is 0.985 Volts.

The Current VCCPAUX is 1.792 Volts.
The Maximum VCCPAUX is 1.794 Volts.
The Minimum VCCPAUX is 1.788 Volts.


The Current VCCPDDRO is 1.487 Volts.
The Maximum VCCPDDRO is 1.492 Volts.
The Minimum VCCPDDRO is 1.469 Volts.
Exiting the XAdc Polled Example.
```
Install Xamarin

C#を勉強すべく本買ったら、最初のセットアップがVisual Studioで, Macにインストールしようとしたらexeファイルが落ちてきて詰んだ。Visual Studio Mac版はなかったつらみ。Visual Studio Coreならクロスプラットフォームなんだけども。

というわけで本はそっ閉じしw Xamarinをインストールしてみることにした。

* Xcodeを入れる
* Xamarinを公式からdownload
* インストーラ進めていくとついでにAndroid SDK, Java SDK, Android NDK, Mono framework, etcをモリッとインストールしてくれる。個別にJavaとかインストールさせる方式ではなくてバージョンがががとか悩まなくて🆗　素晴らしい。
* Xamarin Android Playerもインストールしとけとのこと。これ入れると高速なエミュレーション環境が手に入るとのこと  

これでC#でiOS, Android両方のアプリをかけてbuildできる。

Next Step https://developer.xamarin.com/videos/ を見ながらやってみる
RxSwiftでthrottleFirst


RxSwiftにはthrottleFirstオペレータがなかったのでつくってみました。一発イベントが来たらその後一定時間はイベントを無視します。チャタリングの防止によく使われる仕組みです。

https://gist.github.com/gamako/1c52ef8eb19070138fcb35677e696475

```swift

extension ObservableType {
    func throttleFirst(time: RxTimeInterval, scheduler: SchedulerType) -> Observable<E> {
        let s = self.share()

        return s
            .throttle(time, scheduler: scheduler)
            .map { _ in () }
            .startWith()
            .flatMapLatest{ _ in s.take(1) }
    }
}
```


こちらにC#の実装を書いてくれていますが、RxSwiftにはwindowオペレータもなかったので考えてみました。頭の体操みたいなものですね。
http://qiita.com/Temarin_PITA/items/0625ac12912388ea73a4
Zybo > Chronicles blog 18 > Link > XDCのフォーマットに関するPDF

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Introduction-to-the-Zynq-Triple-Timer-Counter-Part-Two-Adam/ba-p/410361

XDCファイルを新規作成する中で

> If you are unsure as to the new syntax, there is a helpful language template that you can use to explore and find the syntax needed for your XDC file.

そのリンク先が以下（2013年版なので古い)

http://www.xilinx.com/support/documentation/sw_manuals/xilinx2013_1/ug903-vivado-using-constraints.pdf
Zybo > Chronicles blog 18 > TTC > Vivado / XSDKでの設定

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Introduction-to-the-Zynq-Triple-Timer-Counter-Part-Two-Adam/ba-p/410361

IO出力をするのだが、以下の理由からMIOでなくEMIOを使う。

> We need to use the EMIO ports because the MIO locations available to both of the Zynq TTCs are already being used by the Ethernet, USB, and SD Card interfaces.

...

> the waveform output labelled TTC0_WAVE0_OUT.

...

[EMIOはPL側にある](http://qiita.com/7of9/items/712160e4ad99a2568657)ため、

> The port we are going to use is not within the Zynq SoC’s PS side. Therefore,  we need to create a constraint file to define which pin on the PL side of the device we will use for the TTC waveform output.

あとはXDCファイルを作る、など。
Zybo > Chronicles blog 17 > TTC > modes > interval / overflow / (event timer)

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Introduction-to-the-Zynq-Triple-Timer-Counter-Part-One-Adam/ba-p/407537

> Each TTC has two basic modes of operation: interval or overflow mode, plus the event timer.
  
> Interval mode : The counter counts to a value contained within the interval register, counting either up or down, and generates an interval interrupt whenever the count reaches zero (when enabled).
 
> Overflow mode : The counter increments or decrements from 0 to full scale. When the counter wraps around, the TTC generates an overflow interrupt.

...

> The event timer can be used only with an external source and is a resource you can use to measure an event’s duration or to decode a PWM signal.
技術英語 > Link > commonly-available references > Corpora / Dictionaries / General Reference / Grammar / Style / Thesauri / Translation

StackExchangeの１つENGLISH LANGUAGE & USAGEで質問しているなかで、commonly-available referencesが気になった。

そのリンク先が以下。
http://meta.english.stackexchange.com/questions/2573/what-good-reference-works-on-english-are-available

Merriam-Webster Learner's Dictionaryは、5年ほど前に別の掲示板で英語の勉強をしていた時に推薦された辞書だ。他の辞書も参考になりそう。

これらの辞書を使ってなお疑問点がある場合に、ENGLISH LANGUAGE & USAGEなどで質問するのが良さそう。
技術英語 > Today we [turn to] a professor at the National War College

http://www.manythings.org/voa/wm/wm121.html

> Today we <font color=red>turn to</font> a professor at the National War College here in Washington, historian Mark Clodfelter.

http://eow.alc.co.jp/search?q=turn+to&ref=sa
> `3 ～に問い合わせる、～を調べる、～を参照する、～ページを見る

<hr>
関連して思い出したのは

Leave it to the expert.
http://qiita.com/7of9/items/613aa9bb7153f1e573d9
luarepl で lua の REPL を置き換える

## 追記(2017/04/05)
この投稿では luarepl 付属の rep.lua でデフォルトの REPL を置き換える話を紹介しましたが、[torch](https://github.com/torch/torch7) 付属の [TREPL](https://github.com/torch/trepl) の方がより便利に使えそうです。

## 文脈

ターミナルから lua を叩くと REPL が起動しますが、デフォルトの REPL は補完が効かなかったり、式を評価した際に print しなければ戻り値が表示されないなど、使い勝手がよくありません。これらの挙動は [luarepl](https://github.com/hoelzro/lua-repl) に付属している rep.lua を使用すると、少しマシになります。

## インストール
luarocks でインストールします。
`brew install lua` で lua をインストールした場合は、デフォルトで luarocks コマンドが使えます。

```
$ luarocks install luarepl
```

下記ディレクトリにインストールされます。今回は 0.8-1 がインストールされました。

```
/usr/local/lib/luarocks/rocks/luarepl/0.8-1
/usr/local/share/lua/5.2/repl
```

/usr/local/lib/luarocks/rocks/luarepl/0.8-1/bin/rep.lua が luarepl のサンプルアプリケーションです。
ターミナルから lua を叩いた際、rep.lua が使われるようシェルにエイリアスを設定します。

```.bashrc
alias lua='lua /usr/local/lib/luarocks/rocks/luarepl/0.8-1/bin/rep.lua'
```

```
$ source ~/.bashrc
```

ターミナルから再度 lua を叩き、luarepl が使われていることを確認します。この状態で tab 補完が効くはずです。

>$ lua
Lua REPL 0.8
\>

ついでに、luarepl を require できることを確認します。

>$ lua
Lua REPL 0.8
\> repl = require "repl"
\> repl:name()
REPL
\>

luaインタープリタを組み込みたいとき等に使うと利便性が上がるかもしれません。
ここが変だよ BigQuery テーブルの JSON Export

[Exporting Data From Bigquery](https://cloud.google.com/bigquery/exporting-data-from-bigquery) の機能を使って BigQuery のテーブルを GCS (Google Cloud Storage) に JSON Export する時の挙動をまとめておく。

## 書いてある仕様

ref. https://cloud.google.com/bigquery/exporting-data-from-bigquery

* BigQuery でエクスポートできるデータはファイルごとに最大 1 GB だが、gs://my-bucket/file-name-*.json のようなワイルドカード指定すると、複数のファイルに分けてエクスポートできる。
* (GCS に書き込むので当然) Developer Console で BigQuery API に加えて GCS API を有効にしてもらう必要あり
* (GCS に書き込むので当然) GCS への write 権限が必要
* 1 日あたりの制限: 1 日あたり 1,000 回のエクスポート、最大 10 TB
* 複数ワイルドカード URI の制限: 1 回のエクスポートで 500 URI
* csv (csv.gz), json (json.gz), または avro で出力できる
* RECORD 型があると CSV では出力できない

## ここが変だよ JSON Export

JSON でデータを Export した時に、変な点があったのでまとめておく。ドキュメントに書かれていない挙動である(仕様ではない)ため将来的に変更される可能性がある。

| BigQuery Type | Exported JSON Type | 補足 |
|:-----------|:------------|:-------------|
| BOOLEAN    | boolean     | 特記事項なし   |
| INTEGER    | **string**      | string になる仕様... > https://code.google.com/p/google-bigquery/issues/detail?id=31 |
| FLOAT      | number      | FLOAT型だが、小数部が0の場合は **integer**、小数部が0でない場合は **float** になる |
| TIMESTAMP  | string      | **小数部があるかどうかでフォーマットが異なる**。小数部が0の場合は`2014-09-01 14:40:41 UTC` (`%Y-%m-%d %H:%M:%S %z`)、小数部が0でなければ `2014-09-01 14:40:41.1 UTC` (`%Y-%m-%d %H:%M:%S.%N %z`)になる。小数部はマイクロ秒まで。Export時にフォーマットの指定などはできない。|
| RECORD     | object (hash) | 特記事項なし |
| REPEATED (mode) | array | 特記事項なし |
| BYTE | 未調査 | 調査してから新しく追加されたため、まだ調査してない。ToDo |

## おわり

出力された JSON を Hadoop にそのまま持って行って Hive や Presto で処理しようとしたり、GCSに吐き出したファイルを embulk-input-gcs で取り込もうとすると、微妙にフォーマットの違うカラムの値があったりして困る、という話でした。
Configlations on CentOS6 and EC2

AWS(Amazon Web Services)のEC2（Elastic Compute Cloud）上で、フリーのLinuxディストリビューションの一つであるCentOS 6を経済学における科学技術計算に使用する。Matlab+gfortran(mex)、Intel Fortranを主に使用。そのための環境構築に関するメモ。

######ユーザ設定

AMIはAWS Marketplaceで
> CentOS 6 (x86_64) - with Updates HVM

を選択。インスタンスタイプはとりあえず`t2.micro`にしておく（後で必要に応じて高スペックのインスタンスを使用する）

一般ユーザの作成、sudoers権限を付与。
Matlabをactivateする際の登録ユーザでないとMatlabを起動できない。

```
# useradd takeki
# passwd takeki
# usermod -G wheel takeki
```

`/etc/sudoers`ファイルの以下の行をコメントアウト。

```
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL

## Same thing without a password
%wheel  ALL=(ALL)       NOPASSWD: ALL
```

######VNCの設定
サーバ側は基本的にこの記事の内容に従って作業
http://dev.classmethod.jp/cloud/ec2-gui-by-vnc/

CentOS7の場合は
http://qiita.com/tanuki-project/items/2496339d204b9646f36c
結構違う。。あと```
$ sudo yum -y groupinstall "Server with GUI"
```も入れた。

クライアントはMacbookで、ターミナルとFinder（移動>サーバへ接続）でssh+port forwardingでアクセス

クライアントで

```
$ ssh -i my-key.pem centos@54.199.xxx.xxx -L 1234:localhost:5901
```

ユーザ`centos`でログイン後、`su takeki`でユーザ切り替え
（最初から`takeki`でログインするにはssh鍵設定するか、`/etc/ssh/sshd_config`を書き換える）
http://qiita.com/gotohiro55/items/36a22516de2b381b3c6e

######Matlabのインストール
rootでGUIのインストーラーを表示させるには

```
$ xhost +local:root
```

Matlabを起動後、`mex -setup fortran`を叩いておく。

```
>> mex -setup fortran
MEX configured to use 'gfortran' for FORTRAN language compilation.
Warning: The MATLAB C and Fortran API has changed to support MATLAB
	 variables with more than 2^32-1 elements. In the near future
	 you will be required to update your code to utilize the
	 new API. You can find more information about this at:
	 http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.
```

######Dynareのインストール

Source codeをhttp://www.dynare.org からダウンロード。`gcc`, `g++`, `boost-devel`をyumでインストール
`matio`はpuias_computational repositoryからインストール
この記事に従ってレポジトリを追加。
https://gist.github.com/nico4/9616638
configureのオプションはこんな感じ

```
$ ./configure --with-matlab=/usr/local/MATLAB/R2016a MATLAB_VERSION=8.7 --enable-openmp CFLAGS=-O3 CXXFLAGS=-O3 --disable-octave
```
make, make installする。デフォルトではインストール先は`/usr/local/lib/dynare`

######HDDの容量が足りなくなった
基本的にこの記事の内容に従って作業
http://qiita.com/tiida26/items/7761db891cf7cd05d6d2
Ajaxでマルチバイトを使った時に躓いたこと


##概要
最近業務でAjaxを使った処理で躓いたのでメモとして残しておきます。

##内容
Ajaxを使って名前が使われているか判定するプログラムを実装していましたが、
PHP内で一部の漢字が文字化けしていました。
デバックしていくとPOST値を受け取り、
エンコーディングした際に文字化けしていることがわかりました。
文字コードはサーバ・HTMLともにEUCを使っています。

##対策
Ajaxで送る値をURLエンコーディングすることによって解決しました。
まずはJS内で送りたい値をURLエンコーディングします。

```Javascript
$data = encodeURIComponent('送りたい値');
```

そして、受け取ったPHPでURLデコードし、文字コードを変更します。

```PHP
mb_convert_encoding(urldecode('送られた値'));
```

こうすることによって漢字の文字化けを回避することが出来ました。

こういった文字化けがあるので、
マルチバイト文字はそのまま送らないよう実装した方が吉ですね…
iOSアプリ開発テンプレ

#iOSアプリ開発のテンプレ化

### アプリは開発の流れとしては

1. サービス仕様（画面デザインや基本ロジック）決定
1. 実装するための詳細仕様（各Viewのパラメータやアプリ動作ロジック）決定
1. 実装
1. 機能試験で仕様に沿ってなければ実装修正
1. 全体的な動作試験
1. リリース
2. 運用上の問題修正

### サービス仕様決定
1. サービスコンセプト、サービス収支、サービスターゲット決定
2. サービスコンセプトに沿ったUIデザイン作成
3. サービスコンセプトと制限事項に沿ったロジックを設計
4. 必要な外部システムの手配

このうち開発に渡す情報としては、

* UIデザイン
* アプリロジック
* 外部システムとの連携仕様
* スケジュール

### 詳細仕様決定

1. 各利用対象端末（iPhone,iPad）の画面サイズに合わせて再デザインし、デザインを各Viewに分解してViewのパラメータ調整する。
2. 必要なデータモデルを書き出し、スキーマを調整する。
3. 基本ロジックを分類し、ビジネスロジック（UIとは分離できるもの）とViewロジック（Viewの調整に関わるもの）に分ける。
4. アプリの各状態における振る舞い（データ初期化・取得などのタイミング）について状態遷移表を作成する
5. テスト用または画面PV計測用のロギング設計を行う

### 実装

1. データモデルからDB作成
2. 調整されたデザインに基づいて、Viewの初期パラメータとViewロジックを作成
3. ビジネスロジックを作成
4. 状態遷移表に従って、AppDelegateとViewControllerにViewロジックやビジネスロジック呼び出しを配置
5. テストまたはPV計測のためのログ出力を追加

### 機能試験

* ビジネスロジックについては、様々なパターンの入力を与え評価するユニットテストを行う。
* UIテストは手動もしくはAppiumにて各試験データを与えたときの状態遷移に基づく画面表示内容を確認。
* ログを活用してアプリ内の状態変化を監視する。
* アプリはCIで自動ビルドして、バイナリをサイトまたはツールを作って配布し、テスターが簡単にインストールできる環境を作る。

### 全体的な動作試験

* UXとデグレしていないかを確認する。

### リリース

* AppStoreに申請
* プロモコードで最終動作確認（商用BundleIDでないと試験できないものとか）
* リリース

### 運用上の問題修正

* 障害発生時は障害原因の修正
* パフォーマンス不足の場合は、速度向上策を図る
* OS等のバージョンアップ対応
* 修正についてはサービス仕様に盛り込んだほうがわかりやすい

みたいな感じでテンプレ化
【Ruby】map関数をマスターして、素敵な競技プログラミング生活を

Rubyに入門して５ヶ月が経ちました。
そこでまず[atCoder](http://atcoder.jp/)というサイトでひたすら競技プログラミングの問題を解いて、Rubyの素振りをしました。

残念ながら比較的カンタンなA問題とB問題しか消化しなかったのですが、どちらもワンライナーで書けるようになってきたのでメモします。

[ワンライナーとは](http://d.hatena.ne.jp/keyword/%A5%EF%A5%F3%A5%E9%A5%A4%A5%CA%A1%BC)
<sub>※ちなみに、セミコロンを挟んだような擬似的なワンライナーではありません。</sub>

## ワンライナーではないコード

まず、ワンライナーではないコードを示します。

例えば、こんな問題があったとします。

```text
4x4のマス目の盤面があります。
これが標準入力の形で与えられるので、180度反転させて標準出力しなさい。

入力例：
. . . .
. o o .
. x x .
. . . .

解答：
. . . .
. x x .
. o o .
. . . .
```

安直に書いたら、こんなコードになるかもしれません。

```rb
# 空の配列を用意。
table = []

# 入力を４行分受け取り、配列に格納。
4.times do |t|
  table.push gets.chomp
end

# 配列の各要素を反転。
4.times do |t|
  table[t].reverse!
end

# 配列自体を反転。
table = table.reverse!

# 標準出力。
puts table
```

あるいは、もう少しシンプルに書くとこうなるかもしれません。

```rb
table = []

4.times do |t|
  table << gets.chomp.reverse
end
puts table.reverse
```

## ワンライナーのコード
さて、上記のメソッドをワンライナー化していきます。
ポイントは__コレクション系のメソッド__を使うことです。mapかreduceがいいのですが、今回の例ではmapを使います。

[mapなどの配列の値を操作するメソッドまとめ](http://qiita.com/shibukk/items/d985d014de598d925b8b)

さて、mapを使ったコードがこちらになります。

```rb
puts (0..3).to_a.map{gets.chomp.reverse}.reverse
```

以下、説明をします。

### 範囲（Range）クラス

まず、範囲クラスのインスタンスを作ります。

```rb
(0..3) # 範囲クラスをインスタンス化
```

[Ruby 1.9.3 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Rangeクラス](http://docs.ruby-lang.org/ja/1.9.3/class/Range.html)

範囲を使うのは、後述するようにmapを使うためです。

### 範囲の配列化

次に範囲を配列化します。

```rb
(0..3).to_a # [0, 1, 2, 3]
```

ちなみに、配列の要素はなんでも構いません。
結局配列化するなら、以下の方法でもいいかもしれません。

```rb
Array.new(4) # [nil, nil, nil, nil]
```
[http://ref.xaio.jp/ruby/classes/array/new](http://ref.xaio.jp/ruby/classes/array/new)


今回の例では、盤面は4x4と決まっていましたが、ひょっとしたら5x5の場合もあるかもしれません。その場合は、以下のようにして配列を作成します。

```rb
(0..gets.to_i).to_i 
# 盤の列数が標準入力で与えられるとする。
```

#### 追記

コメントをいただきました。
Rangeの配列化は、to_aではなく以下のようにも実現できるようです。

```rb
(*0..3) # [0, 1, 2]
```

また、RangeはEnumerableを実装しているので、Enumerableの持つメソッドを使うことができます。

```rb
(0..3).map() # 配列化は不要
```

### map関数で処理を行う

ここでようやくmapの登場です。

```rb
(0..3).to_a.map{ # ここに処理 }
```
[0, 1, 2, 3]という要素に対してそれぞれ、処理内容を実行します。なので、４回の処理が行われることになります。

今回の処理は、１行の入力を受けて反転させることです。

```rb
(0..3).to_a.map{gets.chomp.reverse}
```

map関数のポイントとして、map関数は新しく配列を作成して返す、というものがあります。
つまり、以下のコードのような挙動になります。

```rb
nums = [1, 2, 3, 4]
nums.map{|a| a * 2} # [2, 4, 6, 8]
```
上記では、４回ループが回ります。そして、その度にaにnumsの各要素が入り、aに対してa * 2が行われます。その結果を格納した配列が、最終的に返されるのです。

なので、以下のコードは、

```rb
(0..3).to_a.map{gets.chomp.reverse}
```
４回の標準入力をそれぞれ反転させた結果、それらを格納された配列を返します。

そして、その配列に対して、reverseをかけることで、最終的に180度回転したように出力することができます。

```rb
puts (0..3).to_a.map{gets.chomp.reverse}.reverse
```

## 何が嬉しいのか

ワンライナーで書くと何が嬉しいのでしょうか。
まず、頭を使います。if文やfor文をゴリゴリ書いても正解なのですが、頭を使ったほうが楽しいです！
肝となるmapやreduceの内容をどう書けばいいのか。それを考える時間は楽しいです。さらに、mapやreduceに持ち込むにはどうすればいいのか、というフェーズもあります。

また、mapはreduceは関数型チックであります。
ある配列を参考にして、新しい配列を返す、というのは__イミュータブル__で良いです。
イミュータブルに関しては、以下の記事がわかりや分かりやすかったです。

[Immutableの利便性、大きなメリットについて。](http://panda-noir.hatenablog.jp/entry/2015/10/18/191106)

というわけで、mapやreduceを使いうこなせば、ちょっと賢いエンジニアになれるかもしれません。


## 注意

リーダブルコードにあるように、短いコードと良いコードはイコールではありません。
ワンライナーはエレガントで面白いものですが、この記事では実務で書くことを推奨するわけではありません。

また、筆者はRuby初心者です。
文中に誤りがあったり、より良いコードの書き方があればぜひご指摘下さると嬉しいです。


では、素敵な競技プログラミングライフを~!!
jq コマンドで gzip 圧縮された JSON ファイルを引数に取る（シェルスクリプト）

こんにちは。
jq コマンドで gzip 圧縮された JSON ファイルを引数に取って読み込めると楽かなと思ってシェルスクリプトを書いてみました[^1]。

[^1]: なお、[stedolan/jq](https://github.com/stedolan/jq) 内に同様な議論を見つけました："[Accept gzip compressed files](https://github.com/stedolan/jq/issues/968)" (issue #968)

```console
$ ./jq.sh -C '.' geojson.json.gz | less -R
{
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [125.6, 10.1]
  },
  "properties": {
    "name": "Dinagat Islands"
  }
}
$
```

```jq.sh
#!/bin/sh
argarray=()

for ARG in "$@"
do
  case "$ARG" in
    *json.gz)
      if [[ -z "$tempdir" ]]; then
          tempdir=$(mktemp -d "${TMPDIR:-/tmp}"/foo.XXXXXXXXX)
      fi
      tempstr=$(env LC_CTYPE=C tr -dc "a-zA-Z0-9" < /dev/urandom | head -c 9)
      a=$tempdir/$tempstr.json
      gzip -dc "$ARG" > $a 2>/dev/null
      ;;
    * )  a="$ARG" ;;
  esac
  argarray+=( "$a" )  
done

jq $(IFS=' '; echo "${argarray[*]}")
if [[ -n "$tempdir" ]]; then
  rm -rf $tempdir
fi

exit $?
```
GitHub のプライベートリポジトリへの貢献で草が生えない問題を解決する

# はじめに

みなさん、GitHub に草を生やしていますか。

それ自体が絶対的な尺度ではないとはいえ、GitHub の芝生が緑で埋まっている人を見ると、多少は「がんばっている人なんだなあ」という印象を抱くのではないでしょうか。

# 草が生えない問題

ところで、毎日のように commit していても、芝生が緑にならない人たちもいます。それは、**プライベートリポジトリにばかり貢献している人**です。

当然といえば当然ですが、プライベートリポジトリへの貢献は、そのリポジトリが見えない人からは、芝生へは反映されていないように見えます。

なので、会社や研究でプライベートリポジトリを使っているという人は、自分や同僚からは芝生が緑で埋まって見えますが、それ以外の人からは真っ白に見える、という現象が発生していました。

<p>
<figure>
<figurecaption>自分から見た草原</figurecaption>
<img src="https://gyazo.com/dac8f1dc4117dbf616f4218423aa567b.png" alt="自分から見た草原"
</figure>
</p>

<p>
<figure>
<figurecaption>他人から見た草原</figurecaption>
<img src="https://gyazo.com/2c936b44e80e1b76aad33502579a0811.png" alt="他人から見た草原"
</figure>
</p>

# 解決策

あまり知られていませんが、この問題には解決策が存在します。

昨日(執筆日の前日)に追加された、できたてホヤホヤの機能です。

草原の右上にこっそりと存在する「Contributions settings」をクリックし、「Public and private contributions」を選択すると、プライベートリポジトリへの貢献によって生える草が、誰からでも見えるようになるのです。

![](https://gyazo.com/4eb5ff23005a0e2fe0fc2f52452dea8c.png)

なお、プライベートリポジトリへの貢献は、その数のみが公開され、リポジトリ名等が漏れることはありません。

![](https://gyazo.com/fe418aed19424cdae9295580f82ef8ca.png)

# 注意

貢献の数のみとはいえ、プライベートリポジトリの情報が公開されることになりますので、会社等の所属する団体への許可をとってから行うのが無難でしょう。

# 参考

https://github.com/blog/2173-more-contributions-on-your-profile
Rails 5へのアップグレード手順メモ(Rails 4.2.6 => 5.0.0)

## Rubyをアップグレードする

Rails 5にはRuby 2.2.2以上が必要。
これより古いものを使っている場合は、まずRubyのバージョンを上げる必要がある。
具体的なバージョンアップ方法は環境によって異なるので割愛。

Rubyのバージョンは、Gemfileで`ruby`ディレクティブを使ってバージョンを指定するのがおすすめ。

```rb
ruby '2.3.1'
```

## RailsのGemをアップグレードする

Rails 5へのアップグレード前に、Rails 4系の最新のバージョンで動作確認して、DeprecationのWarningやその他の問題が無い状態にすべき。また、十分なテストカバレッジも必要。

準備が完了したら、Gemfileのバージョンを5.0.0に書き換える。

```rb
gem 'rails', '5.0.0'
```

次に、`bundle update`コマンドを実行する。ここでは、Railsのgemだけをアップデートする。

```console
$ bundle update rails
```

## Rails update

以下のコマンドを実行して、Railsの設定ファイル等を更新する。

```console
$ bin/rails app:update
```

`rails rails:update`と書いてある（古い）ドキュメントもある。これでも動くが、DeprecationのWarningが出るので注意。

`rails app:update`を実行すると、conflictが発生した際に確認メッセージが表示される。

大半は上書きしても問題無いものだけど、`config/routes.rb`に定義したルーティングを全て消去したりするので、確認は慎重に。

## ApplicationRecordをActiveRecordのモデルのベースクラスにする

Rails 5のアプリを新規作成すると、ActiveRecordの各モデルは`ApplicationRecord`を継承する。この継承関係は必須ではないが、Rails 5ではこの方式が推奨される。

Rails 4からアップグレードしたアプリケーションでは、`ApplicationRecord`を自分で作る必要がある。

はじめに、`app/models/application_record.rb`を以下の内容で作成する。

```rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end
```

次に、各モデルクラスの継承関係を変更する。たとえば、

```rb
class Product < ActiveRecord::Base
```

は、以下のように変更する。

```rb
class Product < ApplicationRecord
```

## ApplicationJobをActiveJobのクラスのベースクラスにする

ActiveRecordと同様、ActiveJobも継承関係の変更が推奨される。

初めに、`app/jobs/application_job.rb`を以下の内容で作成する。

```rb
class ApplicationJob < ActiveJob::Base
end
```

次に、ActiveJobの各クラスのスーパークラスを、`ActiveJob::Base`から`ApplicationJob`に変更する。

## コールバックチェーンの変更点

Rails 5ではコールバックチェーンの挙動が変わっている。

Rails 5では、コールバックチェーンを止めるには、明示的に`throw(:abort)`を呼ぶことが推奨される。一方、以前のバージョンのRailsでは、コールバックメソッド内で`false`を返せばコールバックチェーンを止めることができた。

Rails 4から5にアップグレードすると、コールバックチェーンは従来と同じように動作するが、DeprecationのWarningが出力されるようになる。ソースコードを修正し、アプリケーションが新しいコールバックチェーンの挙動で動作できるようになったら、Initializerの中で以下のメソッド呼び出しを行うことで、新しい挙動を有効化して、Warningを止めることができる。

```rb
ActiveSupport.halt_callback_chains_on_return_false = false
```

## テストの実行

この段階で、定型的なアップグレード手順は終了。あとは、テストを実行して、発生したErrorやWarningを1つずつ潰していく。
.append()する前の要素の幅や高さを取得する

jQueryの仕様上、DOMはHTMLで表示されているものでないと幅や高さなどが取れないようです。

したがって、`.append()``.appendTo()`などでDOMを挿入する前に要素の高さを取得しても0になります。ﾅﾝﾃｺｯﾀ

```js:test.js

let $obj = $('<h1></h1>');
$obj.text('こんばんは！');

// ここで高さをとっても0
console.log($obj.height());

$obj.appendTo($('body'));

```

## 取得方法

高さなどを取りたいときは、挿入する要素(例だと`$obj`)に対し`.ready()`で要素が反映された後に処理をすると書くのがスマートそうでした。

```js:test.js

let $obj = $('<h1></h1>');

$obj.text('こんばんは！');

// ここで高さをとっても0
console.log($obj.height());

$obj.appendTo($('body'));

$obj.ready( () => {
  // ここでなら高さが取れる！
  console.log($obj.height());
});


```


## 取得例
<img width="447" alt="取得例" src="https://qiita-image-store.s3.amazonaws.com/0/125742/9fa4002f-ebd3-e983-50de-f27613682492.png">


## 余談

chromeの開発者ツールで実行したらjQueryがちゃんと動いて「こんばんは！」が怖い事になってたw
<img width="640" alt="スクリーンショット 2016-05-21 0.01.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/125742/37f66ed0-8e33-e6e5-cca6-671ac6f886b6.png">
Rainloop を構築

#下準備
## 必要なアプリケーション Apache, PHP and MySQL
```
# yum install httpd
# yum install mysql mysql-server
# yum install php php-mysql php-xml pcre php-common curl 
# service httpd start
# service mysqld start
```
#Rainloop をDL →　展開
```
# mkdir /var/www/html/rainloop		
# cd /var/www/html/rainloop
# wget http://repository.rainloop.net/v1/rainloop-1.6.3.715-f96ed936916b7f3d9039819323c591b9.zip
# unzip rainloop-1.6.3.715-f96ed936916b7f3d9039819323c591b9.zip
# rm rainloop-*.zip
```

```
# pwd 
/var/www/html/rainloop
# find . -type d -exec chmod 755 {} \;
# find . -type f -exec chmod 644 {} \;
# cd /var/www/
# chown -R apache:apache rainloop
```
Excelのグラフを、上から位置順にマクロで処理するための準備

VBAでシートの複数のグラフを、
For eachなどで順番に処理する際、
グラフが上から順番に処理されない場合があります。

これはグラフが、indexプロパティの順番どおりに配置されていないと
発生します。

そこで、グラフをindex順ではなく、左上から右下に向かって
処理されるように、
グラフの位置でソートして
配列にindexを格納して見ました。

この配列（コードではgArray）を先頭から処理すれば、
ちゃんとレイアウト通りにグラフが処理されます。

	'グラフの順番を取得する。（グラフのindexが位置どおりになっていないことがある）
	Sub ChartSort()
	    Dim gCnt As Integer
	    Dim gArray()
	    
	    'グラフの行・列・インデックスを取得する。
	    For Each mychart In ActiveSheet.ChartObjects
	        gCnt = gCnt + 1
	        ReDim Preserve gArray(2, gCnt - 1)
	        gArray(0, gCnt - 1) = mychart.Index
	        gArray(1, gCnt - 1) = mychart.TopLeftCell.Row
	        gArray(2, gCnt - 1) = mychart.TopLeftCell.Column
	    Next

	    '検証
	    Debug.Print "ソート前======================================="
	    For i = 0 To gCnt - 1
	        Debug.Print gArray(0, i), gArray(1, i), gArray(2, i)
	    Next

	    '行・列の値でバブルソートする。（小さい順に並べる）
	    For i = 0 To gCnt - 1
	        For j = gCnt - 1 To i Step -1
	            '行が小さいか、行が一緒で列が小さい場合に、
	            '小さい方を先頭に持ってくる。
	            If gArray(1, i) > gArray(1, j) Or _
	                gArray(1, i) = gArray(1, j) And gArray(2, i) > gArray(2, j) Then
	                
	                hoge0 = gArray(0, i)
	                hoge1 = gArray(1, i)
	                hoge2 = gArray(2, i)
	                
	                gArray(0, i) = gArray(0, j)
	                gArray(1, i) = gArray(1, j)
	                gArray(2, i) = gArray(2, j)
	                
	                gArray(0, j) = hoge0
	                gArray(1, j) = hoge1
	                gArray(2, j) = hoge2
	                
	            End If
	        Next
	    Next
	    
	    '検証
	    Debug.Print "ソート後======================================="
	    For i = 0 To gCnt - 1
	        Debug.Print gArray(0, i), gArray(1, i), gArray(2, i)
	    Next
	    
	End Sub
初めてPushする時に.git/objectsがアップロード制限を超えた時の対処法

#初めてPushする際に、Gitのアップロード容量の制限（100MB）に引っかかりました。
不要なファイルを整理してPushするも上手くいかず。。。
どうやら、.git/objectsが容量オーバーしているようでした。

やったこと
**①[git gc](https://git-scm.com/book/ja/v1/Git%E3%81%AE%E5%86%85%E5%81%B4-%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AA%E3%82%AB%E3%83%90%E3%83%AA#メインテナンス)**
.git/objectsの中身をpackにまとめてくれます。
結果：ファイルは１つになったけど、容量はほとんど変わらなかったです。

**➁git reset --soft HEAD^**
コミットが無かったことになれば、.git/objects（変更履歴）も軽くなるのではと思い試しました。
今回は整理した状態のままにしたかったので、--softでresetしました。
結果：600以上あったオブジェクトファイルが約200にまで減って、Push出来ました。

Pushはこまめにするのが大事ですね。。。

重いファイルが特定されている場合は[filter-branch](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E6%AD%B4%E5%8F%B2%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88#最強のオプション:-filter-branch)を使うみたいです。