OmniAICreator/Qiita-1.07M huggingface dataset:
Server MAN VPS CentOS6.5 SIPp3.6 で WAV音源 を RTP Stream に流してみた①　＊環境構築編＊

##■目的
SIPpで用意したwav音源をRTPで送信すること ※DTMF入力
　◆[Server MAN VPS CentOS6.5 SIPp3.6 で WAV音源 を RTP Stream に流してみた①　＊環境構築編＊](http://qiita.com/aoken/items/247e4ec9a20bf0aefaf5)
　◇[Server MAN VPS CentOS6.5 SIPp3.6 で WAV音源 を RTP Stream に流してみた②　＊SIPpシナリオ作成＊]
(http://qiita.com/aoken/items/897419cfa1560a0c813b)

##■環境構成
- DTI ServersMan@VPS Entry プラン 月額467円（税抜）
- CentOS release 6.5 (Final)
- SIPp v3.6-dev-88-g04c3874-TLS-PCAP-RTPSTREAM built Aug 16 2016, 19:24:25.

##■作業の流れ　※環境構築まで
① DTIからVPSレンタル シンプル構成で構築
② SIPp 最新版をダウンロード
　※実はGithubでダウンロードしたので、v3.6かも。
③ autoconfでコンパイルを推奨されるが、autoconfをCentOS6でSIPpに合わせて動かすのが難しいため、断念。
④ SIPp インストール

##■実際の作業
① DTIからVPSレンタル シンプル構成で構築

　**★普通の契約とDTIのコントロールパネル操作なので割愛★**

***

② SIPp 最新版をダウンロード
　※実はGithubでダウンロードしたので v3.6 なのかも。

　`cd 適当なディレクトリ`
　`git clone https://github.com/SIPp/sipp.git`

***

③ autoconfでコンパイルを推奨されるが、autoconfをCentOS6でSIPpに合わせて動かすのが難しいため、断念。

　`libtinfo.so.5 so` 関連でした。。。

***

④ SIPp インストール

　`./configure --with-openssl --with-pcap`
　　※ほかのオプション（--with-sctp --with-gsl）は、ライブラリそろえるのが難しすぎて断念

　`make ; make install`
　　※エラーがないこと

　●PATHが通ってることと、バージョンの確認
　`sipp -v`
***
　`SIPp v3.6-dev-88-g04c3874-TLS-PCAP-RTPSTREAM built Aug 16 2016, 19:24:25.`
　　※もっと長いけど割愛
***
bashのプロンプトを見やすくする

手元のUbuntu 16.04のbashは次のような見た目です。

![term1.png](https://qiita-image-store.s3.amazonaws.com/0/44208/b876cb1d-72f9-ff36-63cd-dbb25899b083.png)


このうちプロンプトに対しては次のような不満があります。

- 大量の出力がある時、始点としてのプロンプトが埋もれる。
- パス部分が長すぎると見にくい。

これらの不満点に対してそれぞれ

- プロンプトに色を付ける。
- パス部分を切り詰める。

ことで対処したいと思います。


# 現行の設定の確認
プロンプトの見た目は変数`PS1`によって制御します。`PS1`のデフォルト値は次のとおりでした。

```shell-session
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$
```
末尾の`\u@\h:\w\$`がプロンプト表示を制御している部分です。（それ以外の部分`\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}`はこの記事では無視します。）

ちなみにここで使われている特殊文字の意味は

- `\u` ユーザ名
- `\h` ホスト名
- `\w` カレントディレクトリ
- `\$` 実効UIDが0の場合に`#`、それ以外の場合は`$`

となります。その他の特殊文字についてはbashのマニュアルをご覧ください。

以下、これを基にプロンプトを改造していきます。

# プロンプトに色を付ける
色を付けたい部分の前に`\[\e[x;ym\]`を置きます。`x;y`で文字の色・スタイルを定めます。今回は`1;32`を使ってみます。これはユーザ入力も含め後続の部分全てに影響しますので、`\[\e[m\]`で終端してやる必要があります。

```
PS1='\[\e[1;32m\]\u@\h:\w\$ \[\e[m\]'
```

見た目は次のとおりです。

![term2.png](https://qiita-image-store.s3.amazonaws.com/0/44208/9882e3a2-729a-1575-d4d1-3284a4d9d2c2.png)

どこが開始地点かわかりやすくなったかと思います。

# パス部分を切り詰める
## sedを使う
３０文字を超えたら前後１５文字ずつを残して切り詰め、省略部分を`...`で表すことにします。（30~32文字の時、かえって文字数が増えてしまいますがあしからず･･･。）

```
PS1='\u@\h:$(echo "\w" | sed -e "/^.\{30,\}$/s/^\(.\{15\}\).*\(.\{15\}\)$/\1...\2/")\$ '
```
ここでクォートの有無や種別は非常に重要です。最外のシングルクォートをダブルクォートで置き換えるとコマンド置換がうまく働きませんし、`\w`を囲むダブルクォートが無いと`~`が展開されてしまいます。

見た目は次のようになります。

![term3.png](https://qiita-image-store.s3.amazonaws.com/0/44208/54d73d25-a406-2a6b-6a66-3b1cca3fbff6.png)

## PROMPT_DIRTRIM変数を設定する
bash4.0以上であれば[`PROMPT__DIRTRIM`](https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html#index-PROMPT_005fDIRTRIM)に整数値を設定して、`\w`または`\W`が展開された時に表示されるディレクトリの階層数を制御できます。左側が切り詰められます。

```shell-session
user@example:~$ echo $PROMPT_DIRTRIM 
2
user@example:~$ cd dev/haskell
user@example:~/dev/haskell$ cd gtk-test/
user@example:~/dev/haskell/gtk-test$ cd .stack-work/
user@example:~/.../gtk-test/.stack-work$ cd install/i386-linux/lts-6.10/7.10.3/bin/
user@example:~/.../7.10.3/bin$ cd /usr/local/share/
user@example:.../local/share$ 
```
`~`があるかどうかで振舞いが違うような･･･？

# 参考文献
bashのプロンプトの基本や色の制御については次が参考になります。
[Bash prompt basics](https://linuxconfig.org/bash-prompt-basics)
[Linuxで、bash プロンプトを素敵で実用的なものに変更する](https://jp.linux.com/news/linuxcom-exclusive/416957-lco20140519)
[Bash カラープロンプト - ArchWiki](https://wiki.archlinuxjp.org/index.php/Bash_%E3%82%AB%E3%83%A9%E3%83%BC%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88)
「.」以外のプロパティの表記法

[.]以外のメソッドチェーンの作り方です。
LambdaでNode.jsでメソッドを書く際に使用したので、他では未検証です。


event.body-json.idを

```
event["body-json"]["ID"]
```

と記入します。ハイフンが含まれているため、このような適用方法になっています。
Core Data を使用したOS Xアプリの実行ファイルとDBファイルの場所

最近、XCode + Swiftで iOSアプリ開発はしてましたが、OS Xアプリは開発したことなかったのでメモ。



#プロジェクト作成
Core Dataを使用したアプリは、iOSアプリ開発と同じように、新規プロジェクト作成時に Core Data にチェック入れてやれば簡単にできました。


#実行ファイル（test-osx.app）の場所
ビルド、実行はできるが、ビルド結果がどこにできるのよくわからなかった・・・
Build Locations て項目見てもよくわからんし・・・
findコマンドで test-osx.app 探しました。
~/Library/Developer/Xcode/DerivedData/test-osx-hafrwjhefqwrtqcqsdhjxmcubqyf/Build/Products/Debug/test-osx.app

~/Library/Developer/Xcode/DerivedData/
ここにプロジェクトごとに作成されるようです。


#Core Data のDBファイル（CocoaAppCD.storedata）の場所
iOSアプリでは、Core DataのDBファイルは、◯◯.sqlite3 でしたが、
OS Xアプリでは、CocoaAppCD.storedata というファイルのようです。

コードでファイルパスを出力させました。
~/Library/Application Support/test.test_osx/CocoaAppCD.storedata

~/Library/Application Support/ プロジェクト名 / にできるようです。

```swift:AppDelegate.swift
        // Create the coordinator and store
        var coordinator: NSPersistentStoreCoordinator? = nil
        if failError == nil {
            coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
            let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("CocoaAppCD.storedata")
            do {
                try coordinator!.addPersistentStoreWithType(NSXMLStoreType, configuration: nil, URL: url, options: nil)
            } catch {
                failError = error as NSError
            }
//76行目
            print(url)   // 追加！！！これでパス出力する
        }
```

```swift:ViewController.swift
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        
        // Mac上のsqliteファイルの確認用
        let coodinator = (NSApplication.sharedApplication().delegate as! AppDelegate).persistentStoreCoordinator
        print(coodinator)
    }
```
rails5でreactとreduxをinstall

reduxをRailsで使えないかなぁ。って調べていて、
https://github.com/rackt/redux/tree/master/examples/counter
http://redux.js.org/
試してみたので、メモ程度にのこしておきます。

※以下のバージョンをinstallしました。
rails 5.0.0
redux 3.5.2
react-rails react-rails
react 15.3.0

## browserify-railsのインストール
Gemfileに以下を記述
`gem 'browserify-rails'`

`config/application.rb`に以下を記述
`config.browserify_rails.commandline_options = '-t babelify'`

```
bundle install
npm install --save-dev browserify
npm install --save-dev browserify-incremental
```

## reduxのインストール
```
npm install --save react
npm install --save redux
npm install --save react-redux
npm install --save redux-thunk
```
※react-railsでもできるっぽいので、不要かも...。

## react-railsのインストール
`gem 'react-rails'`

### reactのファイル生成
`rails g react:install`

```
create  app/assets/javascripts/components
create  app/assets/javascripts/components/.gitkeep
insert  app/assets/javascripts/application.js
insert  app/assets/javascripts/application.js
insert  app/assets/javascripts/application.js
create  app/assets/javascripts/components.js
```

## components.jsの修正
```
window.React = require('react');
window.React = require('react-dom');
window.Root  = require('./components/containers/Root.js');
```

`<%= react_component('Root') %>`
あとは上記をviewに追加する。
トランザクション機能はstart transaction, commitを使ってる

CakePHPのdatasource->beginはmysqlのbeginで、start transactionと同意。裏ではMysqlのトランザクションを利用している。

database->commitもmysqlのトランザクションの機能のcommitを利用している。

select for updateの挙動をコンソールで試していたら、初めて知った。MySQLの知識を深めるのも大事だなー
ブラウザ操作をvimっぽくキーマップしてくれるchrome拡張Surfingkeysが結構便利

Chromeの拡張機能でSurfingkeysというのを入れたら結構便利だったのでご紹介です。

# webストア

https://chrome.google.com/webstore/detail/surfingkeys/gfbliohnnapiefjpjlpjnehglfpaknnc

# 使い方

概ねgithubの方に載っているので、URL貼っておきます

https://github.com/brookhong/Surfingkeys

代表的なものだけピックアップすると

|処理内容|キー|
|:---|:---|
|ヘルプ|? or u|
|リンククリック|f|
|現在のURLをvimエディタで書き換え|su|
|スクロールアップ|k|
|スクロールダウン|j|
|ブックマーク検索|t|
|現在ページの文字検索（ctrl+f）|/|
|コマンド実行（jqueryでタグ要素の内容表示したりとかもできそうです）|:|

こんな感じで色々ありますが、vim使っているとちょこちょこ直感的に使えたりします（スクロールとか検索とか）
普段vimで作業している僕としてはスクロール操作がやりやすくて助かります。
inputタグとかのタイピングをvimエディタですることも可能な様子。

あと、コマンド実行（:）については、自分で拡張することも可能っぽいです。
VirtualBoxの仮想マシンの、port forwardのルールをコマンドラインから確認する

# 概要

コマンドラインから VirtualBox の仮想マシンの port forward のルールを確認したかった。

# 結論

参考情報のところにはさらに詳しく追加の方法なども書いてあるので、そちらを見てもらったほうが良い。


```
VBoxManage showvminfo 仮想マシン名 | grep "^NIC.*Rule"
```

# 参考情報

* [コマンドラインでVirtualBoxのポートフォワード設定 - Carpe Diem](http://christina04.hatenablog.com/entry/2015/11/06/103208)
* [VirtualBoxでポートフォワーディングの設定をコマンドラインから追加、削除、表示 - Qiita](http://qiita.com/hnakamur/items/3640825cf2c5d2d4a52a)
Travis-ciのCocoapodsで古いバージョン（0.39.0）を使う（暫定処理）


# 前提

Githubで運用しているプロジェクトの```Podfile```がレガシーでTravis上のCocoapods（1.0.1）だとエラーが発生してCIできない

# 対応

```.travis.yml``` を以下の要に変更

```.travis.yml
language: objective-c
osx_image: xcode7.3

cache:
  - bundler
  - cocoapods

before_install:
  - gem uninstall cocoapods -a
  - gem install cocoapods -v 0.39.0

script:
  - pod install
  ・
  ・
  ・
```

いったんアンインストールして、インストールし直すというパワープレイで回避。
```pod init```で作り直したらそもそもXcodeのビルドエラーになったので、のちのち対応する><

# 謝辞

- http://www.task-notes.com/entry/20150113/1421118000
- http://guides.rubygems.org/command-reference/#gem-uninstall
pamでADにログインできなくなった話。PAM(Linux認証)の動作

fedora23でアクティブディレクトリ(AD)にログインできなくなったので調査してたらPAMの問題だったのでポスト。
fedora24でも同様であった。

# PAMとは

ここ見れば一発だわ。
https://www.ibm.com/developerworks/jp/linux/library/l-pam/

# tips

- /etc/pam.d/の設定ファイルは変更すればすぐに反映される。(サービスの再起動などは必要ない)
- realm コマンドでドメインに参加した場合に書き変わる。
- # authconfig --test で設定が見れる。(PAM以外の認証方法についても。)

# 原因調査の仕方

例えば
/var/log/secure に以下のようにログがでた場合。

```
Dec  2 13:01:37 pc208-fc lightdm: pam_sss(lightdm:auth): received for user murata: 17 (Failure setting user credentials)
```


/etc/pam.d/lightdm というファイルのauthセクションのどこかに問題がある。

```
╰─$ cat /etc/pam.d/lightdm                                                                                             1 ↵
#%PAM-1.0
auth     [success=done ignore=ignore default=bad] pam_selinux_permit.so
auth       required    pam_env.so
auth       substack    system-auth
-auth       optional    pam_gnome_keyring.so
-auth       optional    pam_kwallet5.so
-auth       optional    pam_kwallet.so
auth       include     postlogin
account    required    pam_nologin.so
account    include     system-auth
password   include     system-auth
session    required    pam_selinux.so close
session    required    pam_loginuid.so
session    optional    pam_console.so
-session    optional    pam_ck_connector.so
session    required    pam_selinux.so open
session    optional    pam_keyinit.so force revoke
session    required    pam_namespace.so
-session    optional    pam_gnome_keyring.so auto_start
-session    optional    pam_kwallet5.so
-session    optional    pam_kwallet.so
session    include     system-auth
session    optional    pam_lastlog.so silent
session    include     postlogin
```


1個ずつコメントアウトしたりしていって原因を追求する。
もしくは他のサーバと見比べてみる。


# 今回のドメインにログインできなかった場合の処置

## 現象

- dnf update後(たぶん) PCのログインでADのユーザーでログインできなくなった。
- ローカルPCのユーザーではログインできる。
- dnf update にsssd-adなどが含まれていた。
- sshでもドメインユーザーでログインできなかった。
- # su - murata@hogehogedomain.local はできる。

## 試行錯誤

sshでログインしようとした時に、/var/log/secureに以下のようなログが出ていた。

```
Nov 30 11:55:18 pc208-fc sshd[4510]: pam_sss(sshd:account): Access denied for user murata@hogehogedomain.local: 4 (System error)
```

/etc/pam.d/sshd のaccountにて、password-auth をincludeしていた。

```/etc/pam.d/sshd
~snip
account    include      password-auth
~snip
```

password-authのaccoutセクションを見てみると。

```/etc/pam.d/password-auth
~snip
account     required      pam_unix.so broken_shadow
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     [default=bad success=ok user_unknown=ignore] pam_krb5.so
account     required      pam_permit.so
~snip
```

たぶんこれのどこかがおかしい。
ドメイン認証は、 sssdを使っているので、pam_sss.so かな？
コメントアウトしたところ、認証が通った。

```/etc/pam.d/password-auth
~snip
#account     [default=bad success=ok user_unknown=ignore] pam_sss.so
~snip
```

だがしかし、OSのログイン画面は相変わらず通らなかった。

/var/log/secure に system-auth で同じようなログが出ていた。

system-auth  の `account     [default=bad success=ok user_unknown=ignore] pam_sss.so` をコメントアウトしてログインできました。

# 結果

pam_sss.so に不具合がありそうな気がするが、根本的な原因はわからず。。。
コレで果たしてセキュアな状態なのかもよくわかりません。ツッコミ歓迎。
gulp-shellをwindowsのコマンドプロンプトで使うとエラーが出てしまった話

# 何が起きたのか
普段TypeScirptを利用して開発しており、最近`gulp`プラグインの`gulp-shell`を導入して、`tsc`コマンドを`gulp`から実行するようにビルド方法を変更しました。  

ところがWindows環境で開発をしている方から、下記のようなエラーが出てビルドできないという報告が入ったので、これをどう対処したかという話をメモしておきます。

```
[15:53:08] Starting 'tsc'...
'$' �́A�����R�}���h�܂��͊O���R�}���h�A
�����\�ȃv���O�����܂��̓o�b�` �t�@�C���Ƃ��ĔF�������Ă��܂����B
[15:53:08] Finished 'tsc' after 38 ms
```

# まずエラーメッセージを読めるようにする
[コマンドプロンプトで文字コードがUTF-8なテキストを表示する](http://qiita.com/yu_naka0607/items/5cf26397a1a026ec0949)を参考に、

- フォントをMSゴシックに変更
- 下記コマンドを実行

```
chcp 65001
```

再度ビルドを走らせる

```
# 前略
'$' is not recognized as an internal or external command,
operable program or batch file.
# 後略
```

ok.

# エラーメッセージでググる
それっぽいのが出てきた
['cmd' is not recognized as an internal or external command, operable program or batch file](http://stackoverflow.com/questions/32035577/cmd-is-not-recognized-as-an-internal-or-external-command-operable-program-or)

パスが通ってない時にでるエラーメッセージらしい。
いやパスは通ってるでしょ・・・と思うが`gulp-shell`が悪さしてるもんだととりあえず仮説をたてる

# gulp-shellのREADMEを眺める
なんかそれっぽいオプションがあった
[options.env](https://www.npmjs.com/package/gulp-shell#optionsenv)

こいつを入れてやったら無事に動作してくれた。

# 終わりに
`gulp-shell`使ってTSのトランスパイル早くなったのはいいけど、`gulp`が吸収してくれてた実行環境の差異に振り回されちゃった感じですね。

今回の対処以外にも、`tsc`の実行を`npm scripts`に寄せるという方法も考えましたが、なるべく`gulp`で完結させたかったのでうまい具合に解決策見つかって良かったです。
sssdを使ってlinuxをActiveDirectoryに参加

クライアントPCでlinuxを使っていて、アクティブディレクトリで認証したい！なんていうニッチな人向け。
sssdでlinuxをADに参加させるための手順
fedora21を使った。fedora22, fedora23, fedora24 でも同じだったと思う。

今回はドメインを `hogehogedomain.local`, 自分のPC名(hostname)を `pc208-fc` とします。


# realmdを使って（直接Sambaを使わないで）設定する

```
# yum -y install realmd
```

# host名の設定
/etc/hostname をADに登録したいPC名に編集

```bash
[root@pc208-fc ~]# cat /etc/hostname 
pc208-fc.hogehogedomain.local
```

# /etc/nsswitch.confの設定 
hostsの探し方を変更して、dnsを前に持ってくる。（これは環境によって不要な可能性があるかも)

```diff
[root@pc208-fc ~]# diff /etc/nsswitch.conf /etc/nsswitch.conf.bk
39c39
< hosts:      files dns mdns4_minimal [NOTFOUND=return] myhostname
---
> hosts:      files mdns4_minimal [NOTFOUND=return] dns myhostname
```


# Active Directoryの情報取得

```bash
[root@pc208-fc ~]# realm discover --verbose
 * Resolving: _ldap._tcp.hogehogedomain.local
 * Performing LDAP DSE lookup on: 172.16.3.39
 * Performing LDAP DSE lookup on: 172.16.2.32
 * Performing LDAP DSE lookup on: 172.16.3.38
 * Successfully discovered: hogehogedomain.local
hogehogedomain.local
  type: kerberos
  realm-name: HOGEHOGEDOMAIN.LOCAL
  domain-name: hogehogedomain.local
  configured: no
  server-software: active-directory
  client-software: sssd
  required-package: oddjob
  required-package: oddjob-mkhomedir
  required-package: sssd
  required-package: adcli
  required-package: samba-common
```


## 各種パッケージのインストール
上のrealm discoverで出てるrequired-packageとして出力されているパッケージを導入する。

```bash
[root@pc208-fc ~]# yum install oddjob oddjob-mkhomedir sssd adcli samba-common
```

## realmd設定

```
# cat /etc/realmd.conf
[users]
default-home = /home/%U
default-shell = /bin/zsh
 
[active-directory]
default-client = sssd
 
[service]
automatic-install = yes
 
[hogehogedomain.local]
computer-ou = OU=Computers,DC=hogehogedomain,DC=local
automatic-id-mapping = yes
fully-qualified-names = no
```

## ドメインへの参加

```bash
# realm join hogehogedomain.local -U murata
Password for murata:
```

これでsshdなどが動いていれば

```bash
$ ssh murata\@hogehogedomain.local@172.16.3.172
```

でADのパスワードでログインできるようになります。172.16.3.172は自分自身のIPアドレス。

## SSSDの設定を追加

すでに導入済みとなる、oddjob_mkhomedirの設定を、/etc/sssd/sssd.confに追記する。

```
[domain/hogehogedomain.local]
override_homedir = /home/%u
 
[nss]
fallback_homedir = /home/%u
```

%dは、ドメイン名、%uはユーザ名が補間されて、初回ログイン時に自動的にディレクトリが作成されるようになる。

```bash
# systemctl restart sssd.service
```

## デフォルトのシェルを指定する

ADドメインユーザは、LDAPv3スキーマのloginShell属性でシェルの定義を行う。しかし、AD側で一々設定するのは面倒なので、SSSD側の設定で実現する。/etc/sssd/sssd.conf
ログインユーザー時にhogehogedomain.localをつけなくても良くする。のも同時に。

```
[domain/hogehogedomain.local]
default_shell = /bin/bash
 
use_fully_qualified_names = TrueからFalseに

[nss]
shell_fallback = /bin/sh
allowed_shells = /bin/bash /bin/zsh
```


sssd再起動

```
# systemctl restart sssd.service
```



## visudo

```
%domain\ admins  ALL=(ALL)       NOPASSWD: ALL
```

を追加すればsudoerにdomain admin@hogehogedomain.localのグループが入る。


あとはお好きにどうぞ。
iTC提出時のiPad Pro 12.9"のスクリーンショット関連について

#はじめに#
iTunes Connectで提出するときに、iPad Pro 12.9インチのスクリーンショットの添付が先日の仕様変更によって、必須になりました。

#キャンパスサイズ#
iPad Pro 12.9インチのスクリーンショットは、2048x2732かその逆です。
画像をイラストレータなどで制作している場合は、そのサイズに合わせる必要があります。
備忘: iTCのスクリーンショットは、アルファを含めることができません。
Pixcelmaterを使う場合、png形式で保存した後、Preview.appでアルファを含めないで保存すると除去できます。

#シミュレータで撮影する場合の注意#
iPad Proは解像度が大きいので、Window->Scale->50%などとして表示していることが多いかと思います。
そのままスクリーンショットを生成すると、50%のサイズの画像になってしまいます。
スクリーンショットを撮影する場合は、100%に直してから生成しましょう。

#チェックするだけで転用できる仕様に#
iTunesConnectの仕様変更によって、ベースのスクリーンショットを転用することが簡単にできるようになりました。

ベースとなる言語のスクリーンショットをアップロードすると、他の言語でもチェックボックスをクリックするだけで反映できます。
同様に、大きな画面サイズのスクリーンショットをアップロードすれば、それより小さなサイズのものとしてもチェックボックスをクリックするだけで転用できるようになりました。

以前は、属性ごとにアップロードする必要があったので、言語や画面サイズの数だけアップロードする必要があり、煩雑でした。
初学者によるCSSメモ #1

Quite下書き

# はじめに
ずっと気になっていたQiitaを始めてみました。
ってことで温かい目でご指導ご指摘頂けると大変ありがたいです。
なんか緊張する〜〜笑

最近自分のサイトを作ろうと思っておりまして
絶賛WEB系の勉強中です。
ということで今回はCSSについて調べていて知ったことについてメモしていこうかと思います。

#CSSとは
webサイトを作る際にHTMLで一々フォント等のデザインを作り込むと大変なので
デザイン用途に特化させたものがCSSになります。
例えばページ内の見出しのサイズを一気に変更したい時、その他色々…
これを使うだけでページ全体のデザイン管理がすごい楽になるみたいです。

ちなみにCSSとはカスケーディング スタイル シートの略です。
カスケーディングは滝とかそういった意味で
滝が上流から下流に流れていく様に
先に設定したもの(=上流)はその後(=下流)にも適用されるということみたいです。

#CSSの使い方
二種類あります。

1.外部ファイルを作成する方法
2.HTMLに直接書き込む方法

今回は後で理解しやすくするために
**外部ファイルを作成する方法**で進めていきます。

サイト管理しているフォルダに[任意の名前.css]というファイルを作成します。
(テキストエディタ等で可)

###記述方法は
**セレクタ{
属性:
値}**
(分かりやすくするため わざと改行しています)

-セレクタ…指定する要素
-プロパティ…変更したい属性
-値…変更値

###指定できるプロパティ
####色指定パターン(全部同じ)
color:red
color:#FF0000
color:#F00
color:rgb(255,0,0)
color:rgb(100%,0%,0%)

####文字サイズ(大きさ順)
1pt
1mm
1pc
1cm
1in
font-size : xx-small
font-size : x-small
font-size : smaller
font-size : small
font-size : medium
font-size : larger
font-size : large
font-size : x-large
font-size : xx-large


####斜体
font-style : normal普通(斜体から元に戻す)
font-style : italic//斜体(若干、筆記体)
font-style : oblique斜体(カクカク)


文字装飾
text-decoration : none//普通(線なし)
text-decoration : underline//下に線
text-decoration : overline//上に線
text-decoration : line-through//取り消し線

####文字太さ
font-weight : normal
font-weight : lighter
font-weight : 100(〜900)
font-weight : bold
font-weight : bolder

####フォント指定
font-family : 'ＭＳ Ｐ明朝’//フォント名に空白部分を含む時’ ‘か” “で囲うこと


とりあえず文字関係はこんな感じらしい。
また引き続き投稿します。
boot2dockerを利用したIPを変えたい 

# ぽえむ
あるイントラネット内、 re:dashのDocker版をインストールし、DB接続して使おうとした。
しかし、DB側のIP帯が、 `172.17.xxx.xxx`

boot2dockerのブリッジ接続で利用しているデフォルトIP帯。

`172.17.0.0/16`

```:docker-network-bridge
$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "37262f6715263e87db026d5501a08a3c24db5243e1235696d19f762ac2bac69a",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
```

完全にかぶってますなぁ...

# 環境
docker-machine -> Virtualbox -> docker-compose -> re:dash

# 解決策

## --fixed-cidr, --bip を追加する

ただし、Linuxのやり方と違うので注意。Linuxのばっかり載ってるんですわ。ひどいですわ。
boot2dockerが特殊なのだろうなぁ。

Linux版の参考: http://knowledge.sakura.ad.jp/knowledge/4786/

```：/var/lib/boot2docker/profile
$ docker-machine ssh redash
$ cat /var/lib/boot2docker/profile
EXTRA_ARGS='
--label provider=virtualbox

'

$ vi /var/lib/boot2docker/profile
EXTRA_ARGS='
--label provider=virtualbox
--fixed-cidr=192.168.100.0/24
--bip=192.168.100.1/24
'
```

# 以下、ボツ案
## `docker network` で頑張ろうとしたパターン

```:docker-network
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
dd738187eba6        bridge              bridge              local ←既にあるbridge
048888e14045        host                host                local               
a628ca4f5158        none                null                local   
```

### 既にある bridge のIP帯変えよう
変更不可

### 既にある bridge 消そう

```
$ docker network rm bridge
Error response from daemon: bridge is a pre-defined network and cannot be removed
```
消せない

### 新しいネットワーク作ってそちらを通そう

```
$ docker network create --driver bridge --subnet 192.168.101.0/24 --gateway=192.168.101.1 \
-o "com.docker.network.bridge.enable_icc"="true" \
-o "com.docker.network.bridge.enable_ip_masquerade"="true" \
-o "com.docker.network.bridge.host_binding_ipv4"="0.0.0.0" \
-o "com.docker.network.driver.mtu"="1500" \
redash
```



```yml:docker-compose.yml
version: '2'
services: 
    xxxxxx
networks:
  default:
    external:
      name: redash
```

同じIP帯が消えないので、結局意味ない。（気づくの遅い）


# 参考
http://superbrothers.hatenablog.com/entry/2014/06/19/234210
https://github.com/boot2docker/boot2docker/blob/master/doc/FAQ.md


Docker♡コンテナ
border-imageをRetina対応させるときの備忘録

border-imageを使う時は、
http://border-image.com/
を使ってCSSソースを生成して貼り付ける事が多いが、
このサイトで生成したCSSはRetina対応してない素の画像サイズなので、
スマホ制作してる時とかは画像が大きくなっちゃう。

Retina対応する場合は、`border-image`の数値は変えず、
`border-width`の値だけ、1/2とかにすると良いっぽいので、
例えば、こうなっていたら↓

```css
border-width: 36px 40px 40px 44px;
```

こうする↓

```css
border-width: 18px 20px 20px 22px;
```
Ubuntu Xenialであるパッケージに依存しているパッケージを調べる

`apt-cache rdepends　パッケージ名`で、そのパッケージに依存しているパッケージを一覧表示できる。
例えば、perl-baseに依存しているパッケージは以下のとおり(多い)。

```
# apt-cache rdepends perl-base
perl-base
Reverse Depends:
  nagios-snmp-plugins
  pidgin
  libpurple0
  libapparmor-perl
  init-system-helpers
  pidgin
  fig2ps
  libpurple0
 |libio-socket-ip-perl
  console-cyrillic
  tasksel
  libperl5.22
  perl-modules-5.22
  perl-modules-5.22
  perl
  libuuid-perl
  libtext-iconv-perl
  libtext-charwidth-perl
  libapt-pkg-perl
  liblocale-gettext-perl
  libapparmor-perl
  irssi
  init-system-helpers
  debconf
  adduser
```

参考: http://askubuntu.com/questions/128524/how-to-list-dependent-packages-reverse-dependencies
GoogleAppsEngineでDatastoreの更新をasyncにやる書き方


タイトルで言いたいことを書きました。Python2.7

```python
from google.appengine.ext import ndb

class TestModel(ndb.Model):
    name = ndb.StringProperty()

@ndb.transactional_tasklet
def txn (key):
    entity = yield key.get_async()
    if not entity:
      entity = TestModel(key=key)
    entity.populate(key=key, name='foo')
    yield entity.put_async()
    raise ndb.Return(entity)

def put_multi_async(keys):
    @ndb.tasklet
    def _put_multi_async(keys):
        results = yield [txn(key) for key in keys]
        raise ndb.Return(results)

    return _put_multi_async(keys).get_result()

def main():
  key1 = ndb.Key(TestModel, 1)
  key2 = ndb.Key(TestModel, 2)
  key3 = ndb.Key(TestModel, 3)

  res = put_multi_async([key1, key2, key3])
  print res

main()

'''
=>
[TestModel(key=Key('TestModel', 1), name=u'foo'),
 TestModel(key=Key('TestModel', 2), name=u'foo'),
 TestModel(key=Key('TestModel', 3), name=u'foo')]
'''
```
DateTime.ToString() による月や曜日の英語表現にはロケールの指定が必須

Qiita を利用されている方、および開発物のユーザーの多くは日本語圏の方であろうと思います。
#DateTime.Now.ToString("MMM") => "8" ??

> "MMM" カスタム書式指定子は、月の省略名を表します。 

と MSDN の記事「[カスタム日時書式指定文字列](https://msdn.microsoft.com/ja-jp/library/8kb3ddd4.aspx)」に書かれていますが、

```csharp
Console.WriteLine(DateTime.Now.ToString("MMM"));
```
のように記述すると、5月であれば "May" ではなく、"5" のように数字できっと表示されてしまうでしょう。syslog など、英語表現の月略名を使用したいときに困ります。

#原因と解決法
おそらく日本語版の WindowsOS で動かしていますよね？これは、OS のロケール設定（コントロールパネル「システム」で設定する「日付の形式」など）によって「月の完全名」「月の省略名」「曜日の完全名」「曜日の省略名」の表現が異なるためです。ちなみに日本語ロケール (ja-JP) で「月の完全名」は 5月であれば "5月"となります。

##解決法１：DateTime.ToString()メソッド呼び出し時にインバリアント、または英語圏のロケールを指定する

```csharp
var result = DateTime.Now.ToString("MMM", System.Globalization.CultureInfo.InvariantCulture);
```

または

```csharp
var result = DateTime.Now.ToString("MMM", System.Globalization.CultureInfo.CreateSpecificCulture("en-US"));
```

のように、[DateTime.ToString](https://msdn.microsoft.com/ja-jp/library/8tfzyc64.aspx) メソッドにおいてカルチャに依存しない (インバリアントな) 、または英語圏のロケールを指定します。

##解決法２：DateTimeFormatInfo.AbbreviatedMonthNamesプロパティを使用する。

[DateTimeFormatInfo](https://msdn.microsoft.com/ja-jp/library/system.globalization.datetimeformatinfo.aspx) クラスの[コンストラクタ](https://msdn.microsoft.com/ja-jp/library/system.globalization.datetimeformatinfo.datetimeformatinfo.aspx)の処理は、
> カルチャに依存しない (インバリアントな) DateTimeFormatInfo クラスの新しい書き込み可能インスタンスを初期化します。

だそうです。そこで

```csharp
var result = (new System.Globalization.DateTimeFormatInfo()).AbbreviatedMonthNames[DateTime.Now.Month - 1];
```

とオブジェクトを生成してから [DateTimeFormatInfo.AbbreviatedMonthNames](https://msdn.microsoft.com/ja-jp/library/system.globalization.datetimeformatinfo.abbreviateddaynames.aspx) プロパティを利用することで、英語表記での月の省略名を得られます。

おなじく

```csharp
var result = System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat.AbbreviatedMonthNames[DateTime.Now.Month 
- 1];
```

や

```csharp
var result = System.Globalization.DateTimeFormatInfo.InvariantInfo.AbbreviatedMonthNames[DateTime.Now.Month - 1];
```

でも可能です。

##解決法３：スレッドのカルチャにインバリアント、または英語圏のロケールを指定する。

```csharp
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;

// ...同一スレッドであれば何か処理をはさんでも可

var result = DateTime.Now.ToString("MMM");
```

```csharp
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");

// ...同一スレッドであれば何か処理をはさんでも可

var result = DateTime.Now.ToString("MMM");
```

と、スレッドのカルチャをインバリアント、または英語圏のロケールに設定することで、英語表記で得られるようになります。アプリケーション自体がコンピューターチック（インバリアントなカルチャ）なものであれば、この方法でアプリケーション初期化時にスレッドのカルチャをインバリアントに設定してしまうほうがいろいろ捗ると思います。

##解決法４：自前で表現を用意する。

```csharp
var result = (new string[] { "Jan", "Feb", "Mar", ...（略）... , "Dec"})[DateTime.Now.Month - 1];
```

としても、望む結果をもちろん得られます。
【AWS】lambda関数が再利用される


### なにか？
Lambdaの実行ログをCloudWatchで確認していて気づいたことがあります。
関数でタイムスタンプを打刻しているのですがなぜかズレる・・・

lambda_handlerより前の部分で時刻情報を変数宣言していました。

```python:変更前
# -*- coding: utf-8 -*-

from __future__ import print_function
import boto3
import datetime

# 時刻設定
utc = datetime.datetime.now()
jst = utc + datetime.timedelta(hours=9)
timestamp = jst.strftime('%Y%m%d%H%M')


def lambda_handler(event, context):
	<<処理部分>>
```


ファンクション自体は1分間に数十回起動しているはずなのですが、確認しているとtimestampが特定の時刻に集中してボンボンボンと出力されていました(14分で何個も出力された後は32分で出力されるみたいなイメージ）。

何なんだろうと考えていると過去ドキュメントで読んだ情報をふと思い出しました。

```
Q: AWS Lambda は関数インスタンスを再利用しますか?

パフォーマンス向上のため、AWS Lambda は新しく関数のインスタンスを作成するのではなく、関数のインスタンスを保持してその後のリクエストに対応することがあります。ただし、常にインスタンスを再利用するわけではありません。
```
_公式ドキュメントより_


なるほど！
そこで、時刻情報の宣言をlambda_handler()関数内で宣言した結果、正しい時刻情報が打刻されるようになりました。

```python:変更後
# -*- coding: utf-8 -*-

from __future__ import print_function
import boto3
import datetime


def lambda_handler(event, context):
	# 時刻設定
	utc = datetime.datetime.now()
	jst = utc + datetime.timedelta(hours=9)
	timestamp = jst.strftime('%Y%m%d%H%M')
	
	<<処理部分>>
```

コール数が多いLambda関数で時刻情報等を宣言するときは関数が再利用される点に注意する必要がありそうです。
bashとzshとtime、その出力

# 概要

```
cd /tmp
(time /bin/bash echo "hello") >& with_bash.txt
(time /bin/bash -c 'echo "hello"') >& with-c_bash.txt
(time  echo "hello") >& without_bash.txt
```

bash,zshそれぞれで上記のコマンドを実行するとどうなるか気になった。

# 結論

bash,zsh両方とも

* １つ目は、echoコマンドそのものを読み込もうとしてエラー
* ２つ目は、実行された
* ３つ目は、実行された

コマンドを実行するときのシェルによって、timeの出力が違う。
これは、timeがシェルの組み込みのものが使われるからであるのではないか。
***/usr/bin/time***にすると出力は一定になるかもしれない。

時間をパースしたい時などは気をつけたほうが良いと思った。

# 出力

timeコマンドの出力も違う。

## bash

### １つ目 with_bash.txt

```
/bin/echo: /bin/echo: cannot execute binary file

real	0m0.002s
user	0m0.000s
sys	0m0.000s
```

### ２つ目 with-c_bash.txt

```
hello

real	0m0.002s
user	0m0.000s
sys	0m0.000s
```

### ３つ目 without_bash.txt

```
hello

real	0m0.000s
user	0m0.000s
sys	0m0.000s
```


## zsh

### １つ目 with_bash.txt

```
/bin/echo: /bin/echo: cannot execute binary file
/bin/bash echo "hello"  0.00s user 0.00s system 0% cpu 0.003 total
```

### ２つ目 with-c_bash.txt

```
hello
/bin/bash -c 'echo "hello"'  0.00s user 0.00s system 0% cpu 0.002 total
```

### ３つ目 without_bash.txt


```
hello
```
svn主流の職場にプルリク開発を導入するための口説き文句集

# 概要
今更ですけどプルリク開発イイですよね。
自分がいるちょっと堅めの組織では、プルリク駆動が浸透するまでに1年半くらいかかりました。ただ、導入後のアンケートでははsvnを使いたいという人が皆無になるくらい、プルリク駆動開発には価値があると現場にわかってもらえましたので、導入時に効果的だった口説き文句をまとめてみました。
えらい人も説得しないといけないし、現場も説得しないといけないので、それぞれに向けたフレーズになっています。
なお中には、gitにもかかわらずtrunkという言葉を使っているケースがあります。これはgitのmasterブランチという言い方をするよりも、svn習熟者にtrunkという表現の方が刺さると考えられるため、あえてこういった表現をしています。

---

# 書かないこと
gitの内部構造についての話や、使い方についての話など、これらの説明を補強するバックボーンについてはサラっとしか記載していません。面白いのでいずれ是非そちらにも触れたいです。

---

# 対象読者
プルリク駆動がイイことは知ってるし、広めたいとも思っているけど、svn主流の環境ではどう広めたらいいのか悩んでいる、という方に向けた記事です。

---

# 対象環境
堅い組織向けということで、オンプレのGitLab環境を想定しています。
GitHubも良いですが、最近のGitLabも大変進歩してますよね。GitHubと比べて遜色ないどころか、組織によってはGitLabを導入した方がフィットすることもあるのではないでしょうか。
堅い組織では、GitLabが持つprotectedブランチが作れる機能は強みになります。gitの習熟度が低いメンバーが入っていても、masterブランチへの直接pushを防止できるというのは、導入のハードルを下げることに寄与します。

---
# えらい人向けの口説き文句
では本題です。

---
## 「ほっといても継続的な教育効果が発生するようになります」

- 世の中、技術の進歩が速すぎてついていくの大変ですよね
- 教育のためのコードレビューをルールとして強制したとしても、svnでは全コードのレビューなんて現実的ではないですし、継続にかかるエネルギーが大きくてやめちゃいますよね
- プルリク駆動は日々のすべてのコーディングにレビューを強制します。レビューする側/される側それぞれが、実務に従事しながら継続的に学ばざるをえない環境をつくれます

---
## 「新人さんやパートナーさんのコードコミットに、レビューを強制できます」
- svnでは自由にtrunkにコミットができるので、レベル感の見えないパートナーさんのコードであとあと痛い目に遭うことって多いですよね
- あとあとになるほど問題への対処コストは指数関数的に増加しますから、早い段階で潰せるようになることは品質に寄与しますよ

---
## 「組織のコーディングレベル平準化を、ペアプロよりよっぽど低いコストで」
- 勉強熱心な開発者ばかりではないので、開発者ごとのコーディングレベルのばらつきってだんだん大きくなって悩みますよね
- プルリク開発では常時ペアプロに似た効果が期待できますので、継続的にばらつき解消ができますよ
- レビュワー/レビュイーの他に、プロジェクトに組織の全メンバーを含めておくこともできますので、組織全体のレベル平準化としても機能します(※)
- 受注規模を拡大するためには「人に作ってもらう」技術は重要ですが、組織として「自分たちも作ろうと思えば作れるんだ」という状態を維持し続けることも大切ですよね

※実際のところ全部のプロジェクトからメールくると鬱陶しいけど、最初はこれで押せることもある

---
# 現場向けの口説き文句
次は現場向け。

---
## 「シンプルな設計で非常に複雑な問題を解決しているからそうそう廃れないよ」

- 「gitを勉強したとしても、どうせすぐにその次のSCMが出てくるんでしょ、何回も勉強するのは大変だから嫌っス」って思ってるでしょう？
- gitは、コードベースが1500万行を超えるlinuxカーネルを管理するために、linus tovalsが自ら設計したシステム
- 内部設計は3種類のモデルオブジェクトをKVSとして1テーブルで管理するだけのシンプルなもので、それ以上シンプルなデータモデル設計が出てこない限り廃れないところが強み  
- だから、勉強しても損しないよ！
 
※KVSを1テーブルとか言うのは強引な表現ですが、シンプルさの表現としてこう表現しちゃってます。

---
## 「プロジェクトメンバーに気兼ねすることなく、コミットできるようになるよ」

- 「機能まるごとtrunkにコミットするには粒がでかすぎる。細かくtrunkにコミットすると、他人のコミットと混ざって意味レベルでコミットをまとめられない。svnでのコミットの粒度悩ましい、ファック！」と思いながら開発してますよね？
- gitではあなたのブランチは別なメンバーのブランチに一切影響を与えません
- あなたはあなたの好ましいと感じるところまでコミットを重ねてブランチを伸ばしてから、まとめてtrunkにマージできるようになります

---
## 「gitは速い」
- svnもそう不満に感じるほど遅くはないと思うけど、普段触れるものの動作が速いことって、日常的なストレス軽減に寄与しますよね
- gitではすべてのオブジェクトがKVSで管理されるから、どのオブジェクトへのアクセスでも、探索にかかる時間がO(logN)に収束するんですよ
- linuxカーネル4万ファイル1500万行コードを現実的に管理できてるくらいですし、マジで速いですよね

※これは詭弁かもしれないけど、実際使ってて速いって感じるので、言っちゃってる・・・

---
# そうは言っても、gitってそんないいところばっかりなの？

「gitが良さそうなのはわかった。ただね、そんなうまい話ばっかりでもないんでしょう?どういうところにデメリットがあるの？」という疑問は必ず出てきますよね。

いろいろな疑問に、丁寧に嘘偽りなく答えられるようにする切り返し集も、機会があれば書きたいなと思ってます。参考になれば幸いです。
安裝 comScore

目前做的專案公司業務端需要採用 [comScore](www.comscore.com) 這個服務，
來記錄操作，於就來幫這個專案的 app 來裝一下。

實際的裝法和官方提供的文件也有出入，所以開這篇文章來記錄一下。

## 簡介

comScore 是一家提供操作訊息紀錄，及分析的公司。

基本上就跟 [GA](https://www.google.com/analytics) 類似，然後再陽春很多。

廢話不多說，就直接開始吧

## 安裝 comScore 函式庫

可以透過 [CocoaPods](https://cocoapods.org/) 相依性管理工具來安裝：

打開你的 Podfile ，加上一行：

``` ruby
pod "ComScore-iOS"
```

接著在終端機的專案根目錄下，執行 install

```
pod install
```

這樣就自動引入了。

## 設定紀錄進入點

### Import library

CocoaPods 也會幫我們把 bridging header 這件事情做完，因此直接在 Swift 檔案裡面，就可以直接 import 了。

首先要在你的 `AppDelegate.swift` 中的檔頭，加入這段 import ：

``` swift:AppDelegate.swift
import UIKit
import ComScore // 加入這一行

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
...
```

### 初始化 ComScore 元件

接著在 `application(_:didFinishLaunchingWithOptions:)` 中的一開始，加上 ComScore 元件的初始化設定

``` swift:AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    CSComScore.setAppContext()
    CSComScore.setCustomC2("your-c2-key")
    CSComScore.setPublisherSecret("your-secret-key")
    CSComScore.setAutoStartEnabled(true)

    // 其餘實作
}
```

接著 app 開起來之後，理論上，就會幫你發送開啟 app 的紀錄了。

## 驗證實作結果

從實作面看

1. 他在紀錄及傳送 log 時完全沒有 console 訊息印出來

根據官方的文件

1. log 的東西，要在 **第二天** 才能看到
2. 如果你想要看測試是否成功，可以寫客服信， **兩天之內** 才會得到回覆
3. 自己去攔截 HTTP request 是否有對指定的 server 發出 request

因此，看來只有第三點可以用；
而且還不能確認是否真的有被記錄下來。 :cold_sweat: 

### 使用 Charles

- **Charles 官網：** https://www.charlesproxy.com/
- **監聽的網址：** https://sb.scorecardresearch.com

這裡不講怎麼監聽模擬器或實際機器，網路上會有教學，
之後再找機會寫文章看要怎麼用。

拉回來，
因為監聽的目的地是有 ssl 保護，因此剛監聽的時候，會得到這樣的結果：

![Screen Shot 2016-08-17 at 12.24.35 PM.png](https://qiita-image-store.s3.amazonaws.com/0/41979/1edf7c1f-a362-b2dd-f644-ecc4ce3009e3.png)

內容會以 `<unknown>` 的方式呈現，無法觀察內容物

### 設定 SSL Proxy

從頂端的主選單：

> SSL Proxying Settings > SSL Proxying 頁籤

這時候預設列表應該會是空空的，

先把

> Enable SSL Proxying

勾起來，

接著，點擊下方的 

> Add

按鈕。

這時候會跳出一個視窗，

![Screen Shot 2016-08-17 at 12.25.15 PM.png](https://qiita-image-store.s3.amazonaws.com/0/41979/3ab77292-3f4b-03f3-7d14-4592bc52f806.png)

在 Host 的欄位鍵入

> sb.scorecardresearch.com

點擊 OK 就添加完成。

這時候把 App 重開，讓 comScore 可以紀錄 app 開啟並傳送到 server side ，這時候就可以看到發所發送的 request 了：

![Screen Shot 2016-08-17 at 12.26.12 PM.png](https://qiita-image-store.s3.amazonaws.com/0/41979/24be43f0-e465-6430-2208-046a2103d3c3.png)

這時候就可以根據官方提供的文件來對照送出的 request 是不是照你所想的：

- c2 id 正確
- publisher secret 正確

... 等等

這樣就算是告一段落了。

接下來就是要等第二天看報表的結果了。

## 心得

恩 ...

在這個年代，沒有及時樣板 ，也沒辦法看到當天的操作記錄。
而還要再等第二天才能確認資料是否被記錄完成，
驗證是否正確還要開發者自行攔截 request 才能知道可能的發送結果。

觀看資料的後台也不是很明確好用。

對開發者或是上線後業務想要即時瞭解都不是很好的實作方式。

記錄和分析還是乖乖用 [Fabric](https://fabric.io) 或是 [GA](https://www.google.com/analytics) 就好了 :laughing:
pg_upgrade を使ったDBクラスタ移行手順 on Windows

## pg_upgrade を使ったDBクラスタ移行手順 on Windows
まずは[pg_upgradeのドキュメント](https://www.postgresql.jp/document/current/html/pgupgrade.html)に目を通す。

以下は、Windows8.1 上で、PostgreSQL9.4 から 9.5.4 に pg_upgrade した時の手順。


#### 1.旧バージョンのpostgresサービスを停止

#### 2. 新バージョンのバイナリーをインストール
※EnterpriseDBの x86-32版 を使用した。当然、旧バージョンのもx86-32版。

#### 3. 新バージョンのpostgresサービスを停止

#### 4. pg_hba.confの編集
新旧DBクラスタの```pg_hba.conf```の上の方に以下の行を入れる。

```:pg_hba.conf
host    all             all             127.0.0.1/32            trust
host    all             all             ::1/128                 trust
```

#### 5. pg_upgradeを実行
管理者としてコマンドプロンプトを起動し、Everyone書き込み可能なディレクトリに ```cd``` する。
※ProgramFilesやWindows配下とかじゃなければ、ほぼどこでも大丈夫なはず。[参考](http://stackoverflow.com/questions/34664236/pg-upgrade-on-windows-cannot-write-to-log-file-pg-upgrade-internal-log)
※pg_upgradeはカレントディレクトリに大量の一時ファイルをはき出すので、空のディレクトリを新規作成した方が良いかも。

以下のコマンドを実行する。※パスは適宜変更のこと。
**注: -UオプションでDBユーザーを明示すること。**
補足: CPUコア数によっては ```--jobs``` オプションを付けておくと時間短縮になる（とのこと）。

```:管理者コマンドプロンプト
> "C:\Program Files (x86)\PostgreSQL\9.5\bin\pg_upgrade"
 -U postgres
 --old-bindir="C:\Program Files (x86)\PostgreSQL\9.4\bin"
 --new-bindir="C:\Program Files (x86)\PostgreSQL\9.5\bin"
 --old-datadir="F:\DB\Database\9.4\data"
 --new-datadir="F:\DB\Database\9.5\data"
```

Windowsファイアウォールの警告が表示されたら、もちろん【許可する】。

###### 補足: postgresユーザーとしてシェルを起動？

ドキュメントに以下のように書いてあるが、EnterpriseDB版インストーラーでインストールした場合にはpostgresアカウントというものは作られないため、以下は実行不可能。
※その代わりに上の手順では -U オプションでpostgresユーザーを明示的に指定している。

> Windowsユーザの場合、管理者アカウントでログオンしなければなりません。また、 postgresユーザとしてシェルを起動し、適切なパスを設定してください。 

> ```
> RUNAS /USER:postgres "CMD.EXE"
> SET PATH=%PATH%;C:\Program Files\PostgreSQL\9.0\bin;
> ```

 - 昔のPostgreSQLはインストール時にpostgresアカウントが自動作成されていたが、最近のは作られなくなっていて、postgresサービスは```Network Service```アカウントで動作するようになっている。

#### 6. 確認＆後片付け

upgrateに成功したら、以下のように表示される。

```
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
    analyze_new_cluster.bat

Running this script will delete the old cluster's data files:
    delete_old_cluster.bat
```

pg_hba.conf を元に戻す。

新DBサービスを起動し接続。正しくデータが移行されていることを確認。

postgresql.conf（など）の設定も移行。
※廃止されている設定項目があったりすると起動しないこともあるので、設定移行後はサービス再起動＆ログファイル確認を。

DBのログファイルのrotation設定も忘れずに変更。

統計データは移行されていないようなので、pg_upgradeが作ってくれた一括analyze用バッチファイルを起動。※当然、それなりに時間がかかる…

```
> analyze_new_cluster.bat
```

不要であれば、旧DBクラスタを削除。削除用のbatファイルが作成されているのでそれを使うと簡単。（使ったことないけど…）

```
> delete_old_cluster.bat
```

不要であれば、カレントディレクトリにはき出されたログファイル・バッチファイルを削除。

--

# pg_dumpall を使用したDBクラスタ移行手順メモ on Windows

公式ドキュメント: [PostgreSQLクラスタのアップグレード処理](https://www.postgresql.jp/document/9.6/html/upgrading.html#upgrading-via-pgdumpall)

移行元

```bash
> pg_dumpall.exe -U postgres > dump.sql
```
※-U でユーザー名を明示しないと動かない。-Uなしの場合「バ」だけ出力して止まる@pg9.5

移行先

```bash
> psql -U postgres -d postgres -f dump.sql
```

以上。
マルチクラウド環境で複数のKubernetesクラスタを扱えるようになるUbernetesのまとめ 〜2016.8.17〜

##Ubernetesとは？

#####仮想マシンで動くDockerコンテナを管理するツールの一つである「[Kubernetes](http://kubernetes.io/)(以下k8s)」があり、これを複数クラスタで連携し、かつ異なるクラウド間でやり取りができるようになる仕組みとしてUbernetesが開発されています。

- k8sを複数のクラウドプロバイダ([GCE](https://cloud.google.com/compute/)や[AWS](https://aws.amazon.com/jp/)とか)で複数のクラスタを立てている時にこれらを一括して管理したい要望が高まる

- そこで実装が期待されているのが「Ubernetes」

- はじめの提案はおそらく[このドキュメント](https://github.com/kubernetes/kubernetes/blob/release-1.3/docs/design/federation-phase-1.md)から

#####この記事では「Ubernetes」を利用しようと調査した時に出てきた情報をまとめます。

##そもそも何でk8sの複数のクラスタを一元管理したがるの？
- ひとつの回答としては、k8sで管理できるクラスター内のノードの制限数が関係

- k8sではv1.3現在、１クラスタで最大で2000ノードほど

    - クラスタを連携させればそれ以上のノードに拡張すること可能でになる

##k8sで複数のクラスタを管理する方法はどうなってる？

- 複数のKubernetesクラスタを立てて簡単にクラスタ間の通信ができるのか？

    - [公式ドキュメント](http://kubernetes.io/docs/admin/multi-cluster/)には、「マルチクラスタ環境を使うなら、k8sはその方法を提供してそれらを統合する」というような内容がある

    - [Federating Clusters](http://kubernetes.io/docs/admin/federation/)という公式ドキュメントを確認すると、フェデレーションのコントロールについて簡単に説明あり

    - 詳しい説明は[Githubのドキュメント](https://github.com/kubernetes/kubernetes/blob/release-1.3/docs/proposals/federation.md)に書かれていて、「別名：Ubernetes」という名前で呼ばれている

    - このドキュメントでk8sのクラスタってそもそもなんだ？っていうのも開設されている

        - k8sのクラスタの概念とかがわかるので、一度目を通すことを推奨

##k8sを複数の[zone](https://www.idcf.jp/words/zone.html)にて動かす方法はどうなってる？

- k8sのv1.2から、[Running in Multiple Zones](http://kubernetes.io/docs/admin/multiple-zones/)が実装された

- これにより１つのクラスタであれば複数のzoneにノードを置いて可用性を持たせることが可能に

- [公式ドキュメント](http://kubernetes.io/docs/admin/multiple-zones/)によると、[GCE](https://cloud.google.com/compute/)と[AWS](https://aws.amazon.com/jp/)においての方法が載っている

##Ubernetes-Liteってなんだ？

- k8sのv1.2から実装された同一のクラウドプロバイダ内(現在はGCEとAWSのみのようです)での複数のクラスターを管理することができるもの

- フルバージョンの実装前にお試し(α実装)で追加された機能で、[ここにあるGitHubのドキュメント](https://github.com/kubernetes/kubernetes/blob/release-1.3/docs/proposals/federation-lite.md)にその概要と使い方が詳しく載っている

##Ubernetesの実装はどうなってる？

- [GitHubのissue](https://github.com/kubernetes/kubernetes/issues/23653)によると以下のものはv1.3のリリース後に行われる予定になっている
    
    - e2eテスト([GCE](https://cloud.google.com/compute/)と[AWS](https://aws.amazon.com/jp/)にて)

    - ドキュメント化、[federated-apiserver](https://github.com/kubernetes/kubernetes/blob/release-1.3/docs/proposals/federated-api-servers.md)なるものとその[etcd](http://kubernetes.io/docs/admin/etcd/)の[H/A](http://e-words.jp/w/HA.html)

- [kubectl](http://kubernetes.io/docs/user-guide/kubectl-overview/)がUbernetesをサポートするようになり、k8sに追加される予定

#結論として今はきちんとフル機能を使えるの？
- 答えは「No！」である

- [最新のリリース](https://github.com/kubernetes/kubernetes/releases)を見守りながらフル実装を待つべし

####最後までご覧いただきまして、ありがとうございました。
ConstraintLayoutでTextViewのWidthをAnySizeにしたら文字が欠けてしまう問題(constraint-layout:1.0.0-alpha4)

# 解決法

`com.android.support.constraint:constraint-layout` を `1.0.0-alpha5` 以上のものを使う

```build.gradle
compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha5'
```

# 環境

* AndroidStudio 2.2 Preview 6
* com.android.tools.build:gradle:2.2.0-alpha6
* com.android.support.constraint:constraint-layout:1.0.0-alpha4

# 問題

AndroidStudio 2.2 previewから新しく追加されたConstraintLayoutを使っていて、TextViewのWidthを中のTextによって可変 + 折り返して欲しかったのに文字が欠けてしまっていた

構成的にはこんな感じ

<img width="402" alt="34e38678-c73e-e558-81cd-665ac530a3b2.png" src="https://qiita-image-store.s3.amazonaws.com/0/6717/f95ae4a2-a40f-d2d7-7e1d-dc3e23349bba.png">

```layout.xml
<TextView
    android:text="hogehogehogehogehogehgoehogehgoehgoehgoeghoe"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:id="@+id/textView"
    android:textSize="18sp"
    android:scrollHorizontally="true"
    app:layout_constraintLeft_toRightOf="@+id/imageView"
    android:layout_marginLeft="8dp"
    android:layout_marginStart="8dp"
    app:layout_constraintTop_toBottomOf="@+id/textView"
    android:layout_marginTop="8dp"
    app:layout_constraintRight_toRightOf="@+id/comment_item"
    android:layout_marginRight="16dp"
    android:layout_marginEnd="16dp"
    app:layout_constraintBottom_toBottomOf="@+id/comment_item"
    android:layout_marginBottom="16dp"
    app:layout_constraintHorizontal_bias="0.0" />
```

これを実行すると、以下のように右端の文字が欠けてしまう

<img width="420" alt="613f7c9c-6078-03cf-df12-5887d06b3b23.png" src="https://qiita-image-store.s3.amazonaws.com/0/6717/42d2fee3-00e3-350e-fb86-466a5e739c4f.png">

# 原因と解決法

`com.android.support.constraint:constraint-layout:1.0.0-alpha4` のバグらしい
`1.0.0-alpha5` で修正されたのでそちらを使う

現時点(2016/8/17)では `1.0.0-alpha7` が最新なのでそれを使ったら正しく表示された

```build.gradle
compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha7'
```

<img width="425" alt="be779dbc-fd19-6153-b83e-6dd80b0e25dd.png" src="https://qiita-image-store.s3.amazonaws.com/0/6717/45bb05b9-c4f8-ab96-d53e-541641a5cdce.png">

# 余談

ConstraintLayoutなどのAndroidSDK付属のtoolはgradleのdependenciesに書くだけではダウンロードされない
AndroidStudioのSDK Managerを開き、SDK Toolsタブで別途updateすると使えるようになる
ややこしいなこれ

<img width="218" alt="0edba27d-e043-c04a-6eb3-5de3bd7f6b2f.png" src="https://qiita-image-store.s3.amazonaws.com/0/6717/40cec823-17ee-77f3-655d-24ad9274bb64.png">
![6fcd44d6-90c9-399b-b1d8-e720a82a13d8.png](https://qiita-image-store.s3.amazonaws.com/0/6717/eef6e91f-3a52-f487-1100-3a0de666a8db.png)

# 参考

http://stackoverflow.com/questions/38393954/wrong-textview-display-in-constraintlayout-when-anysize
http://stackoverflow.com/questions/37992187/gradle-sync-failed-could-not-find-constraint-layout1-0-0-alpha2
ファイルを添付してメールするシェル

ファイルを添付してメールシェルです。
Solarisで何かしてたなつい時代の物ですが優先度そのたヘッダを変えたりしたいときの参考に自分用メモの転記。

ここがポイント：Content-Type: multipart/mixed; boundary="--yama"

```
% cat file_send.sh
#! /bin/sh
#set -x

thisdir=`dirname "$0"` # $thisdir ← このスクリプト自身のあるディレクトリ
ROOT="$thisdir"
BIN="$ROOT"
DATA="$ROOT"
LANG=ja
FILE_DIR=/path_to_file_dir

logfile=$DATA/report2.log
exec 2>>$logfile >&2
#date >&2
#set -x

GDT="/usr/local/bin/gnu_date"
BIGM=`$GDT +%Y%m%d`
TIME01=`$GDT +%Y%m%d%H%M`
TDATE=`date '+%Y%m%d'`
#DATE0=`$GDT -d "$BIGM 1 month ago" +%Y/%m/%d`
DATE0=`date '+%Y/%m/%d %H:00'`
CHK_FILE=filename.$TDATE.csv.zip

SUBJ="メール件名 "$BIGM""

###----------------------------------------------------------------------------
### パラメータ
mail_to='宛先'
#mail_cc='ｃｃ宛先'
#mail_bcc='ｂｃｃ宛先'
mail_from='送信元'
mail_err=エラー宛先'
mail_subj=$SUBJ

###----------------------------------------------------------------------------#
### 情報取得 & メール送信
#cat <<EOF
euctojis <<EOF | mailx -t
To: $mail_to
CC: $mail_cc
BCC: $mail_bcc
From: $mail_from
Errors-To: $mail_err
Subject: $mail_subj
X-Mailer: $0
#Content-Type: text/plain; charset=ISO-2022-JP
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="--yama"

----yama
Content-Type: text/plain; charset=iso-2022-jp

本文を書く


----yama
Content-Type: application/octet-stream; name="$CHK_FILE"
Content-Disposition: attachment; filename="$CHK_FILE"
Content-Transfer-Encoding: x-uuencode

`uuencode $FILE_DIR/$CHK_FILE $CHK_FILE`
----yama--

EOF

###----------------------------------------------------------------------------
### 実行済みマークして終了
exit 0
```
Linuxなら`gnu_date`は`date`でいける気がします。
`uuencode`は`yum install sharutils`でとれるらしいです。`base64`でもいいようです。

参考：
[メールヘッダの一覧](http://www.atmarkit.co.jp/fnetwork/rensai/netpro03/mail-header.html)
`man mailx`
[uuencode uudecodeがない場合はbase64を使えばよいらしい | 駄文と書評](http://ryouchi.seesaa.net/article/299818825.html)
[メールデータの構造 - takami_hirokiの日記](http://d.hatena.ne.jp/takami_hiroki/20110209/p1)
[SMTPサーバのメール送信テストにmailxコマンドを使う ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/using-mailx/)
MongoDBの_idから日時を抽出する

MongoDBの_idの上位８文字は、作成時刻のunixtimeの16進数表現です。
例えばpythonであれば以下の様なスクリプトで抽出できます。

スクリプト

```py
from datetime import datetime
mongo_id = "57b3ce6269d7d0098ef3b603"
print(datetime.fromtimestamp(int(mongo_id[0:8],16)))
```

実行結果

```
$ python hoge.py 
2016-08-17 11:39:30
```
kramdown gemでhard wrapを有効にする

https://github.com/gettalong/kramdown
これのこと

http://kramdown.gettalong.org/options.html
optionsを見るにGFMパーサを使うように設定すれば良いらしいが設定方法が分からない...orz

https://github.com/gettalong/kramdown/issues/217

```rb
Kramdown::Document.new(text, input: 'GFM', hard_wrap: true).to_html
```

issueを探してたらあった！
モデルのdescription実装を楽する


CustomStringConvertible の extension を実装して、 description の実装を楽にします。

自作クラスを print() に入れた時に中の値を出して欲しい場合は、CustomStringConvertible を採用し description プロパティを実装する必要があります。

けれど、毎回何度も似たようなコードを書くのは面倒なので、protocol を extension できないか試したらとりあえず直近のモデルでは出力できたので、コード置いときます。 

~~~swift
extension CustomStringConvertible {
    public var description: String {
        let mirror = Mirror(reflecting:self)
        var result = String(mirror.subjectType) + "{"
        for case let(label?, value) in mirror.children {
            result += " ,\(label):\(value)"
        }
        return result.stringByReplacingOccurrencesOfString("{ ,", withString: "{") + "}"
    }
}
~~~
WP-CLIでユーザーを作成する


##使いどころ
パスワード忘れたとかでログインできなくなったけど、サーバーにはsshでログインできる時

##コマンド

```
$ wp user create \
	USER_NAME \
	USER@MAILADDRESS \
	--role=administrator \
	--user_pass=USER_PASSWORD
```

##参考
http://wp-cli.org/commands/user/create/
【AWS】Lambdaでiniファイルを使用する【Python】


## 内容
小ネタです。
Lambdaを書いていて個別の設定値を書き込みたいことも多々あると思います。
その際、ソースコード内に直書き指定しまうと直すのが大変だったり、他のファンクションでもその値は使い回したりすることもあるかと思います。

だったら、設定用のiniファイルを用意してそれを読みこめば良いのでは？
ということでiniファイルの使い方です。

対象言語はPythonです。

## 使用するモジュール
ConfigParser

## iniファイル
iniファイルを使用するので、ローカルでzip圧縮したものをアップロードします。
iniフィアイルはPythonスクリプトファイル「lambda_function.py」を配置したディレクトリに配置します。
今回は「config.ini」という名前で保存します。

```python:config.ini
[dynamodb]
table_name : hogehoge_table
[sns]
topic_arn : arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:xxxxxx
```

みたいに記述していきます。

## 使用方法
iniファイルを用意したら、スクリプトの中で以下のように使用していきます。

```python:lambda_function.py
# -*- coding: utf-8 -*-

from __future__ import print_function
import ConfigParser
import boto3

# configファイルの読み込み
ini = ConfigParser.SafeConfigParser()
ini.read("./config.ini")

# DynamoDB
dynamodb = boto3.resource('dynamodb')
dynamoTable = ini.get("dynamodb", "table_name")
dynamo = dynamodb.Table(dynamoTable)

# sns
snsTopic = ini.get("sns", "topic_arn")

def lambda_handler(event, context):
	<< 実際の処理部分 >>

```

ini.get("sns", "topic_arn")の様に、[xxx]で書かれている固まりを第一引数に指定します。
次に、その固まりの中の取りたい要素を第二引数に指定します。

---
AWSのキー情報をスクリプトに書き込んでパブリックに公開してしまう・・・
そんな話をよく聞きますが、そういった情報はiniファイルに分けてしまうのも良いのではないでしょうか。
Docker for MacでGitlabを試す


[Dockerで5分くらいでGitLabを試す](http://qiita.com/yacchin1205/items/fa774011d72ead599eb5)を参考にdocker-compose.ymlを落としてきて、docker-compose up -d でいけました。

ただし、Docker for Macだとボリュームをマウントするパスがエラーになるので、docker-compose.ymlを編集する必要があります。
(↓はdocker-compose.ymlのdiff取りやすいように、wgetでなく、git cloneでリポジトリごと落としてます。)

```
$ git diff
diff --git a/docker-compose.yml b/docker-compose.yml
index 648e3b7..7105a17 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -7,13 +7,13 @@ services:
     command:
     - --loglevel warning
     volumes:
-    - /srv/docker/gitlab/redis:/var/lib/redis:Z
+    - ./docker/gitlab/redis:/var/lib/redis:Z

   postgresql:
     restart: always
     image: sameersbn/postgresql:9.5
     volumes:
-    - /srv/docker/gitlab/postgresql:/var/lib/postgresql:Z
+    - ./docker/gitlab/postgresql:/var/lib/postgresql:Z
     environment:
     - DB_USER=gitlab
     - DB_PASS=password
@@ -30,7 +30,7 @@ services:
     - "10080:80"
     - "10022:22"
     volumes:
-    - /srv/docker/gitlab/gitlab:/home/git/data:Z
+    - ./docker/gitlab/gitlab:/home/git/data:Z
     environment:
     - DEBUG=false
```
linux のzshで、コマンドの終了後通知してもらうときに、必要なもの。書きかけ

# 概要

* [marzocchi/zsh-notify: Desktop notifications for long-running commands in zsh.](https://github.com/marzocchi/zsh-notify)

これを使ってみたかったのだが、うまく動かなかったので、調べ始めた。

# 結論

最初のやつは必要だと思うが、後ろの２つはどちらかがあればよいのかもしれない

```
apt-get install libnotify-bin wmctrl xdotool
```

# 経過

一応書いてあるとおりに実行してみたつもりだが、まだ動いていない。

# 追記(2016-08-17)、動きました。

oh-my-zsh では、正しくpluginが読み込まれていなかった。

```
cd $ZSH/custom/plugins/zsh-notify
ln -s notify.plugin.zsh zsh-notify.plugin.zsh
```