OmniAICreator/Qiita-1.07M huggingface dataset:
ターミナルとvimをカッコ良くする

# ターミナル周りの設定

ターミナルをかっこよくすることがモチベに繋がると思い、いろいろやってみました。



## ターミナルにSolarized(色)



Solarizedはとても人気の配色です。これにしておけば、コイツ分かってるな感が出ます（？）。



まずはgithubで公開されているデータをダウンロード。ターミナルで以下のコマンドを入力。

```
$ git clone https://github.com/tomislav/osx-terminal.app-colors-solarized
```

($はプロンプト)



その後ターミナルの環境設定で左下の+-の横の歯車マークを押すと、以下の画像のようになります。

![スクリーンショット 0029-09-07 20.31.49](https://drive.google.com/uc?export=view&id=0B4rx4mxoPiX1U2Q3Q25QaG9QYzA)



この赤丸をクリック



![スクリーンショット 0029-09-07 20.32.20](https://drive.google.com/uc?export=view&id=0B4rx4mxoPiX1ODJxWFBBeVRBZlU)



両方開きましょう。



するとデフォルトでいろんな色設定が置いてある並びに、「Solarized ~~~」がありますね。

あとは気に入った色をデフォルトにして、色設定は終わりです。





## ターミナルのフォント



Ricty Diminishedというプログラミング用のフォントと名高い（？）やつにしましょう。コイツ分かってるな感が出ます（？）。



まずは以下のページの「バージョン」から好きなバージョンをクリックしてダウンロード。

http://www.rs.tus.ac.jp/yyusa/ricty_diminished.html



ファイルを解凍して、ttfファイルをクリックしてインストール。



あとはまたターミナルの環境設定->フォントでRicty Diminishedを選べばok



簡単ですね。





## vimの色設定(~~+NeoBundle~~ +dein)

vimの色もSolarizedにしないとちぐはぐですからね（まあデフォルトでも良さそうだけど…）。



まずはNeoBundleというvimのプラグイン管理ツールをインストール

```
# 配置先のディレクトリを作成
$ mkdir -p ~/.vim/bundle
# NeoBundleをリポジトリから取得
$ git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
```

（今ではdeinとかいうツールのがおすすめらしい...）



やっぱりdeinに切り替える。

```
$ mkdir -p ~/.vim/dein/repos/github.com/Shougo/dein.vim
$ git clone https://github.com/Shougo/dein.vim.git \ ~/.vim/dein/repos/github.com/Shougo/dein.vim
```



~/.vimrcに

```
"dein
if &compatible
  set nocompatible
endif
set runtimepath+=~/.vim/dein/repos/github.com/Shougo/dein.vim

call dein#begin(expand('~/.vim/dein'))

call dein#add('Shougo/dein.vim')
call dein#add('Shougo/vimproc.vim', {'build': 'make'})

call dein#add('Shougo/neocomplete.vim')
call dein#add('Shougo/neomru.vim')
call dein#add('Shougo/neosnippet')

  " solarized
  call dein#add ('altercation/vim-colors-solarized')
  " mustang
  call dein#add ('croaker/mustang-vim')
  " jellybeans
  call dein#add ('nanotech/jellybeans.vim')
  " molokai
  call dein#add ('tomasr/molokai')

  call dein#add ('Shougo/unite.vim')
  call dein#add ('ujihisa/unite-colorscheme')


  " Install vim-clang
  call dein#add ('justmao945/vim-clang')
  " set clang options for vim-clang
  let g:clang_c_options = '-std=c11'
  let g:clang_cpp_options = '-std=c++1z -stdlib=libc++ --pedantic-errors'


call dein#end()
```



と記述して(よく分かってないのもある)vimを再起動し、

```
:call dein#install()
```

コマンドを実行すると、

call dein#add で指定したパッケージがインストールされる。

```
call dein#add ('altercation/vim-colors-solarized')
```

他の色やclangとかも消すのが面倒で残っていますが、実際にsolarizedに関係するのはこの行。（他のaddの行は無くてもいい、それ以外は消しちゃダメ？）



インストール完了したら、.vimrcに

```
syntax enable
set background=dark
colorscheme solarized
let g:solarized_termcolors=256
```

と書いて再起動すれば、無事vimもsolarized darkになる。backgroundをlightにすれば、おそらくSolarized lightに。



## 参考にしたもの

[Ricty Diminished フォントが超絶いい！！](http://qiita.com/murachi1208/items/513ffa243a879ee250f2)

[Mac Terminal のカラー設定をSolarized にする](http://qiita.com/Humangas/items/848f0318dfc3c6f5b8e2)

[NeoBundleを用いたVimプラグイン管理と色設定メモ](http://qiita.com/muran001/items/3080c4816b7c2e65e40b)

[dein.vimを使ってみる](http://qiita.com/yoza/items/2f8bd33a18225754f346)
redux-formのajax通信エラーをUI上に表示する方法

シンプルな原因だったけど、意外とドハマリしたのでメモ。
ポイントは `handleSubmit()` の引数として渡す関数にちゃんとajax通信のPromiseを返り値として返すこと。

```FormComponent.js
import React from 'react'
import { connect } from 'react-redux'
import { reduxForm, Field, SubmissionError } from 'redux-form'
import axios from 'axios'

class FormComponent extends React.Component {
  render() {
    return (
      <form onSubmit={this.props.handleSubmit(::this.handleSubmit)}>
        <Field
          name="pass"
          component={this.renderInput}
        />
      </form>
    )
  }
  renderInput({ input, meta:{ touched, error } }) {
    return (
      <div>
        <input
          {...input}
          type="text"
          placeholder="Password"
        />
        <div>
          {(touched && error) ? error : null}
        </div>
      </div>
    )
  }
  handleSubmit(formData) {
    // ↓ここで必ずreturnする！！（Promiseを返す）
    return axios.post('http://hogehoge.com/user', formData)
      .then(()=>{
        console.log('通信成功')
        // こっち側でエラーを返すこともできる
        // throw new SubmissionError({'pass': '成功したけどエラーです'})
      })
      .catch(()=>{
        // 下記'pass'の部分は任意のフォームのnameを入れる
        throw new SubmissionError({'pass': 'パスワードが違います'})
      })
  }
}

FormComponent = reduxForm({
  form: 'auth',
  validate: (formData, props)=>{
    const errors = {}
    if ( !_.size(formData.pass) ) {
      errors.pass = '未入力です'
    }
    return errors
  }
})(FormComponent)

export default FormComponent(
  (state)=>({
    initialValues: {
      pass: ''
    }
  })
)(FormComponent)
```
redirect_to(引数）について

### 軽く自己紹介
　大学一年生で現在rails tutorailをやっており、復習も兼ねて、理解がうまくできていないところを中心にまとめていく。自分も同様、rails初心者向けの記事となる。

２年前の記事ですが、別の方が書いているのがあるのでこの記事で理解できなければみてください。（参考にしている部分、結構あります）
http://qiita.com/kanpe777/items/c5154b58c852855deefc

## そもそも引数とは。
ググると　『数学における関数やコンピュータプログラムにおける手続きにおいて、その外部と値をやりとりするための特別な変数、あるいはその変数の値のことである。』と書いてあります。

## redirect（リダイレクト）とは。
指定したウェブページから自動的に他のウェブページに転送されること。
### 典型的な例
```ruby:users_controller.rb
redirect_to root_url

redirect_to action: 'index'
```

今までの話通り、その一文によって、actionを起こした時にroot_url, indexのページに飛ばされます。
##@userの場合は？
rails tutorialでは何度も

```ruby:users_controller.rb
redirect_to @user
```
と出てきます。@userとはどこに飛ばされるのでしょうか。
その前にtutorial上では

```ruby:users_controller.rb
redirect_to user_url(@user)
```
と同じ意味だと書かれています。
この２つの意味についてtutorial上では全く記載がありません。
**userなのだからidとか指定しなくてええの？**と自分は疑問に思いました。

調べていくと、

```ruby:users_controller.rb
redirect_to "/users/#{@user.id}"
```
を簡略化したものだということがわかりました。
*redirect_toでPOSTはできないことに関してはまた別の記事にまとめたいと考えています。

## redirect_back_or(default)とは。
簡単にいうと先ほどのredirect_toに条件をつけてあげることです。
ユーザが居た場所を覚えていればその場所に、無ければデフォルトに飛ばす、みたいな感じで使うことができます。

```ruby:users_controller.rb
def redirect_back_or(default)
    redirect_to(session[:return_to] || default)
    session.delete(:return_to)
  end
```
Unityを起動すると machine identification is invalid for current license. と表示される

初投稿の為、色々お察しいただけますと幸いです。

タイトルの通りUnityを起動したら　machine identification is invalid for current license.　というメッセージが表示され作業が開始できなくなりました。

環境は以下の通り
windows10 / Unity 2017.1.0f3 


「ライセンスファイル( Unity_liculf )を一旦削除して、再度設定をする」と復旧するという記事を見つけたので試してみました。
https://teratail.com/questions/88400

通常ライセンスファイルは、以下のディレクトリに保存されているとの事。
Mac: /Library/Application Support/Unity
Windows: C:\ProgramData\Unity


私はwindowsの為、

C:\ProgramData\Unity　をエクスプローラーのアドレスバーに打ち込んで　Enter
(そう言えばリターンキーという呼び方はいつから廃れたのでしょうw)


ライセンスファイル( Unity_liculf )を一旦ゴミ箱にpoiします。

再度Unityを起動します。


いつものUIが表示されたら解決！
RailsでbootstrapのHome画面サムネイルPartial

前回の[RailsでBootstrapのスライドショーPartial](http://qiita.com/yushimizu/items/679064b8e97413441367)に引き続き、サムネイルも作ってみたのでメモ。
アイコン画像は[icooon-mono](http://icooon-mono.com/)の64pxを使用。

<img width="1000" alt="スクリーンショット 2017-09-08 14.38.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/107187/3f6e6812-bf27-9620-edd8-cf8e42969195.png">


```erb:home.html.erb
<%= render 'home_thumbnail', thumbnails: [ { title: 'いつでも', image: 'clock.png', caption: 'いつでも' },
  { title: 'どこでも', image: 'place.png', caption: 'どこでも' }, 
  { title: '全員で', image: 'meeting.png', caption: '全員で' } ] %>
```

3つなので幅は４を指定

```erb:_home_thumbnail.html.erb
<div class="container">
    <div class="row">
        <% thumbnails.each do |t| %>
            <div class="col-md-4">
                <div class="thumbnail">
                    <%= image_tag(t[:image], :alt => t[:image]) %>
                    <div class="caption">
                        <h3><%= t[:title] %></h3>
                        <p><%= t[:caption] %></p>
                    </div>
                </div>
            </div>
        <% end %>
    </div>
</div>
```

```scss:home.scss
.thumbnail{
  .caption {
    text-align: center;
  }
}
```
SmartGit > contact information

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
```

SmartGitに関してUI周りの不具合を見つけた。
連絡先は以下に記載されている。

http://www.syntevo.com/contact/

- UserEcho forum
    - ideas (新機能、改良)
- Mailing Lists
    - 問題、質問、議論
- Paid Support
    - メール
    
ライセンス料を払っているのでPaid Supportも利用可能。

不具合対応を検討してもらえるのはどれだろうか。

UserEchoだと`Completed`のように処理の対応状況が把握できる ([例1](http://smartgit.userecho.com/topics/584-browse-file-from-branch/), [例2](http://smartgit.userecho.com/topics/565-in-commit-dialog-when-using-ctrlspace-to-complete-filename-tab-should-accept-the-selected-completion/))。
メールだとメールソフトで履歴を追うことになる。

UserEchoでは、投稿した内容を編集する機能はないようだ。
FileMaker // 受注番号の連番の発行が

### 今何をしているのか
受注コールセンターのマネジメントで入社したはずが、さすがはベンチャー。コールセンターのシステムがない（ビジネスフォンとExcel＋マクロでなんとかやってたけどもう限界）という状況でありましたので、コールセンターの品質向上以前に受注システムの構築を手がけています。
最初Excel+VBAで2ヶ月位でなんとか...みたいな話だったのですが、それは無理というところで、以前構築に失敗したFileMakerを使った再構築に挑戦しています（GUNHEDをまた動かすブルックリンみたいな気分）。FileMakerでの一からの構築も、一人開発も初めてなので、ここで備忘録をつけていきたいと思います

# 受注番号を入力したい
最初の課題がこれ。受注IDなんてUUIDでじどうで割り振るか、12桁くらいの連番つけときゃいいんじゃねえのと思っていたのですが、「その日ごとに連番で受注番号を割り当てたいです」とのオーダー。「その日の件数を知りたいから」という理由はさておき、Op間でもわかりやすい番号で確認し合えるのはいいことだろうと思ったので作ってみます

###シリアルを埋めるだけなら簡単だ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181254/4381da04-83ba-ccd5-b4ca-4c11f302e0d4.png)

シリアル番号の割当は超簡単。フィールドのオプションでシリアル番号にチェックすればOK。
「次の値」に接頭辞をつければそのまま反映されるのも良い感じです。さすがFileMaker。ノンプログラミングでDBが構築できると喧伝するだけのことはある。ちょろいぜ。と思ったのもつかの間。

***日付はどう入れる？***

結局スクリプトを書かないといけない様子。それぞれ別のフィールドの値にして合体させる手も考えたのですが、とりあえず書いてみた

```Filemaker:OrderNumberVer1
Year(Get(日付)) & Right("0" & Month(Get(日付));2) & Right("0" & Day(Get(日付));2) & Right("000" & SerialIncrement ( Get ( レコード番号 ) ; 1 );4)
```

なんとなくいい感じに見えたのですが、`get(レコード番号)`(日本語とアルファベットの混在は書きにくいな)としてしまっているため、日付に関係なくシリアル番号は加算されてしまいます

どうしたらいいんだ？というところで今日はここまで
TypeScript Style Guideまとめ

# TypeScript Style Guides
- [GitHub \- google/ts\-style: TypeScript style guide, formatter, and linter\.](https://github.com/google/ts-style)
  - Google Node.jsチームのスタイルガイド
  - [Google Style Guides \| styleguide](https://google.github.io/styleguide/) にはTypeScript版が追加されてない。Google社内の標準言語としてTypeScriptが承認されたのに。
- [Coding guidelines · Microsoft/TypeScript Wiki · GitHub]
(https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines)
  - "Use 4 spaces per indentation"にウッとなりますね
- [Angular \- Style Guide](https://angular.io/guide/styleguide)
  - ちょっと読みづらい 
- [StyleGuide · TypeScript Deep Dive](https://basarat.gitbooks.io/typescript/content/docs/styleguide/styleguide.html)
- [GitHub \- Platypi/style\_typescript: This is the TypeScript style guide that we use internally at Platypi](https://github.com/Platypi/style_typescript)

# Linter
- [TSLint](https://palantir.github.io/tslint/)
Room Persistent Library + RxJava

# Roomとは？

Googleが今年の春頃に発表した[Android Architecture Components](https://developer.android.com/topic/libraries/architecture/index.html)に含まれている、ORM（永続化、オブジェクトマッピング）ライブラリです。

<img width="474" alt="desktoproom-2x.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/20734/034017d5-25c8-563a-4e47-52254845c361.jpeg">

# Roomの良さげなところ

- 構成がDDDっぽい
    - Entity/Dao/Databaseという3つのレイヤー構成になっていて、若干DDDぽさがあります
- Daoにクエリをかける
    - Daoの部分はアノテーションにクエリを書いて諸々CRUD処理を行えます
    - MyBatisっぽさを僕は感じました
- メソッドの結果としてFlowableを返せる
    - RxJavaと自然に連携させられます

```java
@Query("SELECT * FROM connpass_feed_item")
Flowable<List<ConnpassFeedItem>> getAll();

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(ConnpassFeedItem... items);
```

# サンプル
RxJava/Room両方を組み合わせたサンプルプロジェクトを置いておきますね。Entity/DaoをJavaで書いてますが、一応kotlinでもかけるようです（ただ、AnnotationProcessorを使うので少しはまりやすいという情報が）

https://github.com/mk2/MyRoomSample

# 感想

RxJavaと組み合わせていい感じに使えるSQLiteラッパーを探していたのですが、Roomがあまりにドンピシャで求めていたもので過ぎて興奮しすぎたので一度記事を書いてクールダウンしようと思い投稿しました。

まだalpha版という立ち位置らしいですが、おそらくRxJavaと組み合わせていく定番ライブラリになるのではないかと思ってます。
AWSのEC2で簡単なWebVRを作る

#AWSのEC2で簡単なWebVRを作る
##EC2でWebVRを作ってみました
AWSのEC2と↓のサンプルコードを使用してWebVRが作れます。
[Chrome Experiments for Virtual Reality]
https://vr.chromeexperiments.com/
（VRを体験するには別途Cardboardが必要です）

## 1. AWSのEC2インスタンスを作成
他のページを参考にしてくださいm(_ _)m
↓が参考になります
[AWS EC2でWebサーバーを構築してみる]
http://qiita.com/Arashi/items/629aaed33401b8f2265c

## 2. EC2インスタンス内にApacheをインストール
Apacheのインストール
`sudo yum install httpd`
## 3. サンプルコードをダウンロード
wgetが入っていなければ、yumでwgetをインストール

↓のサンプルをwgetで落としてきます。
https://vr.chromeexperiments.com/

`sudo wget http://vr.chromeexperiments.com/cardboard.zip`

cardboard.zipを解凍
解凍した中身を/var/www/html/以下へ
※要DocumentRootチェック

## 4. EC2の設定
EC2インスタンスのEBSボリュームの設定で80番ポート(HTTP)を開けます。

## 5. Apacheの起動
apacheを起動します。

`sudo service httpd start`

## 6. スマートフォンのブラウザからページを開く
EC2インスタンスのパブリックIPを確認して、スマートフォンのChromeからアクセスします。

# 7. 完成！
スマートフォンにCardboardを装着して楽しんでください！

# 8. もっと楽しみたい！
↓にthree.jsのモデルのサンプルコードがあるので、組み込んでみても良いかもしれません。(未検証)
[three.js]
https://threejs.org/
KUSANAGIでキャッシュをオンにしたらJSON parseerror が出た件

KUSANAGIでキャッシュ（bcache）をオンにしたらその影響でJSONの値が上手く出力できなかったのでメモ。

##今回発生した問題/原因
React(Ajax)を利用してユーザー情報をJSON形式で出力しようとした所、

```
index.js:502 undefined "parsererror" "SyntaxError: Unexpected token < in JSON at position
```
と出てしまいうまく出力できなかった。

原因はbcacheをオンにしたことでHTML形式のコメントが挿入されたためでした。

##bcache onのときのJSON
```
[{"name":"username","img":"ex.jpg","url":"https:\/\/ex.com\/}]
<!-- page cached by KUSANAGI. Cache created : 02:50:21(GMT). Expire : 08:50:21(GMT). -->
<!-- CacheID : 678b83dc8f56969d0211179f589ad539 -->

```
上記の様に1行目のJSONレスポンスに付随して2,3行目にHTML形式のコメントが挿入されます。

###KUSANAGIの環境
KUSANAGI Version 8.0.7-2
WORDPRESS
aws
MVVMを勉強するときに参考になった 概要まとめ & アンチパターン & リンク集


# MVVMについて勉強したことのまとめ

今更ながら、MVVMな開発をお仕事で行なっています。
全然理解できていないので、色々と調べつつメモを残していきます。

また、こんな実装はMVVMじゃない？ってきなことも今後の反面教師になるように記載してみました。


## MVVM

* プログラムを3つの要素、Model、View、ViewModel に分割
* 各要素は、単方向に依存している View -> ViewModel -> Model
* MVVMは、あくまでUI周り構成について触れているだけであって、Modelの中身については、各自で考える必要がある
 
## View

* ViewModelの情報を使用してUIを描画 = binding
* ViewModelにアクションを送信 = commands
 
## ViewModel
 
* UIに描画するのに必要な情報を準備、保持 = Modelを保持？
* Viewから送られたアクションをModelに通知
* Modelから、UIの描画に必要な情報に変換保持

## Model

* ViewとViewModelがやること以外全て受け持つ
* つまり、データ本体、加工、取得、保存などは、VMで行わず全てMdoelが受け持つ
 
## こんな実装はMVVMじゃない？

### Viewの場合
* ViewがVMのプロパティを直接操作している
* ViewがアクションをVMに送るときに、コールバッグ(blockやobservable)を実行する
* ViewがViewModelから受け取る描画内容変更処理内で、新たにVMの操作をしている
* View内でViewModelを差し替えることができない
  また、ViewModelを差し替えたときにUIが元の状態に戻らない
* DataBindingを使ってない
　DataBindingを使わないと、MVPのPresenterをViewModelと言っているだけな気がしてます。
 
### ViewModelの場合
* ViewModelがModelのプロパティを直接操作している。なるべく、アクションとして通知、操作する
* Viewを知っている
* ViewModel内でModelを差し替えることができない
  また、Modelを差し替えたときにUIが元の状態に戻らない
* Modelの情報をViewに通知する以外の機能を実装している = ビジネスロジックが実装されている
 
### Modelの場合
* View・ViewModelを知っている

 
## MVVMと一緒に紹介されるVIPERについて(主にiOS用)

VIPERは、以下の頭文字から命名されていて

 * View
 * Interactorinteractor(Model)
 * Presenter
 * Entity
 * Rotuer
 
Entity以外は全てProtocolに準拠して実装するので、全体的に疎結合にできるアーキのようです。
Clean ArchitectureをiOSに適用したものって感じのようです。

MVPの不明瞭な画面遷移周り規約がある感じのアーキテクチャですが、
Presenter <=> View 部分に、DataBindingを用いることで、MVVMにも使用できると思います。


# MVVMについて参考になったorなりそうなリンク集

## Wikipedia
* [Wikipedia - Model View ViewModel](https://ja.wikipedia.org/wiki/Model_View_ViewModel)

## 記事
* [MVVMパターンの常識 ― 「M」「V」「VM」の役割とは？](http://www.atmarkit.co.jp/fdotnet/chushin/greatblogentry_02/greatblogentry_02_01.html)
 
## 技術ブログ
* [かずきのBlog@hatena(MVVM)](http://blog.okazuki.jp/archive/category/MVVM)
* [Comparing MVVM and Viper architectures: When to use one or the other](https://auth0.com/blog/compare-mvvm-and-viper-architectures/)


## スライド
* [健康的なMVVM 書いてますか？ ~MVVMアンチパターン集~](http://sssslide.com/speakerdeck.com/takasek/jian-kang-de-namvvm-shu-itemasuka-mvvmantipatanji)
* [MVVMって何？　というか…MV○丸ごと、何？](http://sssslide.com/speakerdeck.com/takasek/mvvmtutehe-toiuka-dot-dot-dot-mv-wan-goto-he)
* [iOSアプリのアーキテクチャについて考える](http://sssslide.com/speakerdeck.com/yusuga/iosapurifalseakitekutiyanituitekao-eru)

## iOS実装例など
* [sergdort/CleanArchitectureRxSwift](https://github.com/sergdort/CleanArchitectureRxSwift)
* [realm - RxSwiftによるMVVMパターン](https://academy.realm.io/jp/posts/slug-max-alexander-mvvm-rxswift/)
* [MVVMをベースに複雑な振る舞いをしっかり把握できるアプリ開発](http://qiita.com/susieyy/items/2af5321b287b8d2f49f6)
* [MVVM, Protocols, and Operations in Swift](http://parveenkaler.com/posts/swift-mvvm-protocols-operations)
PHP5.3から5.6へのバージョンアップでつまづいたこと

CentOS6.4でphp5.3からphp5.6へアップデートした時につまづいたところをメモ。

#知っておくこと

phpをアンインストールしても、起動中のPHPは動く。
apacheを再起動した時に最新版が反映される。

/etc/php.iniをバックアップでとっておく
（後で新しいバージョンのPHPの設定を書き換えるため）

#事前にリポジトリを用意

EPEL,remiリポジトリ最新版を入れておく

```
yum install epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

#GDライブラリエラーにそなえて
私の環境ではGDライブラリをインストールしようとすると、libwebp.so.5()(64bit)が必要というエラーがでてうまくできませんでした。ググるとこのエラーは多いようです。ですので、もしlibwebpが入ってなければ事前にインストール。

```
yum install libwebp
```

がダメなら直接入れる。

```
rpm -ivh ftp://mirror.switch.ch/pool/4/mirror/epel/6/x86_64/libwebp-0.4.3-3.el6.x86_64.rpm
```

#PHPを削除

```
yum remove php*
```

#PHP5.6をインストール

```
yum install --enablerepo=remi,remi-php56,epel php php-cli php-common php-devel php-mbstring php-pdo php-gd php-mysql php-mcrypt php-xml php-pear php-soap php-pecl-apcu php-mysqlnd
```

apacheを再起動して完了

```
/etc/rc.d/init.d/httpd restart
```

#MySQLに接続できないエラー
MySQLユーザーが古い16バイトのパスワードフォーマットであることが原因。

my.cnfの`old_passwords=0`にするか削除

そして

```
set password for 'ユーザ名'@'ホスト' = password('パスワード');
```

で設定しなおして解決

#SOAPのエラー
「could not connect to host」というエラーが...

[PHP 5.6.x における OpenSSL 関連の変更](http://php.net/manual/ja/migration56.openssl.php)

ひとまず、動かすには以下のようにcontextをつける

```php:sample.php
$context = stream_context_create([
    'ssl' => [
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    ]
]);

$opt = array(
    'trace' => 1,
    'location' => $url, 
    'stream_context' => $context
);
```
ディープラーニングを基本から学ぶ

##**■0.はじめに**

こちらを読みました。

[ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585/ref=cm_cr_arp_d_product_top?ie=UTF8)

読んで、自分なりの理解で、整理してまとめました。
例えがわかりやすくて、理論は十分理解できたかと思いますが、実装の理解が相当難しいですね...

ソースコードは[github](https://github.com/oreilly-japan/deep-learning-from-scratch)で公開されているものを元にしています。

###**[Part1 ニューラルネットワークの基本](http://qiita.com/nvtomo1029/items/a4c37d57c8d322ce9dd2)**

###**[Part2 ニューラルネットワークの学習](http://qiita.com/nvtomo1029/items/70eab5c770811520784c)**

###**[Part3 誤差逆伝播法でニューラルネットワークの学習を高速化する](http://qiita.com/nvtomo1029/items/95b82c2ab4fc0a1b5aad)**

###**[Part4 学習に関するテクニック](http://qiita.com/nvtomo1029/items/6d57ff25fbddf76c7651)**

###**[Part5 畳み込みニューラルネットワーク](http://qiita.com/nvtomo1029/items/601af18f82d8ffab551e)**
【学習メモ】 dockerのbase device sizeをdaemon.jsonで定義

#はじめに
いつものようにdocker buildしていたらエラーが出ました。

```bash:容量エラーの例
ApplyLayer write /var/lib/docker/image/devicemapper/layerdb/tmp/write-set-895086595/tar-split.json.gz: no space left on device stdout: {"layerSize":2447539969}
 stderr: 
```
devicemapperのbase device sizeの標準10Gがいっぱいのようです。
base device sizeを変更する手続きを見ていくと、```/etc/sysconfig/docker```や```/etc/sysconfig/docker-storage```で指定すると変更できるようです。
が、手元の環境では反映されなかったのでdaemon.jsonに書いたら反映されたのでメモです。


###動作環境
```bash:動作環境
CentOS7 7.3.1611
kernel 3.10.0-693.11.6.el7.el
docker :Server Version: 17.12.0-ce build c97c6d6
        Storage Driver: devicemapper
```

```bash:設定反映の流れ
systemctl stop docker     # dockerを止めて
rm -rf /var/lib/docker    # コンテナやキャッシュを全部削除して
systemctl daemon-reload   # 設定を再読み込みして
systemctl start docker    # dockerを起動
```

##動いた例
/etc/docker/daemon.jsonに定義する

```bash:/etc/docker/daemon.jsonで20Gに定義したとき
{
  "storage-driver": "devicemapper",
  "storage-opts": [
                     "dm.use_deferred_removal=true",
                     "dm.basesize=20G"
                  ]
}
```
- overlayfs2から入れ替えるとき、直接↑に変更すると動かなかったので、```storage-driver```の1行のみに変えて```rm```と```daemon-reload```を実施、その後```storage-opts```を追加すると動作するようになりました。

[(公式)Select a storage driver](https://docs.docker.com/engine/userguide/storagedriver/selectadriver/#check-and-set-your-current-storage-driver)


##ダメだった例

```bash:ダメだった例
/etc/sysconfig/docker
/etc/sysconfig/docker-storage
で定義したとき

DOCKER_STORAGE_OPTIONS=--storage-opt dm.baseize=20G
DOCKER_STORAGE_OPTIONS= --storage-opt dm.baseize=20G
```

参考資料
[Docker のベースサイズを拡張する](http://sig9.hatenablog.com/entry/2017/01/16/120000)
[3.18 コンテナが使用するディスクサイズ(dm.basesize)を変更する](http://qiita.com/hana_shin/items/392bd01be6aff9fc1dd4#318-%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%8C%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%82%B5%E3%82%A4%E3%82%BAdmbasesize%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B)
[Android Studio] Androidプロジェクトをコマンドラインからサクッと開く


# 概要
Xcodeプロジェクトを `$ open /path/to/Project.xcodeproj` で開くように、コマンドラインからAndroid Studioを起動する方法

# studioコマンドをインストール
1. Android Studio のメニューのTools
2. Create Command-line Launcher...
3. (任意)studioコマンドのインストールパスを変更
4. 「OK」をクリック

![eb79f3e3-6ca7-e6a7-2720-54bfb0e49810.png](https://qiita-image-store.s3.amazonaws.com/0/11454/ef122d8e-949b-7089-8204-db716fe8a935.png "eb79f3e3-6ca7-e6a7-2720-54bfb0e49810.png")
![5c99e1b7-ce89-d6b6-f55e-23da4505b72b.png](https://qiita-image-store.s3.amazonaws.com/0/11454/349e9c86-14f5-bed3-3bc7-93ff4ef4f744.png "5c99e1b7-ce89-d6b6-f55e-23da4505b72b.png")


これで `studio` コマンドが使えるようになる

# Androidプロジェクトを起動

`studio` コマンドで Androidプロジェクトのディレクトリを指定すると開く

```
$ studio ~/path/to/project/dir
```
最近メールが相手にブロックされるなーと思ったメールサーバ管理者の皆さんへ

最近、メールを経由して色々なものが飛んでくる時代になりました。
ということで、メールを受信する側で送ってくる人の身体検査をより強化する事が増えてきたと思います。

postfixなんかだと

```Postfix:main.cf
smtpd_client_restrictions = permit_mynetworks, reject_unknown_client, reject_unknown_reverse_client_hostname,  permit
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname, reject_non_fqdn_hostname, reject_unknown_hostname, permit
```

rbl.jp運用終了とのことですので、設定から抹殺しました。今までありがとうございました。

なーんて書く場合も出てきました。

ここで、送信側にエラー450 4.7.1になって送信がブロックされるという事象が現れます。
これは以下のような原因で起こります。

1. 送信元ホストがHELOコマンドの送信までたどり着き、コマンドを送る
2. その際に自ホスト名を送るがそのホスト名ではIPアドレスを取得できない 
3. reject_unknown_hostnameに引っかかって送信をブロックされる

対処としては

 - HELOで送信するホスト名とグローバルIPアドレスに割当たっているホスト名を一致させる。(smtp_helo_name等で)
 - HELOで送信するホスト名をDNSに登録する


等が考えられます。
要は嘘をつくな、って事です。
ATTiny13でアセンブラ

ちょっとわけあってATTiny13でavr-asを使ってみました。ネットで見つかったコードを参考にしました。

```
.equ DDRB, 0x17
.equ PORTB, 0x18
.equ WDTCR, 0x21

.equ LED, 2

.org 0x0000
rjmp reset

reset:
        ldi R16, 0x00
        out WDTCR, R16

        sbi DDRB, LED
loop:
        sbi PORTB, LED
        rcall delay
        cbi PORTB, LED
        rcall delay
        rjmp loop

delay:  
        ldi R17, 8
delay1s:        
        ldi R18, 250
delay250ms:
        ldi R19, 250
delay1ms:
        nop
        dec R19
        brne delay1ms

        dec R18
        brne delay250ms

        dec R17
        brne delay1s
        ret
```

スタックポインターはリセット時に初期化されているようなので、設定していません。

必要なequはAVR Studioのcpu毎のincファイルからコピペします。

Makefileはこんな感じです。

```
AVRBIN=/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin

test:
        $(AVRBIN)/avr-as -mmcu=attiny13 -o test.o test.s
        $(AVRBIN)/avr-ld test.o -o test.elf
        $(AVRBIN)/avr-objcopy -j .text -j .data -O ihex test.elf test.hex
```

Timer0の割り込みを使うとこんな感じになります。

```
.equ DDRB, 0x17
.equ PORTB, 0x18
.equ WDTCR, 0x21
.equ TCCR0B, 0x33
.equ TIMSK0, 0x39

.equ LED, 2

.org 0x0000
        rjmp reset      ; RESET
.org 0x0006
        rjmp timer      ; TIM0_OVF

timer:
        inc R17
        cpi R17, 0x00
        brne next
        cbi PORTB, LED
        reti
next:
        cpi R17, 0x80
        brne end
        sbi PORTB, LED
end:
        reti

reset:
        ldi R16, 0x02
        out TCCR0B, R16
        ldi R16, 0x02
        out TIMSK0, R16

        sbi DDRB, LED
        sbi PORTB, LED

        ldi R17, 0x00
        sei
loop:
        rjmp loop
```

ちなみに割り込みをCで書くとこんな感じです。

```
#include <avr/io.h>
#include <avr/interrupt.h>

int count;
 
ISR(TIM0_OVF_vect)
{
    ++count;
    if(count == 0x80) {
        PORTB ^= (1<<PB2);
        count = 0;
    }
}
 
void init_timer()
{
    TCCR0A = 0; // normal mode
    TCCR0B = (1<<CS01); // prescaler = 2
    TIMSK0 |= (1<<TOIE0);
    //TCNT0 = 0;
}
 
int main()
{
    DDRB =(1<<PB2);
    init_timer();
    count = 0;
    sei(); // enable global interrupts
    while(1) {
    }
}
```

オブジェクトのサイズはこのようになりました。

```
   text    data     bss     dec     hex filename
     44       0       0      44      2c timer_asm.elf
    186       0       2     188      bc timer_c.elf
```

なにか理由がなければ、デバッグが骨なので、ATTiny25とかでCで開発するのが良い気もします。
circleci/node イメージの中で ssh した時の 'manpath: can't set the locale; make sure $LC_* and $LANG are correct'

こうなってるので、

```bash
$ locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=
```

合わせると、**何故か**うまく行った。

```bash
export LANG=""
```

こっちは駄目だった。

```bash
export LC_ALL="C.UTF-8"
```
2017年のハッカソン開催情報まとめ！ - 7月/8月分

2017年7月と8月！

[2017年のハッカソン開催情報まとめ！](http://qiita.com/satoshi0212/items/178c56c3ae28dd4c3252)

# 7月

### [第7回ドロンソン 「ドローン × 鉄道」](http://peatix.com/event/276477)
- 7月8日

### [SPAJAM 2017](http://spajam.jp/)
- 7月8日-10日 本戦

### [例のカノジョ ハッカソン](https://vrkanojo.connpass.com/event/57236/)
- 7月9日

### [おふろcafé × はじめてのハッカソン Vol.26〜おふろに入って優雅にリラックス〜](https://hackathon.connpass.com/event/60504/)
- 7月15日

### [CI&T Hackathon for 2020 Olympics! Win Apple Watch!](https://connpass.com/event/60460/)
- 7月15日

### [《ハッカソン》GameJam向けツールを作ろう！](https://ioio.connpass.com/event/60052/)
- 7月17日

### [親子で教育ハック！ R-Stack Hack Day 2017](https://r-stack.connpass.com/event/57977/)
- 7月22日

### [Amazon Dash Button ハッカソン](https://connpass.com/event/61840/)
- 7月22日

### [ISHINOMAKI TRAVEL SIM アイディアソン](http://peatix.com/event/280449)
- 7月22日

### [地域創生ハッカソン-精華町シティプロモーション-](https://connpass.com/event/59893/)
- 7月22日-23日

### [bit.Connect "Hack for Workstyle"](https://entryweb.jp/nri_hack2017/)
- 7月29日-30日

### [Dangerハッカソン #1](https://testnight.connpass.com/event/59971/)
- 7月31日


# 8月

### [スポーツアイデアソン](http://fif.jp/kidsyouth/information/sportsideason2017.html)
- 8月2日

### [ショッカソン2017に向けた事前アイディアソン](https://tmcn.connpass.com/event/63308/)
- 8月3日

### [第1回 One JAPANハッカソン](https://onejapanhackathon.connpass.com/event/61025/)
- 8月4日 アイデアソン
- 8月25日 ハッカソン

### [MY Life Hack in Kyushu](https://meijiyasuda.secure.force.com/hackathon)
- 8月5日-6日 ハッカソン
- 8月23 demoday

### [オープンデータハッカソン～Asia Opendata Hackathon じゃんとこい魚津 ～](https://code4toyama.connpass.com/event/61182/)
- 8月5日-6日

### [Kaggleデータ分析ハッカソン by Team AI 8/6(日)](https://teamai.connpass.com/event/63011/)
- 8月6日

### [金融データハッカソ­ン by Team AI 8/9(水)](https://teamai.connpass.com/event/63593/)
- 8月9日

### [ヤマハ・クリエイティブ・ハッカソン](https://global.yamaha-motor.com/jp/profile/design/ych/2017/)
- 8月9日-10日

### [医療データハッカソ­ン by Team AI 8/10(木)](https://teamai.connpass.com/event/63594/)
- 8月10日

### [2017年度豊橋３大学連携まちづくりハッカソン](https://connpass.com/event/60674/)
- 8月10日-11日

### [ROS Japan UG #12 Raspberry Pi Mouseハッカソン](https://rosjp.connpass.com/event/59669/)
- 8月19日

### [Mackerel Plugin Hackathon #1 Tokyo](https://mackerelio.connpass.com/event/63087/)
- 8月19日

### [Beauty X IoT Hackathon powered by L'ORÉAL JAPAN](http://peatix.com/event/261189)
- 8月19日 アイデアソン
- 8月26日-27日　ハッカソン

### [【PKSHA Technology CEO上野山氏登壇】テクノロジーによる課題解決アイデアソン](https://techplay.jp/event/630238)
- 8月20日

### [【学生&若手エンジニア向け】ライフサイエンス画像解析カジュアルハッカソン！](https://techplay.jp/event/630381)
- 8月26日

### [【デザイナソン】Adobe XD meeting 08](https://techplay.jp/event/630544)
- 8月26日

### [ショッカソン2017](https://tmcn.connpass.com/event/62118/)
- 8月26日-27日

### [第2回 伊那市 LoRaWAN ハッカソン](https://uhuru.connpass.com/event/61532/)
- 8月26日-27日
Redmine プラグイン 今更ながらEasyガントチャートを導入してみた

# はじめに
## Easyガントチャートとは
ガントチャートを直感的にいじることができるプラグインです。
https://www.easyredmine.com/redmine-gantt-plugin
今回は無料版を導入しました。

## 導入の経緯
プロジェクトを管理していたらリスケすることって多々あるじゃないですか。
その度にチケットの開始日と期限をいちいち更新するのって結構手間ですよね。
親チケレベルでリスケしようとしたら10個とか20個とかのチケットの開始日と期限を変えないといけないわけです。
もっと手軽に開始日と期限を更新したい！と思ってこのプラグインの導入を決めました。

# 導入手順
## プラグインファイルを取得する
こちらから無料版のプラグインをダウンロードします。
https://www.easyredmine.com/redmine-gantt-plugin
<img width="1355" alt="スクリーンショット 2017-09-08 11.48.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/aef1cbdc-10d5-88be-2fa7-dd0f162174cf.png">

## Redmineプロジェクトに配置
ダウンロードしたzipを```redmine/htdocs/plugins```に展開します。

## bundle install
いつものようにpluginsに配置して再起動したらエラーとなったので調べた結果、
```bundle install```が必要なようです。
easy_ganttに移動して```bundle install```をしましよう。

## db:migrate
```bundle install```して一安心し、再起動したらまたエラーとなったので調べた結果、
```db:migrate```も必要なようです。
```rake --trace db:migrate RAILS_ENV=production```しましょう。

## 再起動
最後に再起動して完了です。
Redmine上の 管理>プラグイン で確認しましょう。

# 設定
## 各プロジェクトでEasyガントを有効にする
設定>モジュール でEasyガントを有効にします。
<img width="896" alt="スクリーンショット 2017-09-08 11.55.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/bc4c0c93-2663-7be5-6878-c29206c4702b.png">
有効にしたら、プロジェクトメニューにEasyガントチャートが追加されます。

## 実際のプロジェクトデータを取り込む
Easyガントチャートに移動すると、サンプルデータが表示されていると思うので（初回だけ）、
実際のプロジェクトデータを取り込むボタンを押して実際のプロジェクトデータを取り込む。

# 動作確認
こんな感じに移動できます。
![タイトルなし.gif](https://qiita-image-store.s3.amazonaws.com/0/147005/f64d764b-9d9d-d2a5-cb3e-a32ffe20e4d5.gif)

# 惜しいところ
- 期間の拡張はできない（横に広げれない）
- おそらくデフォルトのテーマにしかデザインの完全な対応はしていない
Githubのwebhookを使ってnginx上でgit pullする

# 背景
静的サイトのソースをGithubで管理し、pushされた時にwebhookを動かし、外部サーバでgit pullすることで自動デプロイする。
よくやることだが、意外とapache前提の情報が多く、nginxに初めて触る＆PHP普段書いてないため若干ハマった。
個人用に注意点をまとめておく。


## 構成
ソース管理：Github
外部サーバ環境：さくらのVPS, CentOS7, nginx, webhook用のスクリプトはPHPで作成

## SSH認証の準備
以下の記事を参考にSSH鍵を設定し、接続のテストを行う。
http://qiita.com/shizuma/items/2b2f873a0034839e47ce
ただし、気をつけないといけないのは今回はnginx上で行うということ。
webhook用スクリプトの実行ユーザがnginxとなるので、nginxユーザでGithubにssh接続し、git pullしてこれないといけない。

nginxのデフォルトのSSH鍵の置き場は以下のため、ここにSSH鍵を配置。

```
/var/cache/nginx/.ssh
```
接続をテストするときも、nginxユーザでテストする。

```
sudo -u nginx ssh -T git@gitlab.com
```

## webhook用のスクリプトを準備
git pullしてくるスクリプトは以下を参考にさせていただき準備した。
http://qiita.com/oyas/items/1cbdc3e0ac35d4316885
ただし、このPHPのスクリプトもapache前提となっていてnginx上では動かないので修正。
具体的には、getallheadersv()はapacheに依存しているため動かない。getallheaders()を使わずにリクエストヘッダーの値を取得する。
修正したものが以下のソース

```php
<?php

// 設定
$LOG_FILE = dirname(__FILE__).'/hook.log';
$SECRET_KEY = 'your key';

$postdata = file_get_contents("php://input");
$hmac = hash_hmac('sha1', $postdata, $SECRET_KEY);
if ( isset($_SERVER['HTTP_X_HUB_SIGNATURE']) && $_SERVER['HTTP_X_HUB_SIGNATURE'] === 'sha1='.$hmac ) {
    $payload = json_decode($postdata, true); // 受け取ったJSONデータ
    // ここに実行したいコードを書く
    exec('git pull 2>&1');
    file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." ".$_SERVER['REMOTE_ADDR']." git pulled: ".$payload['after']." ".$payload['commits'][0]['message']."\n", FILE_APPEND|LOCK_EX);
} else {
    // 認証失敗
    file_put_contents($LOG_FILE, date("[Y-m-d H:i:s]")." invalid access: ".$_SERVER['REMOTE_ADDR']."\n", FILE_APPEND|LOCK_EX);
}
```

## Githubにwebhookを登録
上記で作成したスクリプトをGithubの対象プロジェクトのwebhookに登録。

以上。
NGINX Unitでpython wsgiサーバーを動かす

NGINX Unitが公開されて、Python用のWSGIを動かすアプリケーションサーバーとして使っていけるかなぁという感じです。とりあえずHello Worldを動かしてみました。

# ためした環境

- vagrant 
- ubuntu/xenial64
- python3.5

# NGINX Unitのインストール
こちらを参考にubuntuパッケージ版をインストール。
<https://github.com/nginx/unit#ubuntu-packages>

そして起動
```
$ sudo service unitd start
```

# pythonアプリケーションの作成
pythonアプリケーションはwsgiで作成する。指定したパスにwsgi.pyというファイルを配置して、あとはwsgiの流儀に従うだけ。wsgiで作ればいいのでフレームワークなんかは自由。

```wsgi.py
def application(environ, start_response):
	start_response('200 OK', [('Content-Type', 'text/plain')])
	return ['Hello World\n'.encode('utf-8')]
```

# 設定ファイルの記述
配置してあるファイルを変更するのではなく、APIで設定を通知するという感じの使い方になるので、設定ファイルを記述してそれをアップロードして設定を反映させる。

```start.json
{
	"applications": {
		"hello": {
			"type": "python",
			"workers": 2,
			"path": "/home/ubuntu",
			"module": "wsgi"
		}
	},

	"listeners": {
		"*:8400": {
			"application": "hello"
		}
	}
}
```

# 設定の反映
制御のAPIはunixソケットでAPIを叩く。
参照: <https://github.com/nginx/unit#configuration>

記述した設定ファイルをcurlでアップロードして反映させる。

```bash
$ sudo curl -X PUT -d @start.json --unix-socket /var/run/control.unit.sock http://localhost/
```
もしくは、ubuntuのパッケージインストールではそれをしてくれるスクリプトが用意されているので、それを使うと楽。

```
$ sudo service unitd restoreconfig start.json
```

GETでリクエストすれば、設定が取得できる。

```
$ sudo curl --unix-socket /var/run/control.unit.sock http://localhost/
{
	"applications": {
		"hello": {
			"type": "python",
			"workers": 2,
			"path": "/home/ubuntu",
			"module": "wsgi"
		}
	},

	"listeners": {
		"*:8400": {
			"application": "hello"
		}
	}
}
```
unitdが設定ファイルを持ったりしてないので、再起動するたびに反映させる必要がある。

# 動作の確認

8400ポートでアプリケーションが動くように設定したので、そこにcurlでHTTPリクエストをなげると結果が得られた。

```
$ curl http://localhost:8400/
Hello World              
```

uWSGIなどと比べると機能が圧倒的にすくないけど、これから多機能になっていくかもしれませんね。
virtualenv/venv で使うのは今後でてくるでしょうか。
docker-compose のコンテナ初期化で引っかかったお話


MySQLの公式イメージをベースに初期データを投入する **Dockerfile** を作って `docker-compose up` する度に初期DBができるようにしたものの、実際に動かす時に引っかかったのでメモ

# 何がしたかったかと何が起きたか
要は `docker-compose up` の度にDBを初期状態にしたかったんだけど、初期化用のSQLを変えた時に何故かそれが反映されない。
というか `docker-compose exec mysql bash` でコンテナに入った後MySQLにログインして操作した履歴が残るんですけどー！！

## Docker周りの設定ファイル

```docker-compose.yml
version: '3'
services:
  mysql:
    build: ./mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
    ports:
      - '3306:3306'
```

```Dockerfile
FROM mysql

RUN apt-get clean && apt-get update && apt-get install -y locales
RUN locale-gen ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:en
ENV LC_ALL ja_JP.UTF-8
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8

RUN { \
    echo '[mysqld]'; \
    echo 'character-set-server=utf8'; \
    echo 'collation-server=utf8_general_ci'; \
    echo ''; \
    echo '[client]'; \
    echo 'default-character-set=utf8'; \
    echo ''; \
    echo '[mysql]'; \
    echo 'default-character-set=utf8'; \
} > /etc/mysql/conf.d/charset.cnf

ADD ./login.sh /root/login.sh

ADD ./init_db.sql /docker-entrypoint-initdb.d/01_init_db.sql
ADD ./init_tables.sh /docker-entrypoint-initdb.d/02_init_tables.sh
```

# 原因

`docker-compose up mysql` でコンテナを起動すると途中でこんなログが出て来る

```
mysql_1   | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/01_init_db.sql
```

じゃあ初期クエリは読まれてるのかってことで一旦 `Ctrl+C` でコンテナを止めて再度 `docker-compose up mysql` で起動...

( ﾟдﾟ)ん？

( ﾟдﾟ)さっきのログが出てこねえ...

## 結局

`docker-compose up ~` で起動したコンテナは `Ctrl+C` で止めただけだとそのまま残っちゃって、
`docker-compose up ~` の度にそのコンテナが起動してるからだったっぽい

## 何故今まで気づかなかったか

今までは `docker-compose up -d ~` でコンテナ起動して `docker-compose down` で止めてたんだけど、
`down` コマンドのリファレンスにはこう書かれてた。

> コンテナを停止し、 `up` で作成したコンテナ・ネットワーク・ボリューム・イメージを削除します。デフォルトではコンテナとネットワークのみ削除します。

つまり今までは意識せずにコンテナを消してたんですねー( ﾟдﾟ)

確かに、 `docker-compose up mysql` で動いてるコンテナを `Ctrl+C` で止めると

```
^CGracefully stopping... (press Ctrl+C again to force)
Stopping vagrant_mysql_1 ... done
```

と出力されるのに対し `docker-compose down` すると

```
$ docker-compose down
Stopping vagrant_mysql_1 ... done
Removing vagrant_mysql_1 ... done
Removing network vagrant_default
```

と出力されてコンテナが消されてるのが分かる。

# 結論

- `docker-compose up ~` で起動したコンテナは `Ctrl+C` で止めただけだと残り続ける
- 初期化する場合は `docker-compose down` か `docker-compose rm ~` でコンテナを消す必要がある
OAuthレフレシュトーケン

#### OAuth2.0 protocol Refresh token usage memo

Refresh token usage 

1. Improved access patterns against the authorization server (lower load, faster checks).
2. Shorter windows of access for leaks"Access tokens" (these expire quickly, reducing the chance of a leaked token allowing access to a protected resource).
3. Check and Refresh your session with this access token.

Note: refresh_token is long live token on the authentication server. Hence, we need to be careful about store it.

For example: JS client you should use HTTPS protocol and when you store it on the cookies you should use restricted path like this.

        res.cookie('refresh_token', refreshToken, {
          maxAge: COOKIE_MAX_AGE * 1000, //in ms
          secure: req.secure,
          httpOnly: true,
          path: API_BASE_PATH + '/auth/token',
        });

Most of Oauth2.0 implementation for skipping this part. But it's an important part of OAuth 2.0 protocol security.
AmazonLinux に入れた Let's Encrypt の証明書を再セットアップした話

以前導入した Let's Encrypt の証明書の有効期限が切れてしまい、ついでに色々問題が発生したので、対処した方法のメモを記録しておくことにしました。

今回発生した現象はこちら。（抜粋です。）

```
Traceback (most recent call last):
  File "/opt/eff.org/certbot/venv/bin/letsencrypt", line 11, in <module>
    sys.exit(main())
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/site-packages/certbot/main.py", line 755, in main
    return config.func(config, plugins)
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/site-packages/certbot/main.py", line 694, in certonly
    lineage = _get_and_save_cert(le_client, config, domains, certname, lineage)
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/site-packages/certbot/main.py", line 82, in _get_and_save_cert
    lineage = le_client.obtain_and_enroll_certificate(domains, certname)
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/site-packages/certbot/client.py", line 375, in obtain_and_enroll_certificate
    self.config)
  File "/opt/eff.org/certbot/venv/local/lib/python2.7/site-packages/certbot/storage.py", line 999, in new_lineage
    "archive directory exists for " + lineagename)
CertStorageError: archive directory exists for XXX
```

[参考にしたサイト](https://blog.yskw.info/articles/326/)によると、以前から同様の問題はあったようですが、ディレクトリが変わっていました。
`/root/.local/share/letsencrypt/`→`/opt/eff.org/certbot/`
なので、再セットアップのために削除するディレクトリは
`/opt/eff.org/certbot/`
になります。

具体的にはこんな感じ。

```
unset PYTHON_INSTALL_LAYOUT
env | grep PYTHON_INSTALL_LAYOUT
sudo rm -rfd /opt/eff.org/certbot/
```
unset は実はいらないんじゃないかなぁと思いながらも、実施したので記載しています。どなたか同じ現象が発生した際、unset なしの検証もしていただけるとうれしいです。

今回は、復旧作業と称して、色々試したので

```
Renewal conf file /etc/letsencrypt/renewal/xxx is broken.
```
なんてメッセージも出てしまいました。。。
ので（？）設定を全消去して、新規に証明書を取り直すことにしました。
設定の全消去は`/etc/letencript`以下を全消去（チキンなのでリネームｗ）すれば OK です。

ここまで作業をすすめ、AmazonLinux 用のおまじない`--debug`をつけたインストール作業を行うと、復旧（というか新規の再取得）完了です。

```
./certbot-auto certonly --webroot -w /var/www/html/hogehoge（80でアクセスできるDocumentRoot） -d www.example.com（登録したいFQDN） --debug
```
`/etc/letencript`の消去で、`/etc/letsencrypt/live/`以下のディレクトリ構造が変わってしまっていると、nginx の起動で怒られるので、nginx の設定ファイルを適切に変更することも必要かもしれません。

はやく AmazonLinux に公式に対応してくれないかなぁ。。。
D3.js Heatmap & 画像　& 凡例　(初心者向け-メモレベル)

------作成中、完成版ではない-------
もし著作権違反があれば、教えてください！！



## ■成果物イメージ　

![2017-09-08 10_55_45-ヒートマップ.png](https://qiita-image-store.s3.amazonaws.com/0/181748/11f93636-0441-cbd9-9ff2-3a719362bd32.png)

```html:test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ヒートマップ</title>
</head>

<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3-legend/2.13.0/d3-legend.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3-legend/1.13.0/d3-legend.min.js"></script>

<style>
#div1 {
  z-index:20;
}
svg {
  width:160px;
  height:240px;
}
/* 画像とheatmapを重なるため*/
#canvases {
  position:relative;　　
}

/* 画像とheatmapを重なるため*/
.canvas {
  position:absolute;
}


</style>

<body>
<h1>ヒートマップ</h1>


<div id="canvases" style="width:350px;height:280px;">
<img class="canvas" src="/images/o0480048012773923150.jpg" alt="test" style="width:160px;height:240px;">　    //画像の描画
<svg class="canvas" id="mygraph"></svg>　//heatmapの描画
</div>

//凡例
<svg  id="svg-color-quant" ></svg>　
<script src="/js/d3.js"></script>

</body>
</html>

```
##下記のjsは引用となります

>
var svgWidth=160;
var svgHeight=240;
var blocksize=20; //ブロックのサイズ
//データセット
var dataset = [
1,2,3,4,5,6,5,3,4,
1,2,2,4,9,1,5,1,5,
2,2,8,0,4,5,5,2,6,
9,2,3,4,5,7,5,3,7,
3,2,6,4,0,6,2,4,8,
1,7,8,2,4,6,3,5,2,
9,2,3,4,5,7,5,3,7,
3,2,6,4,0,6,2,4,8,
3,2,6,4,0,6,2,4,8,
1,2,2,4,9,1,5,1,5,
9,2,3,4,5,7,5,3,7,
]
<!--ヒートマップに表示するカラーの自動計算-->
var color =d3.interpolateHsl("blue","yellow");　//青から黄色にHSLカラー空間で補間する
var maxValue=d3.max(dataset); //最大値を求める
<!-- ヒートマップの準備　-->
var heatmap =d3.select("#mygraph")
    .selectAll("rect") //
    .data(dataset)
<!--ヒートマップを表示　-->
heatmap.enter()　　　　//
 .append("rect")　　　//四角形・角丸四角形
.attr("class","block")     //
 .attr("x",function(d,i) {  //
    return (i % 8) *blocksize; //X座標
 })
 .attr("y",function(d,i) {
   return Math.floor(i/8)*blocksize;　//y座標
 })
 .attr("width",function(d,i) {
    return blocksize;     //横幅
 })
 .attr("height",function(d,i) {
    return blocksize;     //縦幅
 })
 .style("fill",function(d,i){
   return color(d/maxValue);   //データからヒートマップに表示する色を求め、表示する
 })
 .style('opacity',0.3) //透明度 30%
 .append("title")  //tooltip
 .text(function(d){ return d; }) //tooltip

>>
※上記コードの引用先：(超お薦め)
データビジュアライゼーションのためのD3.js徹底入門
https://www.amazon.co.jp/dp/4797368861

----
>
var svg = d3.select("#svg-color-quant");
var log = d3.scaleLog()
.domain([ 0.1, 100, 1000 ])
.range(["blue", "yellow"]);
svg.append("g")
.attr("class", "legendLog")
.attr("transform", "translate(20,20)");
var logLegend = d3.legendColor()
.labelFormat(d3.format(".2f"))
.cells([1, 2,3, 4, 5, 6, 7,8,9,10,11,12,13,14,15])
.scale(log);
svg.select(".legendLog")
.call(logLegend);


>>※上記コードの引用先：(超お薦め)
d3 SVG Legend (v4)
http://d3-legend.susielu.com/
ローカル fluentd導入手順メモ

## fluentdインストール
[Fluentdのサイト](http://docs.fluentd.org/v0.12/articles/install-by-rpm)のstep1,step2を実行（step3で動作確認）

### タグを追加する場合
`sudo vim /etc/td-agent/td-agent.conf`  

```cfg
<match {tagname}>
  @type stdout
</match>
```

## fluentd起動  
`sudo /etc/init.d/td-agent start`

## goで使用  
`go get "github.com/t-k/fluent-logger-golang/fluent"`  


```go
f, _ := fluent.New(fluent.Config{})
f.Post("debug.test", map[string]string{"message": "hello"})
f.PostWithTime("reply", time.Now(), map[string]interface{}{"data": "hello"})
```

output `/var/log/td-agent/td-agent.log`

```log
2017-06-29 05:56:20 +0200 debug.test: {"message":"hello"}
2017-06-29 05:56:20 +0200 reply: {"data":"hello"}
```
今日の日付に合わせて yyyy-mm/yyyy-mm-dd.md を作成するシェルスクリプト

変数展開でトリミングできるんですね！という話。

```bash
#!/bin/bash
readonly ROOT=$(realpath $(dirname $0))

fileName=$(date +"%Y-%m-%d").md
dirName=${fileName%-[0-9]*.md}

filePath="$ROOT/$dirName/$fileName"
if [ ! -e "$ROOT/$dirName" ]; then
    mkdir "$ROOT/$dirName"
fi
touch $filePath
```
Cognosの導入がうまくいかないパターン③ - RHEL6でDB2データソースに接続できない

#概要
タイトルの通りですが、Redhat 6の環境で、Cognos BI & Analyticsのセットアップ時に、Cognos Administrationでデータソース定義の際に、DB2データソースに接続できない時が良くあります。
テストを行うと、以下のようなlibdb2.soをロードできないというメッセージです。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/eeea3683-168d-9b93-0188-a646ac631399.png)


##対処方法
以下、2点の対応が必要です。

1. pam.i686の導入
以下のコマンドで導入して下さい。
\# yum install pam.i686


2. Cognos起動ユーザーの.bash_profileのLD_LIBRARY_PATHの指定
以下のような雰囲気で、DB2のLIB32をLD_LIBRARY_PATHに指定するようにしてください。
LD_LIBRARY_PATH=/opt/ibm/cognos/analytics/bin64:/opt/ibm/db2/V11.1/lib32

めでたく接続できるようになりました。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/835d25c1-1c0c-7f2a-bfcd-98fb2f92b380.png)
jest.moduleNameMapper は一番最初にマッチしたパターンが使われる

## 問題

こんな感じに設定してた。

```json
{
  "jest": {
    "moduleNameMapper": {
      "^components": "<rootDir>/src/scripts/components",
      "^components/(.+)": "<rootDir>/src/scripts/components/$1",
    }
  }
}
```

ただこれだと、`import Foo from 'components/foo'`としても、`components/index`が返されてしまっていた。



## 解決

順番やパターンを変える。

```json
{
  "moduleNameMapper": {
    "^components/(.+)": "<rootDir>/src/scripts/components/$1",
    "^components": "<rootDir>/src/scripts/components",
  }
}
```

or

```json
{
  "moduleNameMapper": {
    "^components(?!/)": "<rootDir>/src/scripts/components",
    "^components/(.+)": "<rootDir>/src/scripts/components/$1",
  }
}
```

or

```json
{
  "moduleNameMapper": {
    "^components(.*)": "<rootDir>/src/scripts/components$1"
  }
}
```
Unityで球の内側にいる時に当たり判定を設定する

[No hack, no work • UnityとOculusで360度パノラマ全天周動画を見る方法【無料編】](http://warapuri.com/post/131599525953/unity%E3%81%A8oculus%E3%81%A7360%E5%BA%A6%E3%83%91%E3%83%8E%E3%83%A9%E3%83%9E%E5%85%A8%E5%A4%A9%E5%91%A8%E5%8B%95%E7%94%BB%E3%82%92%E8%A6%8B%E3%82%8B%E6%96%B9%E6%B3%95%E7%84%A1%E6%96%99%E7%B7%A8)のSphere100.fbxを利用して全天球画像を表示しているがRayキャスティングを実施しても反応がなかったので対応した。
ここでは対応方法をメモする。

## 参考サイト
 * [Sphere collider invert? - Unity Answers](http://answers.unity3d.com/questions/213427/sphere-collider-invert.html)
  * Sphere100.fbxではなくSphereを利用する場合はリンク先の方法でOK
 * [How do I duplicate a mesh asset? | Unity Community](https://forum.unity3d.com/threads/how-do-i-duplicate-a-mesh-asset.35639/)

## 原因

Colliderが外向きからしか反応しない。
内側からだと当たり判定が存在しない。

## 対応方法

* Sphere100にMesh Colliderコンポーネントを追加する
* Sphere100に以下のスクリプトを設定する。

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ReverseNormals2 : MonoBehaviour {

    // Use this for initialization
    void Start()
    {
        MeshFilter filter = GetComponent(typeof(MeshFilter)) as MeshFilter;
        if (filter != null)
        {
            Mesh mesh = CopyMesh(filter.mesh);

            Vector3[] normals = mesh.normals;
            for (int i = 0; i < normals.Length; i++)
                normals[i] = -normals[i];
            mesh.normals = normals;

            for (int m = 0; m < mesh.subMeshCount; m++)
            {
                int[] triangles = mesh.GetTriangles(m);
                for (int i = 0; i < triangles.Length; i += 3)
                {
                    int temp = triangles[i + 0];
                    triangles[i + 0] = triangles[i + 1];
                    triangles[i + 1] = temp;
                }
                mesh.SetTriangles(triangles, m);
            }
        }

        this.GetComponent<MeshCollider>().sharedMesh = filter.mesh;
    }

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

    public Mesh CopyMesh(Mesh mesh)
    {
        var copy = new Mesh();
        foreach (var property in typeof(Mesh).GetProperties())
        {
            if (property.GetSetMethod() != null && property.GetGetMethod() != null)
                {
                property.SetValue(copy, property.GetValue(mesh, null), null);
            }
        }
        return copy;
    }
}
```
【Unity】スマホ画面に対応させる方法

スマホ画面にカメラ領域、UIを対応させる方法がわかった。

以下のサイトがとても参考になった。
http://tsubakit1.hateblo.jp/entry/2014/12/11/223427

加えてカメラのViewPort Rect プロパティを変更すると
3Dオブジェクトの描画領域も変更できる。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/192068/843b5a33-94ee-9b79-a07f-29ff1589240e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/192068/4a8430a8-2b9e-9818-362d-a2afc714cb20.png)
Javaで文字列を「.(ドット)」でsplitする

久しぶりにJavaを書いていて`.`で文字列を区切ろうとしたら軽くハマった。

Pythonならこんな感じ。

```Python
hoge = '172.0.0.1'
fuga = hoge.split('.') # => ['172', '0', '0', '1']
```

同じ感覚でJavaで

```Java
String hoge = "172.0.0.1";
String[] fuga = hoge.split(".");
```

と書いてしまうと、長さ0の配列が返ってくる。

原因はJavaのsplitは引数にpattern文字列をとるから。
`.`は任意の一文字にマッチしてしまう。( ..)φメモメモ

```Java
String hoge = "172.0.0.1";
String[] fuga = hoge.split("7."); // => ["1", ".0.0.1"]
```

Pythonと同じ動作を期待するならこう。

```Java
import java.util.regex.Pattern;

String hoge = "172.0.0.1";
String[] fuga = hoge.split(Pattern.quote("."));
```
Angular やるぞ！ MacOSX 向け npm や ng や node のインストールやバージョンアップでスタートラインに並ぶまで


Terminal を立ち上げて、色々便利な `nodebrew` をインストール。

```shell
$ curl -L git.io/nodebrew | perl - setup
```

Bash(他 shell は適当に読み替えて)に設定する。

```shell
$ vi /Users/ybj/.bash_profile
export PATH=$HOME/.nodebrew/current/bin:$PAT
$ source ~/.bash_profile
```

現在の状況を確認。

```shell
$ nodebrew ls
```

使用するバージョンをインストールする。

```shell
$ nodebrew ls-remote
$ nodebrew install-binary v6.11.3
$ nodebrew use v6.11.3
```

npmのバージョン確認と低かった時の更新。

```shell
$ npm -v
$ npm update -g npm
```

Angular のインストール。

```shell
$ npm install -g @angular/cli
```

モロモロ最終確認。

```shell
$ ng version
```

以下のURLの内容が動作可能となりました。
https://angular.io/guide/quickstart