OmniAICreator/Qiita-1.07M huggingface dataset:
mindmup > topdown view > TensorFlowの図にどうか

以前ゴールドセイント会員になったmindmup。

ソフト設計や自分のTODOリストなど色々な用途に使っている。

今日mindmupを使っていたら「Top downなんたら」というメッセージが表示された。
以下の機能のようだ。

http://blog.mindmup.com/2016/05/create-vertical-hierarchies-with.html

横に伸びていたのを下方向に伸ばせるようになったとのこと。
使うかは不明。

<hr>
(追記 2016/10/02)

昨日見始めたTensorFlowで出てくる図(計算グラフ?)の描画にどうか、と思った。

[GoogLeNet](https://leonardoaraujosantos.gitbooks.io/artificial-inteligence/content/googlenet.html)の最後の図の真似をしてみた。

「これじゃないロボ」発動。

- TopViewの場合は背景色でなく文字色がつくようになる
- 縦長すぎる

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ff1b8abd-f643-fe07-c71b-a7629840011b.png)

標準表示だと以下。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0957ace9-1132-52a1-4423-d3b4ad8998cb.png)
assets:precompileするさいにactiverecord-nulldb-adapterを使ってdb接続を避ける


```rake assets:precompile```をDockerfileの中に書いて```docker build``するとdbにつながらないといったエラーが出るので、build時はdbのadapterをnulldbに変更して本番DBへ接続しないようにした。

## 設定

* Gemfile

```
gem 'activerecord-nulldb-adapter'
```
* config/database.yml

```
defaults: &defaults
  adapter: <%= ENV['DB_ADAPTER'] ||= "mysql2" %>
  encoding: utf8
```

* Dockerfile

```
FROM hoge_rails_apps_base:latest

RUN DB_ADAPTER=nulldb bundle exec rake -t assets:precompile RAILS_ENV=production

CMD ["/start.sh"]
```


参考になりました

* http://blog.zeit.io/use-a-fake-db-adapter-to-play-nice-with-rails-assets-precompilation/
MSC-MOD20 > SDモジュール ソフト > v0.9 to v0.11 > I2C通信のタイムアウト追加 / バージョン取得とSD初期化で確認

```txt:動作確認
ESP8266 (気圧計で使用したユニバーサル基板: I2Cを4.7kでプルアップ)
SDモジュール: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
Analog Discovery 2 (以下AD2)
```

http://qiita.com/7of9/items/cf075be6433178952eb6
の続き。

上記は2016年8月1日。二カ月も飛んでしまった。。。
その二ケ月の間にやったのは、Processing入門、R入門、WRF入門、MOSFET入門、あとなんか入門した気もするが、記憶力が良くないので、忘れた。

二ケ月ぶりでほとんど忘れていたが、大丈夫。Qiitaの記事があるから15分で支度ができた。

前置き終わり。

## code 

### code v0.11

[ v0.11 @ github](https://github.com/yasokada/esp8266_160730_MSC-MOD20p1/releases/tag/v0.11)

以下が主な変更

- v0.9
   - SD initの初期化時間を見ていた
   - microSDを挿入していない時は3.3秒のタイムアウトが必要と分かった
- v0.10
   - これまでのI2Cの処理ではタイムアウト時間の長い処理(3.3秒とか)を
   - きちんと扱えてなかったため、delayとタイムアウトを入れた
   - 具体的にはI2Cの応答待ちの時、応答なし(0x00)を受信した時にdelay時間待ち(例: 10msec)を行う
   - それを繰返す。繰返すうちにタイムアウト時間(例:1000msec)経過時に繰返しから抜けるようにした
   - コードは後述
- v0.11
   - v0.11で入れたI2C通信を実際に使ってみた
   - バージョン取得とSD初期化処理で動作を確認した


### I2Cのdelayとtimeout追加

esp8266_160730_MSDMOD20lib.inoに記載のI2C応答読取り処理の変更を以下に示す。

```変更前.ino
bool readReply(int maxlen, char *dstPtr){
  char code;
  bool rcvd = false;

  if (dstPtr == NULL) {
    return false;
  }
    
  for(int loop = 0; loop < maxlen; loop++) {
    code = i2c_readCode(DEVICE_ADDRESS);
    if (isData(code)) {
      *dstPtr = code;
      dstPtr++;
      rcvd = true;
    } else {
      return rcvd;
    }
  }
  return true;
}
```

```変更後.ino
bool readReply_delayAndTimeout(int delay_msec, int timeout_msec, char *dstPtr) {
  char code;
  bool rcvd = false;
  int eplased_msec = 0; // maximum: 32767

  if (dstPtr == NULL) {
    return false;
  }

  while(1) { // TODO: 0m > limit with maxloop
    if (eplased_msec > timeout_msec) {
      return false;
    }
    code = i2c_readCode(DEVICE_ADDRESS);
    if (isData(code)) {
      *dstPtr = code;
      dstPtr++;
      rcvd = true;
      eplased_msec += 1; // TODO: 0m > correct time measurement
    } else {
      if (rcvd) {
        return true;
      }
      i2c_delay(delay_msec);
      eplased_msec += delay_msec;
    }
  }
  return rcvd;
}
```

- i2c_readCode()失敗時にdelay_msec秒待つ
- i2c_delay()はesp8266_160730_i2cWrapper.inoにて定義
   - ESP8266以外のRTOS使用環境への移植を考慮
   - i2c_delay(10)で10msecのdelay
- eplased_msec が指定のtimeout_msecを超えた時にタイムアウトと判断する
- i2c_readCode()成功時のeplased_msec 増分はまじめに実装してない
   - Arduinoの時間計測処理を勉強すればいいだろうが、とりあえず保留

## 実行例

### SDを挿入している時

```txt:結果
 GHI Electronics, LLC 
----------------------
 ALFAT SoC Processor 
!00
v2.0.0
!00
init SD: OK
rcvd:!00

v2.0.0
!00
init SD: OK
rcvd:!00
```

バージョン(v2.0.0)表示とSD初期化ともに成功。

### SDを挿入してない時

```txt:結果
 GHI Electronics, LLC 
----------------------
 ALFAT SoC Processor 
!00
v2.0.0
!00
init SD: NG
rcvd:!11

v2.0.0
!00
init SD: NG
rcvd:!11

v2.0.0
!00
init SD: NG
rcvd:!11

v2.0.0
!00
```

きちんとSD初期化がエラーになっている。

| エラーコード | エラーの内容 |
|:-:|:--|
| 00 | エラーなし(ACK) |
|   |   | 
| 11 | 初期化に失敗しました  |
|  | SDカードのCD信号がH又はフローティングしている |


### 写真

SDを挿入してない時

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/a2fe17a2-2e1e-0c18-569e-fd4e7887ab78.jpeg)


### 備考

早くMSC-MOD20を終わらせてGPUの性能を徹底的に追及しながらFPGAをしたい。。。

eplased_msec はelapsed_msecのタイポ。。。
CodeIQ「『トライアングル・メイズ』問題」に参加しました。


[CodeIQ「『トライアングル・メイズ』問題」](https://codeiq.jp/q/2833)の掲載期間が終了したということで、自分が提出したコード(Python3)を公開します。[ほかの解答者のコードはTogetterにまとめらています](http://togetter.com/li/1031276)ので、そちらもぜひ。


```py3

"""
「『トライアングル・メイズ』問題」の解答コード。

1. 漸化式はF(n + 1) = F(n) * (F(n) + 1)
2. F(n) mod 1000003, F(n + 1) mod 1000003, ... が「繰り返し」を持つことを利用する
"""

if __name__ == '__main__':
    ls = [0, 1]
    ht = {}

    # n=0からF(n)の値を探索しlsに記録する。
    # 「繰り返し」が現れた時点で探索を終了してもよい。
    for i in range(2, 10000003):
        t = (ls[-1] * ls[-1] + ls[-1]) % 1000003
        if t in ht: break

        ls.append(t)
        ht[t] = i
    
    # 「繰り返し」の開始地点と終了地点を探す
    start = ht[(ls[-1] * ls[-1] + ls[-1]) % 1000003]
    end = len(ls) - 1

    # F(n)の値を計算し、出力する。
    n = int(input())
    if end < n: n = (n - start) % (end + 1 - start) + start
    
    print(ls[n])

```

さて感想ですが、漸化式$F(n + 1) = F(n) * (F(n) + 1)$と「繰り返し」のふたつに気がつけば溶ける問題だったように思います。漸化式についてはシンプルで気が付きやすいものでしたし、サンプルに挙げられた値をGoogle検索すればOEISがヒットした記憶もあります(肝心のページは失念)。また「100003でわったあまりを求めなさい」という指示から「繰り返し」も連想しやすかったと思います。
RTX1200を衝動買いした話

# 衝動買い

デレステで50連ガシャ回してむしゃくしゃしたので勉強がてらヤフオクで落とした
本当は適当にCisco 1841とCatalyst 2950あたりを揃えたほうが良さそうだが100BASEなため実用的でないため却下
まぁそのうちCCENT勉強用に買いそうではある、HSRP組むならルーター二台用意しないとかー
それとYAMAHA機器を扱ってみたかった
暫く手元には来そうにないので現状環境からどう変えるかとかのメモ

#現状
回線:NTT東フレッツ 光ネクスト　マンション・ギガラインタイプ
RT:BUFFALO WZR-300HP

と言った感じONU直付けだと上下300Mbps出ますがRT噛ますと100Mbpsしか出ません
まぁ5ｋちょいの安物なので仕方ない感はある
がしかし速度が1/3まで低下するのはちょっとなぁといことでRT変えます

#変更後
主系回線:NTT東フレッツ 光ネクスト　マンション・ギガラインタイプ
従系回線：nuromobile 0sim
RT:RTX1200
無線AP:BUFFALO WZR-300HP

と言った感じ
従系回線に0simを使うのはどうせ主系は滅多に落ちることないので
0simなら運用0円ですむのでちょうどいいべということ
回線切り替わったらSMTPトラップでも出してTwitterにつぶやく機構でもつくるか・・・

##セグメント
せっかくRTX1200導入するならVLAN切りたいよねってことで以下のようなセグメントに

全体は```192.168/16```にします
まぁ普通のクラスCのプライベートアドレスですね

1.サーバー管理系:```192.168.0/24```
2.有線Client:```192.168.1/24```
3.無線Client:```192.168.2/24```
4.test:```192.168.100/24```

超適当に区切りました
まぁ勉強ついでなので
2,3間ルーティングはどうしようか考え中AP側でセパレート機能有効にすればいいか・・・・？

#最後に

まぁまだ現物が届いてないので届いたらコンフィグとかを書き連ねようと思います
mailヘッダーの Received: from の意味 (スパムサーバー扱いを受けないために)

## 参考

* [TAINS News No.32 [Page.3]](http://www.tains.tohoku.ac.jp/news/news-32/0510.html)
* [メールヘッダの一覧](http://www.atmarkit.co.jp/fnetwork/rensai/netpro03/mail-header.html)

## 例

```rb
Received: from srv01.com (srv01 [1.2.3.4])
```

|項目|説明|説明2|例|
|:--|:--|:--|:--|
| srv01.com | heloドメイン | 送信側の自己申告 | メール送信したサーバー。これがlocalhost.localdomain だとspamサーバー扱いを受けやすい。mailコマンドではpostfixのhelo設定になるが、rubyのNet::SMTPでメール送信する場合は要指定 |
| srv01 | 逆引き | 受信側が付ける |  メールを受信したサーバーが付ける。例えばDNS設定されていなくても受信したサーバーのhostsに記述があれば、それが付く。なければ unknown となる。 |
| 1.2.3.4 | ip | 送信時に必ず付く | 送信サーバーのIP |

* [heloドメインを指定する](http://qiita.com/tukiyo3/items/05f7975cf616f31d5337)
    * `telnet localhost 25`をした後`ehlo localhost`して安心してはいけない。
* [spamサーバー扱い](http://qiita.com/tukiyo3/items/98047c65934f8557b1a1)
* [fromが<>の場合](http://qiita.com/tukiyo3/items/8a9889a8dde507f09ab6)
* [unknown](http://qiita.com/tukiyo3/items/3ef9a9a251505044d51a) のメールを受信拒否設定
* hostsで同じIPアドレスに対する記述が複数見つかった場合の優先順位
    * １行の中で一番左に書いたものが優先
    * 一番最終行に書いたものが優先
    * もしかしたら[pdns-recursor](http://qiita.com/tukiyo3/items/cf22003467ab2afbd3a2)使っているおかげで実現できているものかも。
「500 Internal Server Error」がでたとき、２度も同じ失敗

結論を先に


```
print "Content-type:text/html\n\n";
```
が、抜けていた。
２回も同じ失敗をした。



cgiを実行したときに Internal Server Error　となった。

その前にコマンドラインから実行して、パラメータを渡してのテストも
行っている。

コマンドラインから動いて、ブラウザからjavascript経由で
実行するとエラーになってしまう。

原因を検索すると、
・CGIファイルやディレクトリのパーミッションに誤りがある。
・.htaccess の記述、書式、コードに誤りがある。
・CGIプログラムの設定に誤りがある（CGI内部エラー）
と出てくる。

いや、だからプログラムは動くのに…

毎回パーミションは気にしてしまう。それ以前の問題だった。

※　補足　「End of script output before headers: ecoDBinsertPl.cgi」
insert文は正しく実行されるのに、上記のログが出力されていた。

これもまた、Content-typeを書いていなかったことが原因だ。
cgiを実行する側に値を返さないので、Content-typeのprintを削除したら
エラーになった。
そうなんだ、へぇという感じです。
技術英語 > lengthy if statements, case statements, or [copious] subclasses.

@ Code Complete (No. 13923 / 36077)

> lengthy if statements, case statements, or copious subclasses.

http://ejje.weblio.jp/content/copious
> (供給量・使用量などの点で)豊富な、おびただしい、言葉数の多い、こまごまと述べる、多作な、内容の豊富な

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

> fair amount of code

http://qiita.com/7of9/items/84764c36b493cc1e90bb
Vue1.0からVue2.0でハマったこととか

vue1.0からvue2.0の移行は結構大変なのでメモっておきます。絶賛移行中なので随時更新していく予定です。
ここではプラグインもvueに含まれることとします。

## webpackに調整が必要

module.exports内に以下の記述が必要。

```js:webpack.config.js
  resolve: {
    alias: {
      vue: 'vue/dist/vue.js'
    }
  },

```

処理が、 standalone build と runtime-only build に分離されているようで上記設定が必要。
参考：http://bouzuya.hatenablog.com/entry/2016/09/23/235959

## ライフサイクルの変更

![image](https://qiita-image-store.s3.amazonaws.com/0/39134/caf00a90-61b6-8f51-855d-33c0e34f15d6.png)

readyしかほぼ使ってなかったのでmountに差し替えるだけで良かったのですが、色々使ってたらつらそう。
beforeUpDateとupdatedが2で追加。

## {{{html}}}が動かない

v-htmlのみになったので差し替える必要があります。
WYSIWYGエディタとかMarkdownを使っている場合差し替えが必要です。


## vue-routerの挙動とか

vue-routerは1の挙動だとrouteオブジェクト内のactiveやdeactive、readyなどでうまいことやる仕組みだったのですが、大幅に変更されています。
ここが結構書き換えのつらいポイントだと思います。

### ルート単位ガードとコンポーネント内ガード

ルート単位での処理が追加されました。これによりURLに応じた処理が可能になります。
コンポーネント内ガードは今までと同じようにコンポーネント内に処理を書きますが、route内に生やすようなものではなくなっています。

```js:1
export default {
  route: {
    activate: function(transition) {
      // 処理
      transition.next();
    }
  }

```

```js:2
export default {
  beforeRouteEnter (route, redirect, next) {
   //処理
   next();
  }
}
```

v-linkも変更されたりしてるのでドキュメントを読みましょう。

http://router.vuejs.org/ja/advanced/navigation-guards.html

## 他

vuex@next、vue-resourceは今のところ問題なし。

エイヤっとvue1.0で使ってるやつを色々アップデートしてwebpack２にしたらビルドできなくなったりしたので、webpack→webpack2の仕様変更もチェックしたほうが良いかもしれません。
Swift3製ライブラリをCarthage対応したときの手順

#はじめに#
GitHubで公開している自家製ライブラリをCarthageでインストールできるように対応させてみました。備忘のために手順をメモします。
ちなみに、タイトルにSwift3を入れましたが、特に従来の手順と大きく変わるところはありません。アクセスコントロールの修飾子の意味や種類が変わる程度です。

#frameworkを作る#
Cocoa touch frameworkをTargetsに追加します。操作としては、TARGETSの下の+から進んでいけば作れます。

<img width="1049" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/84185/f4e82654-4f3f-9fec-8764-ef20924250e1.png">

次に、SwiftのソースファイルやStoryboardのリソースファイルを入れます。つまり、.swiftファイルは赤で囲ったCompile Sourcesへ。.StoryboardはCopy Bundle Resourcesへ。

#アクセスコントロールを指定する#
公開したいクラスや関数にpublicないしopenをつけます。

Swift 2.3とSwift 3でpublicの意味が違うので、注意します。Swift 3からは、継承を許す場合を区別してopenを使えるようになりました。

Swift 3からのアクセスコントロールの仕様変更については、[Swift 3からのアクセスコントロール](http://qiita.com/hironytic/items/6cc68ca93b428ba9194e)が詳しいです。

#sharedにする#
Carthageでインストールできるように、上のframeworkターゲットをsharedにします。つまり、Schemeの切り替えボタンから、frameworkのターゲットを指定して、Manage schemesを選択します。frameworkのターゲットの右端のSharedのチェックを入れます。Closeします。

#検証する#
Carthageによるインストールができるか検証します。つまり、ターミナルを起動してリポジトリのディレクトリに移動し、次のコマンドを実行します。
`carthage build --no-skip-current` 

リポジトリフォルダ下にCarthage/Buildという階層が用意され、.frameworkファイルなどが作成できていれば正常です。
なお、これ自体をリモートリポジトリにプッシュする必要はありません。

#プッシュする#
以上で作ったローカルリポジトリの内容を、しかるべきブランチでコミットし、リモートにプッシュします。
基本的にこれでCarthage対応は完了です。
なお、GitHubのRelease管理のためのバージョンタグはここでつけておくと忘れないと思います。

#README.mdの編集#
README.mdにCarthage対応を示すこういうバッヂをつけることができます。
[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/hsylife/SwiftyPickerPopover)

このコードを記述すれば表示されます。

```html
[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/hsylife/SwiftyPickerPopover)
```
一方、インストール方法についての説明文面は、このように書けます。

> For Installing with Carthage, add it to your Cartfile.
`github "hsylife/SwiftyPickerPopover"`

#Carthageのframeworkのアップデートコマンド#
ところで、サンプルプロジェクトにCarthageのframeworkを含めている場合、その更新は次のコマンドでできます。
Cartfileのあるディレクトリに移動した後で:
`carthage update --platform iOS`

#参考リンク#
[Carthageの配布の仕方（すっごい簡単！）](http://qiita.com/morizotter/items/56658ed7920059beaa8e)は簡潔に手順を説明してくださっています。
[Carthageを使ってビルド時間を短縮しよう](http://qiita.com/yutat93/items/97fe9bc2bf2e97da7ec1)はインストールを試すための手順について説明があります。
[[Swift] CocoaPodsとCarthageの違い / ライブラリ管理](http://qiita.com/nori0620/items/b81ae171f0e82b0c2d8a)
[hsylife/SwiftyPickerPopover](https://github.com/hsylife/SwiftyPickerPopover)は、実際に試したリポジトリです。
python3で裁判の判例データからWord Cloudを生成する

- 判例データ(PDF)をダウンロード
    - http://www.courts.go.jp/app/hanrei_jp/search1
- Automatorを使用してPDFをtextに変換
    - http://qiita.com/yuki_bg/items/2e6efe93992d83752312
- その後、MeCabやwordcloud等をインストール
    - [anacondaをインストール](http://qiita.com/berry-clione/items/24fb5d97e4c458c0fc28)すればいらないかも
    - mecab辞書の強いやつ(neologd)をclone


```shell-session:(zsh)
brew install mecab mecab-ipadic
pip3.5 install mecab-python3

pip3.5 install wordcloud
pip3.5 install numpy Pillow matplotlib # wordcloudを使用するために必要なライブラリ
#brew install numpy # error
#brew install homebrew/python/numpy # smthngs wrong...
#sudo xcode-select --install # doesnt work...

### 新語が追加されたMeCab辞書"mecab-ipadic-neologd"を取得
cd /usr/local/lib/mecab/dic
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
./bin/install-mecab-ipadic-neologd -n
```

---

```python:wordcloud.py
import MeCab
from os import path
from wordcloud import WordCloud
import matplotlib.pyplot as plt

pos_list = [10, 11, 31, 32, 34]
pos_list.extend(list(range(36,50)))
pos_list.extend([59, 60, 62, 67])
def create_mecab_list(text):
	mecab_list = []
	mecab = MeCab.Tagger("-Ochasen -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd")
	mecab.parse("")
	# encoding = text.encode('utf-8')
	node = mecab.parseToNode(text)
	while node:
		if len(node.surface) > 1:
			if node.posid in pos_list:
				morpheme = node.surface
				mecab_list.append(morpheme)
		node = node.next
	return mecab_list

with open("./086064_hanrei_utf8.txt", "r") as file:
	hanrei = file.read()

string = " ".join(create_mecab_list(hanrei))#.decode("utf-8")


fpath = "/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc"
wordcloud = WordCloud(
	# background_color="white",
	max_font_size=40,
	relative_scaling=.5,
	# width=900,
	# height=500,
	font_path=fpath
	).generate(string)
plt.figure()
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

```

```shell-session:(zsh)
python3 wordcloud.py
```


![Screen Shot 2016-10-01 at 1.51.19 AM.png](https://qiita-image-store.s3.amazonaws.com/0/133933/efe9139d-a02f-e493-d918-384b0c7a7347.png)
Puppet 4.7 リリースノート ピックアップ

Puppet4.7.0(2016/9/22リリース)の、リリースノートで個人的に気になる変更をピックアップしてみました。動作確認とかはしてないので、間違っている部分があればご指摘ください。

# Puppet 4.7.0

Released September 22, 2016.

## Critical bug fix

4.7.0は、重大バグ修正１つのみです。
リリースノートの記載がわかりにくいですが、environmentを使ってパス指定している場合に影響があるようです。

/environment/productionのつもりで、

```
/environment/${::environment}
```

で指定している箇所で、本来マッチしないはずの
/status/environment/productionなどにもマッチするバグが修正されているようです。

## 補足情報

関連しそうなバグチケットと、GitHubのコミットログです。
リリースノートだけでは影響範囲がわかりにくいので、このへんが参考になるかもしれません。

- [Puppet's fileserver seems to be unable to handle a path containing a directory called "environment"](https://tickets.puppetlabs.com/browse/PUP-6636)
- [(PUP-6636) Only match /environment/:env route as the whole path ](https://github.com/puppetlabs/puppet/commit/13f2c994c976b52ba01e2ffe975d2029066aba33)

# 参考

Puppet 4.7 Release Notes
https://docs.puppet.com/puppet/4.7/reference/release_notes.html
初めてLaravelを使用して開発したときのまとめ

# Laravel5.3を使ってみての覚書です
(思いついたら加筆していくかも)

## Windows + Vagrant(CentOS7.2)でVagrantフォルダで開発したためnpm install でエラーが出る
シンボリックリンクが貼れないためですので、Vagrantフォルダではない適当なフォルダでpackage.jsonを持ってきてnpm installをした後./node_moduleをVagrantフォルダにコピーして解決
※gulpコマンドは./node_modules/gulp/bin/gulp.jsとなる

## migrationで毎回エラーが出る
テーブル定義変更時に毎回テーブル存在するとかというエラーが出る・・・SQLiteのせい？？？面倒だけど毎回テーブル消して対応

## SQLiteでのDate型の条件判定＆ソートがおかしい
文字列でソートしてるからっぽい・・・諦めて年月日を分けて数値型に・・・・DBのせいだからPHPFrameworkで吸収してくれない・・・よね

## サーバーの起動
php artisan serve --host 0.0.0.0
でLaravelフレームワーク用のサーバーが起動するので
http://VagrantのIPアドレス:8000/
でアクセスできる(--host 0.0.0.0を忘れるとローカルからしかアクセスできない)

## 画面の作り方
### Viewに関して
blade使用してやるので./views/に作る(.blade.php)
中身は
<pre>
@extends('layouts.app')
@section('content')
&lt;sampletemplate&gt;
&lt;/sampletemplate&gt;
@endsection
</pre>
のようにする ※sampletemplateはVueでのカスタムテンプレート名

### Vueファイルに関して
./resources/assets/js/components/
にファイルを置いていく(Example.vueがあるのでお手本にしましょう)

リアクティブコンポーネント(Vueの利用)はVueファイル内で記述していく

./resources/assets/js/
にapp.jsがあるので

Vue.component('sampletemplate', require('./components/Vueファイル名'));

を追加すればOK

### gulp
gulpを使用してjsおよびcssファイルを纏める必要があるので実行することでページに反映される


## わからなかったこと
・Ajaxでデータ取得するところはapiのrouteにしたかったけど認証エラーが出てしまうので結局はwebのrouteでやってしまってる
・PHPの値をVueに渡す手法(今回はテンプレートのprop( http://jp.vuejs.org/api/#props )を利用して回避したけどうまいやり方があるかもしれない)

# 完成したもの
出勤管理をするWebアプリ
![image](https://qiita-image-store.s3.amazonaws.com/0/142784/c8563c40-10e3-1966-4677-9525ba5b2c14.png)

エクセルで書いていくのが面倒なのでLaravel触ってみるのにちょうどいいぐらいの規模っぽい気がしたから作った

# 作ってみての感想
・何故かLaravel+Vueでの作り方みたいなのの資料が少ないので色々手間取った
・Vueを初めて触ったので多少お作法を理解するのに手間取った
・View部分はWebデザインできたらもっと見た目良くできたのにと思う
・慣れたらこんなの一日かければできるんだろうなぁ・・・(一週間かかったorz

# 作ったもの置き場(GitHubじゃなくてGitLabを使ってます)
https://gitlab.com/rururu3/attendance
海外の業者からドメインを買ってみた

#そのドメインがほしい
妥協して「.wiki」ドメインにするか。
いや、どうしても「.com」のドメインが欲しかった。
相手は外国人、日本語は通じない。
偏差値45程度の高校で英語の成績は学年ビリを争うレベル。
でも欲しい！というか、中古ドメインの取引してみたい。
そんな物欲＆好奇心を満たすために海外の人間相手に中古ドメインを購入してみました。

トランスファーは現在実行中ですが
無事にドメインの取引が完了したため、ここに備忘録を残しておきます。


#買う前に事前調査
中古ドメインなのでGoogleさん的に目を付けられてる粗悪なドメインである場合、検索に引っかからないなどの問題が想定される。
そのため、買う前にそのドメインが粗悪なものでないかを事前に調査をした。

◆Whois情報を調べる
[http://whois.domaintools.com/](http://whois.domaintools.com/)
◆過去サイト見る
[https://archive.org/](https://archive.org/)


以上の２つこれだけを行った。
粗悪なドメインではないようだった。

過去サイトを見てみると、一度もWebサイトとして存在しておらず転売用に取得されたんじゃないかと思った。
また、14年間も同じ人が所持していることもWhois情報からわかった。
つまり、売れてない。　＝　交渉が通りやすい！？という考えで戦いに挑むことにした。

#販売者にオファーする
希望のドメインへ飛ぶと販売者のWebページが表示される。

![c714bced21c9aabe64f6452d0a82d41c.jpg](https://qiita-image-store.s3.amazonaws.com/0/35783/7337e51f-f930-51db-3e24-9c59d8e5d3d5.jpeg)

お相手は「jimmy.com」さん。よろしく。
名前を入力して、、メアド入力して、、希望額は$30っと。
適正は$500以上だろうとは思いながら$30で勝負に出た。

オファーを送り、その日は終了した。

#jimmy.comとの値段交渉

ジミーさん
![9db413cb7b6b44fbe99312382f641625.png](https://qiita-image-store.s3.amazonaws.com/0/35783/8f8c245e-c72d-2712-000d-67dc770774dc.png)
>4000ドルでどや。

ふざけんな。

ぼく
![4aae64d673df2d399ec39c674b78cd86.png](https://qiita-image-store.s3.amazonaws.com/0/35783/57417505-0cb4-be79-27b8-85b00315ef71.png)
伝えたいニュアンス↓
>鬼高い。50~100ドルなら支払うよ！
>ちょっち値段下げてほしいな。

ジミーさん
![65994ae901952e9e1433e46f62ad7dd2.png](https://qiita-image-store.s3.amazonaws.com/0/35783/558d0911-b749-ae07-facb-9c4228c2c130.png)
>500ドルでどや？

まだまだ高い。
もっと下げてくれませんか？

ジミーさん
![c5f196f3c871538977c2e9b5c5094c11.png](https://qiita-image-store.s3.amazonaws.com/0/35783/42594581-a402-7b42-1597-20627d50432f.png)
>めっちゃ値下げしたし、$400以下はキツイよ。

まだ高いなぁ。
やっぱり取引やめとくね！とお伝えしたところ、、、

ジミーさん
![86abce446a22eaa1bb6732295d62ef37.png](https://qiita-image-store.s3.amazonaws.com/0/35783/1e146f04-ae22-0c94-34fe-3d55a67c2f04.png)
>（多分）$250でどや。もうコレ以上は無理。

お怒りのご様子。
この金額を提示された僕はかなり悩んだ挙句、値段以上の価値があると思い購入を決定。

#Paypalで支払い後、ドメイン管理権限を受け取る、そして。

そのドメインはenom.comで管理されているものだった。
そのため、enom.comにアカウントを作成して欲しいとのことだったので、早速取得してユーザー名を伝えた。

すぐにドメインはプッシュされ、自動的にwhois情報がアカウント情報の通りに書き換えられ
目的の中古ドメインの権限は自分のものとなった。

ただ、このままではenom.comで更新料をドル払いしなくてはいけない。
愛用しているレジストラ「お名前.com」へトランスファーしたい。

#enom.com→お名前.comへ移管する
「Domain Manager」の「Registered Domains」より該当のドメインを見つける。
「General Settings」から「Register-Lock」をDisableにして一旦Saveする。

続けて、Auth Info / EPP Key の欄をクリックしてメールを受け取る。
メールには15桁程度のEPP Keyが記載されている。

[http://www.onamae.com/service/d-transfer/](http://www.onamae.com/service/d-transfer/)
こちらのリンクに今回トランスファーするドメインを入力する。
EPP Keyを入れる箇所があるので入れて送信。

あとは待つだけです。（多分）
↑イマココ！

#さいごに
5文字の.comドメインなので妥当といえば妥当な価格ですが、でもやっぱり$250っていうのはちょっと高いですね。
提示された金額をハイハイ言っていきなり購入するのではなく、一度値下げ交渉をしてから検討しましょう。

あの欲しかったドメイン、高額で販売されてる。。。諦めよう。
となる前に一度購入検討に踏み出してほしくてこの記事を書きました。

ボーッと書いただけなのでまとまりのない文章ですが、最後まで読んでいただきありがとうございました。
CentOS7に構築したGitLab8を日本語化

# [概要]
下記の方がなんとGitLabの日本語化 patch を公開してくれているので、それを使い日本語化対応をさせる。
使い方は、基本下記のGithubに書かれてますので、それに従って行います。
https://github.com/ksoichiro/gitlab-i18n-patch

# [事前準備]
CentOS7上にGitLabが構築されていること。

# [作業内容]
## gitインストール
```bash
$ sudo yum install git
```

## patchコマンドインストール
```bash
$ sudo yum install patch
```

## リポジトリをclone
```bash
$ cd /usr/local/src/
$ sudo git clone https://github.com/ksoichiro/gitlab-i18n-patch.git
```

## パッチ適用
対応しているバージョン毎にディレクトリが分かれいるので該当する patch を適用してください。

```bash
$ cd /opt/gitlab/embedded/service/gitlab-rails/
$ sudo patch -p1 < /usr/local/src/gitlab-i18n-patch/patches/v8.11.7/app_ja.patch
```

## プリコンパイルし直す
### rootに権限で実行
```bash
$ sudo -s
$ cd /opt/gitlab/embedded/service/gitlab-rails
$ rm -rf public/assets
$ export PATH=/opt/gitlab/embedded/bin:$PATH
$ bundle exec rake assets:precompile RAILS_ENV=production
$ exit
```

## 設定を反映
一応反映させる。
自分の環境では、下記を実行して反映されました。

```bash
sudo gitlab-ctl reconfigure
```

## [事後確認・作業]
GitLabにアクセスして日本語になっているのを確認する。
mitmproxyのインストール(CentOS7)


# はじめに
ここら辺の記事
http://qiita.com/tags/mitmproxy
特にこの記事とか
http://qiita.com/hkurokawa/items/9034274cc1b9e1405c68
を見て興味が出て使って見たくなりました。
Ubuntu, MacOSX, Windowsのインストール方法については公式サイト
http://docs.mitmproxy.org/en/stable/install.html
にあるのですがCentOSについてはないので記録して見ました。
基本は

```shell-session
pip install mitmproxy
```

ですが…さてさてCentOSで準備することは？

# インストール
## pipの準備
```shell-session
$ sudo yum install -y epel-release
$ sudo yum install -y python-pip
```

## 開発環境・ヘッダー・ライブラリ等
Ubuntuの方法を参考にして見た。

```shell-session
$ sudo yum install -y python-devel \
libffi-devel \
openssl-devel \
libxml2-devel \
libxslt-devel \
libjpeg-devel \
zlib zlib-devel
```
うーん。色々コンパイルしないとダメみたい。gccが入ってなければ入れる。

```shell-session
$ sudo yum install -y gcc
```

## mitmproxy本体
```shell-session
$ sudo pip install mitmproxy
```
これでインストールできました。

### おまけ：pipでインストールされるもの
```
Successfully installed Flask-0.10.1 Jinja2-2.8 MarkupSafe-0.23 Pillow-3.2.0 PyYAML-3.12 Werkzeug-0.11.11 argh-0.26.2 blinker-1.4 click-6.6 configargparse-0.10.0 construct-2.5.3 cryptography-1.3.4 h2-2.4.1 hpack-2.3.0 html2text-2016.4.2 hyperframe-3.2.0 itsdangerous-0.24 lxml-3.6.4 mitmproxy-0.17 passlib-1.6.5 pathtools-0.1.2 pyOpenSSL-16.1.0 pyparsing-2.1.9 pyperclip-1.5.27 requests-2.9.2 urwid-1.3.1 watchdog-0.8.3
```
PyYAMLとかpyOpenSSLとかはyumで入れても良いのかも。
Oracle試験対策用にdockerでoracle 12cを入れ、参考書サンプルデータをゴニョゴニョするまで


##事前準備
[Homebrew](http://brew.sh)がインストールされていること。
[docker for mac](https://docs.docker.com/engine/installation/mac/)がインストールされていること。
資格試験本：オラクルマスター教科書 Bronze Oracle Database 12c SQL基礎

##oracle 12cのインストール
https://github.com/MaksymBilenko/docker-oracle-12c
docker-hubで漁ったら星たくさんで良さそうだったので・・・コレを入れます。

```
$ docker pull sath89/oracle-12c
$ docker run -d -p 8080:8080 -p 1521:1521 sath89/oracle-12c
```

##Oracleクライアントダウンロード
Oracleで適当にアカウントを作成し、下記のUSサイトからダウンロード。
[instantclient-basic](http://download.oracle.com/otn/mac/instantclient/121020/instantclient-basic-macos.x64-12.1.0.2.0.zip)
[instantclient-sqlplus](http://download.oracle.com/otn/mac/instantclient/121020/instantclient-sqlplus-macos.x64-12.1.0.2.0.zip)

それぞれunzipで展開し、一つのフォルダ内にまとめ、/usr/local/Oracle に移動させておく。
＊別に上記以外の好きな場所でもいいです。

.bash_profileに下記を記述し、sourceで再読み込み。

```
## oracle client
export ORACLE_HOME=/usr/local/Oracle
export PATH=$ORACLE_HOME:$PATH
export DYLD_LIBRARY_PATH=/usr/local/Oracle
export NLS_LANG=Japanese_Japan.AL32UTF8
```
＊大きな会社の基幹系だと汎用機独自拡張で文字コードぐちゃぐちゃらしいので要確認。

　Sun時代にOracleへ移行してるような会社だとEUCベースが多いのかな？？？
　とりあえずココでは学習用ってことでUTF8にしときます。
　
##rlwrapのインストール
素のsqplusだと履歴が出せないらしいので、rlwrapをインストールする。

```
$ brew install rlwrap
$ rlwrap sqlplus system/oracle@//localhost:1521/xe.oracle.docker
SQL> select * from tab;
SQL> quit
```

##資格試験用サンプルデータのインストール
[オラクルマスター教科書 Bronze Oracle Database 12c SQL基礎](http://www.shoeisha.co.jp/book/detail/9784798136547)から
スクリプトファイル（CRE_DATA.zip） をダウンロード。

CRE_DATA.sqlの一行目を以下に書き換え。

```
CONNECT system/oracle@//localhost:1521/xe.oracle.docker
```

3行目を以下に書き換え。

```SQL
CONNECT sql1/sql1@localhost:1521/xe.oracle.docker
```


CRE_SQL1.sqlの一行目を以下に書き換え。

```SQL
CONNECT system/oracle@//localhost:1521/xe.oracle.docker
```

DROP USER sql1 CASCADE; の下に以下を追記。

```SQL
create tablespace "EXAMPLE" datafile "/tmp/example.dbf" size 100M;
```
先に表示領域を作成しておかないとエラーが出たので・・・ファイルの場所は適当に。


```
$ cd ~/Downloads/CRE_DATA
$ rlwrap sqlplus system/oracle@//localhost:1521/xe.oracle.docker
SQL> set linesize 1000
SQL> show linesize;
SQL> @CRE_DATA.sql
```
行表示を広めに設定しておくと文字列が折り返しされない。とりあえず1000で。
エラー表示されずコミットされたのを確認したらサンプルデータを表示する。

```SQL
SQL> select * from employees;
SQL> quit
```

##参考
[SQL*PlusをMacOSX Marvericsにインストール](http://qiita.com/meganii/items/80bfffb638581b7e2103)
SourceTreeでリモートリポジトリのURLを変更する

まず「Repository Settings」を開きます。

![スクリーンショット 2016-10-01 0.40.19.png](https://qiita-image-store.s3.amazonaws.com/0/26205/c4828cc9-634d-591f-da6b-a62e63d9f9ab.png)


次に「Remotes」タブを選択すると、設定されているリモートリポジトリが表示されているのでそこでURLを変更します。

![スクリーンショット 2016-10-01 0.43.17.png](https://qiita-image-store.s3.amazonaws.com/0/26205/2ed20bdc-8343-a559-d4d1-861717018cd1.png)

おわり。
Python版OpenCVを動かすVMを作った

毎回環境構築が大変すぎるのでVMを起動するだけでOpenCVを動かせるようにした。
[fleth/ubuntu-14.04_python2.7.6_opencv3.1](https://atlas.hashicorp.com/fleth/boxes/ubuntu-14.04_python2.7.6_opencv3.1/versions/1.0)

# 各種バージョン
 - Ubuntu 14.04
 - Python 2.7.6
 - OpenCV 3.1

# インストール
 - [Vagrant](https://www.vagrantup.com/downloads.html)
 - [VirtualBox](https://www.virtualbox.org/wiki/Downloads)

インストール後、以下のコマンドを実行。

```
mkdir -p ~/vms/opencv
cd ~/vms/opencv
vagrant init fleth/ubuntu-14.04_python2.7.6_opencv3.1; vagrant up --provider virtualbox
```

これで今後は以下のコマンドでVMを起動・ログインしてPython版OpenCVを利用できます。

```
cd ~/vms/opencv
vagrant up
vagrant ssh
```

# 参考
 - [ubuntu-16-04にopencv-3-1をビルドしてインストールする](http://www.hiroom2.com/2016/04/26/ubuntu-16-04%E3%81%ABopencv-3-1%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%97%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/)
 - [Cloud9にOpenCVをインストールしてPythonで実行する方法](http://qiita.com/youhei_nakagawa/items/1e40417fb94d4f8ffe62)
Rails newでとりあえずした方が良い設定

# 概要

railsでプロジェクトを立ち上げる時、大体毎回同じ設定をしている気がしたので、まとめたいと思います。
あくまで自分の設定ですので、大幅な信頼は寄せないでください。
メインはapplication.rb内でする設定になっています。

# 設定

まずはapplication.rb内でする設定から

```ruby:application.rb
  class Application < Rails::Application
    config.action_view.field_error_proc = proc { |html_tag, instance| html_tag }
    config.time_zone = 'Asia/Tokyo'
    config.i18n.default_locale = :ja

    config.generators do |g|
      g.test_framework       :rspec, view_specs: false, helper_specs: false, fixture: true
      g.helper               false
      g.stylesheets          false
      g.javascripts          false
      g.fixture_replacement  :factory_girl, dir: "spec/support/factories"
    end
  end
```

上から順に解説していきたいと思います。
### config.action_view.field_error_proc = proc { |html_tag, instance| html_tag }
エラーが出た際railsは自動でエラーメッセージに```<div class="field-with-errors"></div>```というクラスを挿入します。
これが原因でレイアウトが崩れる可能性があるのでクラスを挿入しないようにする設定です。
他のクラスを挿入したい場合などは以下に方法が乗っているので確認してみてください。
http://qiita.com/youcune/items/76a50ae3a2863a8f8b00
http://qiita.com/kawahiro311/items/e48c53c978d27a9192cc

### config.time_zone = 'Asia/Tokyo'
コードから想像がつきますがタイムゾーンを日本に変更するコードです。
時間扱うアプリでサマータイムとかなったらたまらん。

### config.i18n.default_locale = :ja
エラーメッセージやラベルの日本語化を行うためのコードです。
config/locales/ja.ymlに設定ファイルを入れると、日本語化を行うことができます。
詳しいやり方についてはこちらを。
http://morizyun.github.io/blog/i18n-english-rails-ruby-many-languages/

### config.generators do |g| ~~~~~~ end
config.generators do |g|以下のコードは、rails genarateした時の作成ファイル変更するための設定です。
上の設定だと

- テストフレームワークはRspec
- viewとhelperのテストは作成しない
- helper,css,jsファイルは作成しない
- fixtureはfactory_girlを使用

という設定になります。
他にも結構いろいろ設定できるそうなので気になる方は確認してみてください。
http://railsguides.jp/generators.html

次はgemファイルです。デフォルトのgemは抜いています。

```ruby:Gemfile

group :development, :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
  gem 'pry-rails'
  gem 'better_errors'
  gem 'binding_of_caller'
end

group :development do
  gem 'letter_opener'
end

group :test do
  gem 'ffaker'
  gem 'database_cleaner', '~> 1.3.0'
end

```

#### rspec-rails
rspecです。
http://qiita.com/jnchito/items/42193d066bd61c740612

#### factory_girl_rails
テストデータ入れるやつです。
http://qiita.com/muran001/items/436fd07eba1db18ed622

#### pry
binding.pryが最強です。
http://qiita.com/k0kubun/items/b118e9ccaef8707c4d9f

#### better_errors, binding_of_caller
エラー画面がかっこよくなってやる気が出ます。
コンソールも使えます。
http://morizyun.github.io/blog/better-error-gem-rails-ruby-rack/

#### letter_opener
ローカルで送ったメールをブラウザで表示できます。
http://qiita.com/k-shogo/items/d85905535a64e82a3b2b

#### ffaker
テストの際、名前などを適当に作ってくれるやつです。
http://qiita.com/ariarijp/items/57f7afe566638a980903

#### database_cleaner
テスト用DBをきれいにします。
http://qiita.com/yoshitsugu/items/3470dbcadfdd677be543

# まとめ
rails newした時にした方が良いと思う設定をまとめてみました。
自分自身手探りな状況なので、便利な初期設定があれば教えていただけると嬉しいです。
watchifyで変更が無い時の再バンドルをスキップする

watchifyを利用してる際、保存の度に変更が無くても再バンドルされるのを煩わしいと思った事は無いでしょうか？、僕はあります。
しかしwatchifyには再バンドルスキップのような機能はなく、またそのような方法も見つけられませんでした、なので利便性を考え、watchify用のプラグイン(changed-bundle)として今回作成しました。
そのプラグイン解説も兼ねてどのように対応出来たかを紹介します。

[changed-bundleへのgithubリンクはこちら](https://github.com/wordijp/changed-bundle)

# 使い方

インストールして

```shell-session
$ npm install changed-bundle
```

watchify実行時にこのプラグインを指定

```shell-session
$ watchify -v -p [changed-bundle] -o public/bundle.js src/index.js
```

初回はソースをハッシュ値としてキャッシュするだけなので、従来通りバンドルされます。

```shell-session
534086 bytes written to public/bundle.js (0.36 seconds)
```

2回目からは、バンドルする際にバンドルファイルの内容が前回のキャッシュと同じかをチェックし、同じ場合は再バンドルがスキップされるようになります。

```shell-session
*** skip write to public/bundle.js (0.01 seconds) ***
534088 bytes written to public/bundle.js (0.02 seconds)
*** skip write to public/bundle.js (0.01 seconds) ***
```

watchifyにもキャッシュの仕組みがありますが、導入によりファイル出力自体の処理を省けます。
頻繁にファイルを保存して不要な再バンドルが走ってディスクI/Oのボトルネックが気になったり、バンドルファイル出力のトリガ操作がある際に効果があると思います。


# どういう仕組みでスキップしてるか

以下は技術的な話になります。

## gulpの場合

gulp、というかgulpが内部で使用しているStream APIでファイルを出力する際は、through2モジュールによるパイプライン内にバッファ(ソースコード文字列等)があれば、最終的にgulp.destからファイルへと出力されます。
なのでgulpを使ってる際は、このパイプライン内で意図的にバッファを空にすればファイル出力をスキップ出来ます。

```js
gulp.src('index.js')
  ... ここでバッファを空に出来れば出力されない ...
  .pipe(gulp.dest('public'))
```

**[gulp-changed](https://github.com/sindresorhus/gulp-changed)等がそのような実装になっています**


## watchifyコマンドの場合

骨が折れたのがこの時の実装方法です、watchifyコマンドのソース(node_modules/watchify/bin/cmd.js)を読んでも普通の方法ではスキップする手立てがなく、ハック的な手法を使う必要がありました。
パイプラインを無理やり作り変えると他のプラグインに影響が出かねないので、一端ファイル出力用のstreamがパイプラインに組み込まれるのを待った後、そのstreamをパイプラインから取り除く方法を取っています。
詳しくはソースをどうぞ。
iOSのアクセシビリティ(VoiceOver)対応まとめ

# VoiceOverとは
視覚障害者の方向けの音声読み上げ機能。
[設定]アプリの[一般]-[アクセシビリティ]から設定できる。

# プログラミングガイド
[iOSアクセシビリティプログラミングガイド(日本語)](https://developer.apple.com/jp/documentation/iPhoneAccessibility.pdf)

# プログラム
プログラム上で、読み上げる音声やカーソルを当てるかどうかなどを制御する方法を記載する。

## UIAccessibility
基本的にUIAccessibilityのプロパティに値をセットすることで制御する。
UIViewやUIControllのサブクラスはデフォルトで実装されている。
主に自前のカスタムビューに対して実装する必要があるかと思います。

### isAccessibilityElement
VoiceOverの対象にする場合はisAccessibilityElementにYESをセット。

```
self.isAccessibilityElement = YES;
```

サブビューを含む場合、親ビューのisAccessibilityElementがYESの場合はサブビューにカーソルは当たらない。
親ビューのisAccessibilityElementをNOにした場合、(サブビューのisAccessibilityElementがYESであれば)カーソルがあたる。

### accessibilityElementsHidden
UITableViewやUICollectionViewではView自体のisAccessibilityElementをNOにしても内部のセルなどにカーソルが当たってしまう。
サブビューも含めてView全体をアクセシビリティ対象から外したい場合はaccessibilityElementsHiddenをYESにする。

```
// UITableViewControllerのサブクラスとかで
self.tableView.accessibilityElementsHidden= YES;
```

### accessibilityLabel
カーソルが当たった時に読み上げるテキストを指定。

```
self.accessibilityLabel = @"読み上げるテキスト";
```

UILabelやUITextFieldはデフォルトで設定されているテキストが読み上げられるようになっている。
UIButtonやUIImageViewなどで設定されているイメージのリソースIDが読み上げられたりするため、必要に応じてテキストを設定する。

### accessibilityHint
ユーザーが操作するためのヒントを指定。

たとえば、スイッチとかテキストフィールドにカーソル当たった時とかに使う。
UILabelなどと組み合わせたViewのときに、ラベルの方はカーソル当てないようにしておいて、別途ヒントを読み上げるといった使い方ができる。

```
// ユーザー名
UILabel* userNameLabel = [UILabel alloc]init];
userNameLabel.text = @"ユーザー名";

// ラベルにはカーソルを当てない
userNameLabel.isAccessibilityElement = NO;

// ユーザー名のフィールド
UITextField* userNameField = [[UITextField alloc] init];

// フィールドにカーソルが当たった時、「ユーザー名」+「フィールドに入力された文字列」を読み上げる
userNameField.accessibilityHint = userNameLabel.text;
```

### accessibilityTraits
ビューの特性を指定。
カーソルが当たった時、「～～ボタン」、「～～イメージ」のように特性も読み上げられるため、必要あれば指定する。

```
// 特性をボタンにする
self.accessibilityTraits = UIAccessibilityTraitButton;
```

カスタムビューのTraitsの決まり方はちゃんと調べていないが、「ボタンとして扱いたいが、デフォルトだとイメージになっている」といったことがある。

## 端末のVoiceOver設定がOnになっているか取得したい
UIAccessibilityIsVoiceOverRunning()がYESかどうかで判定できる。

```
if (UIAccessibilityIsVoiceOverRunning()) {
    // VoiceOverオンのときの処理
}
```

## 指定したビューにカーソルを当てたい
UIAccessibilityPostNotificationを使う。

```
// hogeは何かのビュー
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, hoge);
```


以上。
prestoで指定日からクエリ実行日までの日付の一覧を取得する

## 背景

- 日別集計データの歯抜けを埋めるため、指定期間のすべての日付がほしい
- Postgresだと思ってGENERATE_SERIESを利用しようとしたがエラーが発生した
 - 括弧の対応がとれていないエラー

## 考え方

- タイムリミットが3時間程度しかなかったので出来そうなことを組み合わせる
- SEQUENCE関数を利用して、指定期間のタイムスタンプの配列を生成
 1. 開始時刻のタイムスタンプを`TD_TIME_PARSE`を利用して生成
 2. 現在日時をタイムスタンプに変換した上でintにキャスト
 3. 第3引数に1日分の秒数を指定することで1日間隔のリストが作成される
- UNNESTを利用して、上記で作成した配列を行に変換する
- ただ、もっといい方法がいくらでもありそう

```sql
SELECT
 TD_TIME_FORMAT(n, 'yyyyMMdd', 'JST') AS yyyymmdd
FROM (
  SELECT n1
  FROM (
    VALUES
      SEQUENCE(TD_TIME_PARSE('2016-09-27', 'JST'), CAST(TO_UNIXTIME(NOW()) as INTEGER), 60 * 60 * 24)
  ) AS x (n1)
) t1
CROSS JOIN UNNEST(n1) AS t (n);
```
Xcode8+Swift3.0対応

#思い立ったが吉日

Swift3.0に対応してないpodは徹底的に切っていく姿勢でXcode8+Swift3に対応することにした。

##Cocoapods update
色々互換性の修復がされているので1.1.0.rc.2を入れる

`gem install -v 1.1.0.rc.2 cocoapods`

もしくはGemfileで管理している場合は

`gem 'cocoapods', '~> 1.1.0', '>= 1.1.0.rc.2'`
とかに変えて
`bundle update`

##Podfile

ライブラリのコンパイルに使用するSwiftバージョンを固定しておく。必須では無いが、恐らくライブラリ側でコンパイラの指定がされていないとコンパイルに失敗するのでPodfileの末尾に書いておく。

```ruby:Podfile
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |configuration|
      configuration.build_settings['SWIFT_VERSION'] = "3.0"
    end
  end
end
```

###ライブラリをSwift3.0版に変更する

基本的に、メインストリームのブランチがswift3.0に対応しているのであれば

`pod 'Alamofire'`

のように指定すれば良い。
とりあえず全てこの形にしてみて（プライベートリポジトリのpodを使っている場合は指定を消さないように注意）

`pod update`

する。
そのままworkspaceを開いてビルドする。通れば良いが、ライブラリ側でエラーが出ることがある。
特にOptionalやシンタックスのエラーの場合はSwift2.3のライブラリである可能性が高いのでSwift3.0に対応したコミットを探す

###Swift3.0対応版の探し方

基本的にGithubを見に行く。
ブランチ一覧を見てみてswift3やswift/3.0、swift-3.0と言ったそれっぽいブランチがあれば、

`pod 'Hoge', git: 'git@git.com/hoge', branch: 'swift3'`

のように書き換える。

そこにない場合は、release一覧をみてみる。
最新版がbetaでまだcocoapodsにpushされていない場合はここにあるので

`pod 'Hoge', git: 'git@git.com/hoge', tag: '1.2.0'`

のようにタグを指定する。

そこにもない場合はforkして自分で対応させる。

##プロジェクトの3.0対応

大変（事務作業的な意味で）、ビルド通すのに丸１日かかってしまった…。
コンバートは何も変換してくれなかった、あとで気がついたけどたぶんコンバート中にSourceKitがクラッシュしたからかもしれない。

変更箇所の一例をあげると

・indexOf(hoge)のようなメソッドがindex(Of:hoge)になった
・enumは.Lightが.lightのように小文字から始まるようになった
・NSHogehogeがHogehogeに変わった（NSが取れた）
・dispath_queue系がDispatchQueueクラスになった
・fileprivateやopenといった装飾が増えた

などなど、基本的にビルドして詰まったらそこを修正＋正規表現でプロジェクト全体に反映の流れ。
これにプラスしてライブラリの変更にも対応する。（RxCocoaならrx_tapがrx.tapになった等

###メソッド名
メソッド名やラベルなどSwift3.0のような名前にする。まだやってない。
http://dev.classmethod.jp/smartphone/iphone/swift3_0046_first_label/
とかを見てやる。

#名前空間

例えばObservableという名前はBondもRxSwiftも使っているので、

Bond.Observable
RxSwift.Observable

と表記すれば名前空間を使えると思うかもしれない。が、名前空間は**フレームワーク名と同名クラス**をもっている場合は効かなくなる。
そして、名前空間が効かない名前が他と被るとコンパイラが不安定になる。
今回はBondもRxSwiftも似たような機能なのでRxSwiftに統合した

#fix集

##enumの先頭は小文字
```
  enum ErrorCode: Int {
    case Unknown = -1
    case Default = 0
    case ForceUpdate = 1009
  }
```


```
  enum ErrorCode: Int {
    case unknown = -1
    case `default` = 0
    case forceUpdate = 1009
  }
```

defaultは予約語だから``で囲う

##Edit all in scopeショートカット
範囲選択して⌘+Ctr+E
http://stackoverflow.com/questions/17115413/what-s-the-shortcut-for-edit-all-in-scope-in-xcode
手でやったほうが早いかも

#Xcode8.1beta
Xcode8はコンパイルが途中で止まる事があったけどXcode8.1betaにしたらわりとスムーズになった
あとコメントアウトも出来るようになった

#~/Library/Developer/Xcode/DerivedData/
Xcodeのバージョンが上がるとゴミが悪さをすることがあるので、~/Library/Developer/Xcode/DerivedData/を一回消す。
activeadminのcssとjsを読み込ませない

## どのページでもactiveadminのcssやjsが読まれてうざい
管理画面をサクッと作成できるactiveadminは便利ですが、cssやjsがどのページでもしゃしゃり出てきます。
そこでactiveadminのテンプレートを使っていないページではactiveadminのcssやjsを読み込ませない方法をご紹介します。

### cssとjsをvenderに移す
下記コマンドで初期化すると自動的にcssとjsが生成されます。

<pre>rails g active_admin:install</pre>

- active_admin.js.coffee
- active_admin.scss

これを`vender/assets/javascripts`と`vender/assets/stylesheets`にぶち込んでください。
これでactiveadminのテンプレートを使っていないページでは読み込まれなくなります。

2つのファイルを削除してもcssなどは読み込まれなくなったのですが、
activeadmin側でもファイルを読み込まなくなってしまいました。（404なった）
Xcode旧バージョンで対応していないバージョンの実機デバイスビルドをする

#課題
Xcode7.3ではiOS10移行の実機にビルド・インストール出来ない

![スクリーンショット 2016-09-28 10.31.29.png](https://qiita-image-store.s3.amazonaws.com/0/24979/13c9b7c5-0e71-4124-9d1c-ed7b45c54847.png)


#解決策
DeviceSupportを新しいXcodeから借りてくれば良い

`/Applications/Xcode_NEW.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/X.X(XXXXXX)`

を

`/Applications/Xcode_OLD.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/X.X(XXXXXX)`

へコピーすればOK
コピー後はXcodeを再起動する。
CocoaPodsでSwift2.3と3.0の混在は出来ない

#Podfile

```
target 'VersionMix' do
  # Comment this line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!
  pod 'Alamofire'
  pod "InverseTableView"
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
      target.build_configurations.each do |config|
	  if target.name == 'InverseTableView'
            config.build_settings['SWIFT_VERSION'] = '2.3'
          elsif target.name == 'Alamofire'
            config.build_settings['SWIFT_VERSION'] = '3.0'
          end
      end
   end
end
```

3.0に対応しているのは3.0で通して3.0対応してないのは2.3にしてビルド

#結果
<img width="252" alt="スクリーンショット 2016-09-29 11.38.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/48dc71ae-6250-37c8-5743-7db32f9cb1b4.png">

LLVMのバイナリなのは同じだと思ったけどダメだった。

#ということは

3.0してないものが一つでもあったら終了…。
2.3に固定してもフレームワークの仕様変更でOptionalが返ってくるやつとかがぼちぼちあるのでそちらもダメ。
工数的には2.3'のfork作ってOptional対応だけするとかかなぁ、自分でホストするのやだなぁ…。
Rails のルーティングで複数の concerns 適用の書き方メモ



```rb
    resources :blogs do
      concerns :likable, likable_type: 'Blog'
      concerns :commentable, commentable_type: 'Blog'
    end
```

って書いていたが、 concerns は複数のシンボルを引数に取れるので

```rb
    resources :blogs do
      concerns :likable, :commentable, target_model: 'Blog'
    end
```
でよい。パラメータを渡すときは DRY にすることができますね


下記で、複数を受け取っていることがわかります

```rb:rails/rails/blob/v5.0.0/actionpack/lib/action_dispatch/routing/mapper.rb#L2026-L2030
        def concerns(*args)
          options = args.extract_options!
          args.flatten.each do |name|
            if concern = @concerns[name]
              concern.call(self, options)
```
https://github.com/rails/rails/blob/v5.0.0/actionpack/lib/action_dispatch/routing/mapper.rb#L2026-L2030

```rb
      concerns :commentable, commentable_type: 'Blog'
```
ちなみにこの `Blog` の部分、もちろん `Blog.to_s` とか（もしくは string ではなく class の Blog のまま)で渡したかったのですが、 routes の時点ではモデルのロードが終わっていないようで、できませんでした
Ubuntu 16.04 LTSでRedmineを2.5から3.3に上げてみる

http://redmine.jp/guide/RedmineInstall/ を参照してやってみる。（けど、情報は結構古い）

## せっかくなので、ruby-2.3.1を入れておく

RVMでコンパイル済みバイナリが入った。

## Redmine-3.3の安定版を取ってくる
```
$ svn co https://svn.redmine.org/redmine/branches/3.3-stable redmine-3.3
```

`history`してみたら、前は

```
$ svn checkout http://svn.redmine.org/redmine/branches/2.5-stable redmine
```

してた。

## RMagicのインストール下準備

```
$ sudo apt-get install imagemagick libmagickcore-dev libmagickwand-dev
```

## bundlerを入れて、gemsをインストール

```
$ gem install bundler
$ cd redmine-3.3
$ bundle
```

## 添付ファイルのお引っ越し
```
$ tar cf - files -C ~/redmine | tar xvpf -
```

## セッションストア秘密鍵を生成
```
$ rake generate_secret_token
```

## マイグレーションしてみる（良い子はバックアップ取ってから）
```
$ cp -p ~/redmine/config/database.yml config
$ RAILS_ENV=production rake db:migrate
```

## WEBrickで動作確認
```
$ RAILS_ENV=production rails s -b example.com -p 3000
```
passengerは事前に http://shelter.babydaemons.info のために入れてある。

## apache2のvirtual hostの設定で
`PassengerRuby`を新しい(ruby-2.3.1)のwrapper scriptのパスを入れて、apache2再起動。

```
$ sudo /etc/init.d/apache2 restart
```

## お疲れ様でした。

アップグレード前に比べて、きもーちキビキビ動いてる気がするw
【AWS】踏み台EC2から別EC2へssh接続する方法


#### 踏み台のEC2からアプリなどの乗っている別EC2にアクセスしたくなった

1. 接続したいEC2のprivate keyを保存する
    - 場所：踏み台の./ssh
    - 形式：テキストとして貼り付ける

2. アクセス権を変更する

        chmod 400

3. sshコマンドで接続したいEC2にアクセスする

        ssh -i ~/.ssh/privatekeyname ec2-user@10.1.0.xxx
AndARを動かしてみた

**AndARを動かしてみました**

動作環境
- OS：Windows7
- Platform：EclipseLUNA　(だいぶ前にいれたので動くかひやひやしました）
- Device：Galaxy S6

#### 事の発端
- ARに興味を持ち、何か手軽にアプリ作れないかと思い、調査すると色んなライブラリが・・・
    - Metaio(有料)
    - vuforia
    - Qoncept AR Engine
    - ARToolkit

ふむ・・・

そんな中見つけたのがAndAR・！オープンソースのソフトウェアで楽して、色々出来そう。ということで、こちらを動かしてみることにしました。

### インストール
- ここからダウンロードしてきました
    - https://code.google.com/archive/p/andar/source/default/source

- Eclipseにインポートすると、さっそくエラーが・・
    - エラー：すべてのリソース取得操作に失敗しました。svn: E155005: Directory 'C:\Program Files\pleiades\ar\AndAR\gen\.svn' containing working copy admin area is missing

- ただ、AndARはデバイスにビルドできたので、先に進みます

### マーカーはあらかじめ紙などに印刷しておく

- アプリでかざすと右の緑の立方体が浮き上がります
![AR.PNG](https://qiita-image-store.s3.amazonaws.com/0/77327/e90f8a5e-546b-b309-1af6-e81034d22e94.png)

### 色々できてわかったこと
！立方体の色を好きに変えられる

- AndARRenderer.javaをいじってみた⇒世界が赤くなった・・
    
        gl.glColor4f(1, 1, 1, 1f);　⇒　gl.glColor4f(1, 0, 0, 1f);


- CustomObjectをいじってみた⇒立方体の色が変化した
 
          float mat_ambientf[] = {0, 1.0f, 0, 1.0f};　⇒　float mat_ambientf[] = {1.0f, 0, 0, 1.0f};
          float mat_flashf[] = {0, 1.0f, 0, 1.0f};　⇒　float mat_flashf[] = {1.0f, 0, 0, 1.0f};
          float mat_diffusef[] = {0, 1.0f, 0, 1.0f};　⇒　float mat_diffusef[] = {1.0f, 0, 0, 1.0f};

     ⇒立方体が赤になった

          float mat_ambientf[] = {0, 1.0f, 0, 1.0f};　⇒　float mat_ambientf[] = {1.0f, 0, 0, 1.0f};
          float mat_flashf[] = {0, 1.0f, 0, 1.0f};　⇒　float mat_flashf[] = {0, 0, 1.0f, 1.0f};
          float mat_diffusef[] = {0, 1.0f, 0, 1.0f};　⇒　float mat_diffusef[] = {0, 0, 1.0f, 1.0f};
     ⇒立方体が紫になった

＊今度は立体の形を変えたい・・　to be continue
iOS 10以降でMediaPlayerライブラリが利用できない。



# はじめに
iOS 10になりMPMusicPickerControllerを使うと、
一瞬出てくるものの、すぐ消えるため困ってしまった。
調べてみると、iOS 10より「メディアライブラリ利用目的」を
Info.plistへの記載が必須となっていた。

既存アプリをiOS 10で実行した際には、
自動でメディアライブラリへのアクセス許可ダイアログが出ていたので、
「まぁ何だかんだ、勝手に出してくれるかなー」と甘く考えてたけど
そんなことは無かったので、対応手順をメモ。
（既に許可しているアプリを上書きして利用していると、再度催促はされませんでした。）

## ソース
アクセス許可の動作とInfo.plistに記載するキーに関する記事

**iOS 10 tidbit: apps now must seek permission before accessing your music library**(http://www.idownloadblog.com/2016/06/15/ios-10-permission-accessing-music-library/)

# 対応内容
## 環境
-Xcode Version 8.0 (8A218a)
-iPhone 6s plus(iOS 10.0.2)

## 手順
1. Info.plistに新規項目を追加し、[**Privacy - Media Library Usage Description**]を選択
（Key[**NSAppleMusicUsageDescription**]でも可）
![スクリーンショット 2016-09-30 11.55.41.png](https://qiita-image-store.s3.amazonaws.com/0/135259/4a5815dd-0709-3c59-a793-998b6a0f12c1.png)

1. ダイアログ表示時に表示するメッセージを記入
![スクリーンショット 2016-09-30 11.57.01.png](https://qiita-image-store.s3.amazonaws.com/0/135259/17db815e-6604-351f-4c98-5ea5bd11ad95.png)

1. あとはビルドして確認するだけ。簡単！

### 未検証部分
補足ですが、Info.plistのPrivacyの項目に下記の2つがあったが違いがあるかは未検証です。
-Privacy - Media Library Usage Description
-Privacy - Music Usage Description

ただ、Appleドキュメントを見てもKey[**NSAppleMusicUsageDescription**]が記載されており、上記Keyを利用した結果[**Privacy - Media Library Usage Description**]になるため、MediaPlayerライブラリ上では事足りるようです。
（上記の許可のみで、Musicアプリ上の音も鳴らせました。）

# 対象クラス
自環境で確認したクラスを記載。
-MPMediaEntity
-MPMediaItem
-MPMediaItemArtwork
-MPMediaItemCollection
-MPMediaLibrary
-MPMediaPickerController
-MPMediaPlaylist
-MPMediaQuery
-MPMusicPlayerController

#　おわりに
MediaPlayer周りって今まで、管理が適当だなぁと思っていたんですが
AppleMusicも本格運用ということで、音楽周りの整備が始まった印象です。

メディアライブラリアクセスの許可を取らせるということは、
アクセスが厳しくなった分、リソースに対して柔軟に利用できる機能が追加されるのでは。
と期待を抱いてます。
TableauからProxy経由でGoogleSpreadSheetに接続する

下記ドメインをSquid(HTTP proxy)のホワイトリストに指定したらつながりました。
```
.googleusercontent.com
.gstatic.com
.google.com
.googleapis.com
.google.co.jp
```

超レアケースだとは思いますが・・・
機密データと接続する必要があって隔離された環境にTableauServerがあり、外部通信はすべてプロキシ通さないといけない
みたいな状況でGoogleSpreadSheetにつなぎたいという稀有な方は試してみてください。
Unityのスライダーをプログラムで制御する


スライダーの制御の仕方
Sliderのコンポーネント「Slider」にある、「Interactable」のチェックを外す。

これを外さないと、ツールバーの内部的な値（プログラムによって設定）が反映されない。

UIを制御するAPIは
using UnityEngine.UI;

で設定できる。
（メモ）ssh でコマンドを指定すると、 IFS でつなげてながしこまれるっぽい？


```shell-session
$ ssh test-vagrant ls
test-dir

$ ssh test-vagrant sh -c "ls ~/test-dir"
test-dir

$ ssh test-vagrant sh -c '"ls ~/test-dir"'
fuga.txt
hoge.txt
```


strace で何が起こっているのか見てみると、2番目のコマンドでは、


    ["sh", "-c", "ls", "/home/vagrant/test-dir"]


がリモートで実行されている。

なので、コマンドの部分は、IFS で結合されてリモートのシェルに文字列として system() 実行されているっぽい？
PHPエクステンションを作ってハマったメモ

php7.0.11で作成したsoファイルを他のサーバーに持っていったら読み込めない・・

Apacheのログを見るとpermission deniedの文字列。

「なに！」「権限だと！」

ls -l　コマンドでファイルの権限を確認したが問題なし。

ls -lZ コマンドでSELinuxのコンテキストを確認すると、他のファイルと違う。

「これか！」

chcon コマンドを叩いて、他のファイルと同じコンテキストに設定した。

「よしこれで動くはずだ」

だがしかし、apacheを再起動し php -v コマンドを叩いてみると
モジュールをロードできていない旨の文字列。

soファイルの作成に使ったPHPと、サーバーにインストールしてあるPHPのバージョンは同じ。

だが警告には、soファイルが debug　用だと表示されていた。

「んーおかしい」「デバッグ・オプションを外したPHPでsoファイルを作成したはずなのに。」

・・・・

「もしかしてキャッシュか？」

soファイルのソースコードが置いてあるディレクトリに入り、make clean all コマンドを叩いた。

そして

make install

デバッグと表示されていたsoファイルよりも容量の大きいsoファイルが生成された。

再度サーバーにsoファイルを持っていきapacheを再起動したら

無事に作成したphpエクステンションが動きました。

2日もハマった・・

でもハマるといろいろ調べるからお勉強になる。

I think, If I want to do something, I just do it.
Heroku への develop ブランチのデプロイ

# 設定
## Pipeline

Step 5: Herokuパイプラインでステージング環境を用意しよう！
https://j-hack.gitbooks.io/deploy-meteor-app-to-heroku/content/step5.html

## RAILS_ENV
development

# デプロイ作業
## branch

herokuにmaster以外のブランチをデプロイ
https://blog.knjcode.com/push-branch-to-heroku/

heroku に master 以外のブランチを push する
http://qiita.com/dounokouno/items/6c295c78065497d1c228

## 戻したい時
Herokuで前のデプロイした状態に戻す。
http://qiita.com/kimihito_/items/9608f2e94608c9359ad3

- 単純に戻したり、
- ブランチが先行している時にエラーとなって戻す必要があったり

## master 以外をdeploy
現象ex)
hint: Updates were rejected because a pushed branch tip is behind its remote

Heroku アプリケーションの管理
http://www.ownway.info/Ruby/heroku/how/management/application#force_deploy


## 起動
- 初回： `heroku ps:scale web=1`
- 再起動 ： `heroku restart`
Cloud9 で PHP 7 コピペ用

Cloud9 で PHP7 を使うという記事

Cloud9でLEMP7-fpm環境をサクっと作り、concrete5を入れてみた
http://qiita.com/kohki-shikata/items/20d3301e1bfae2ef175f

Cloud9でPHP7を使う
http://qiita.com/yookihiroo/items/04293aeb43ced91d47f3

Cloud9 でPHP7をインストールする手順
http://soudan.hatenablog.jp/entry/php7

ありがとうございます。
ちょっと、Cloud9 でコピペで実行できるようにコマンドをまとめました。

最近、PHP 7 とかが必要になってきた PHP アプリケーションが多いですね。
concrete5 とか Mautic とか。

```
sudo apt-get update
sudo apt-get install libmcrypt-dev
sudo apt-get install php-mcrypt
sudo apt-get install php-curl
curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
chmod +x phpbrew
sudo mv phpbrew /usr/local/bin/
phpbrew init
[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc
phpbrew lookup-prefix ubuntu
phpbrew install 7.0.11 +default +mysql +pdo +fpm +opcache +intl
phpbrew switch php-7.0.11
phpbrew use php-7.0.11
php -v
```

2016/9/30 時点は 7.0.11 だったので
7.0.11 のバージョンです。

## 宣伝 & クレジット

この記事が役に立ったら、「 **CMS は concrete5 が一番**」と頭の中で10回唱えてください。

CMS は断然 [concrete5](https://concrete5-japan.org/)で決まり。[コンクリートファイブジャパン株式会社](https://concrete5.co.jp)がサポートできます。
QiitaやQiita:Teamの表示幅を広げる方法

QiitaやQiita:Teamの、右側を非表示にして幅を広げたり、ウィンドウ幅まで広げる、ブックマークレットです。

# ブックマークレットの設定方法

1. 以下のどちらかをコピーして、ブックマークにURLとして登録します。名前はなんでも構いません。

    右側を非表示にして幅を広げる場合：

    ```
javascript:(function(){var a=document.getElementsByClassName("teamSidebarContainer_sub");if(0<a.length){a[0].style.display="none";}var b=document.getElementsByClassName("teamSidebarContainer_main");if(0<b.length){b[0].style.width="100%";}var c=document.getElementsByClassName("col-sm-3");if(0<c.length){c[1].style.display="none";}var d=document.getElementsByClassName("col-sm-9");if(0<d.length){d[1].style.width="100%";}})()
```

    右側を非表示にして、更にウィンドウ幅まで表示を広げる場合：

    ```
javascript:(function(){var a=document.getElementsByClassName("teamSidebarContainer_sub");if(0<a.length){a[0].style.display="none";}var b=document.getElementsByClassName("teamSidebarContainer_main");if(0<b.length){b[0].style.width="100%";}var c=document.getElementsByClassName("container");if(0<c.length){c[3].style.width="100%";}var d=document.getElementsByClassName("col-sm-3");if(0<d.length){d[1].style.display="none";}var e=document.getElementsByClassName("col-sm-9");if(0<e.length){e[1].style.width="100%";}var f=document.getElementsByClassName("teamMain_inner");if(0<f.length){f[0].style.width="100%";}})()
```

# ブックマークレットの使い方

1. QiitaやQiita:Teamの任意のページを開きます。

2. 1.で登録したブックマークを押すと、QiitaやQiita:Teamの右側が非表示になります。

3. 再表示する場合は、リロードします。

はい。簡単ですね。 :laughing: