OmniAICreator/Qiita-1.07M huggingface dataset:
Markdown から tex を出力し、PDF を生成してみた

# はじめに
前にWord でレポートを書いていたけど、目に見えない機能というか挙動にイライラしてた。。Markdown だったら全て明示的にマークアップできるので思い通りに書けるのではないかと思いやってみた。

# 事前準備
下記ツールのインストールする。僕は以下のバージョンで試した。

* rake, version 10.0.3
* ImageMagick 6.6.9-7
* pandoc 1.9.1.1

# テンプレート
github にテンプレートをアップした。
https://github.com/takuyaohashi/report_template

Rakefile の部分だけ抜粋すると、以下のようになる。
枠組みだけ、report.tex で作って、その中の section を Markdown で記述して、PDF 化している。
画像も PNG から EPS ファイルに変換して挿入している。

```ruby:Rakefile
##
## Rakefile for Building Report from Rakefile
##
require 'rake/clean'

REPORT_FILE = "report.pdf"
MD_FILES = FileList["src/*.md"].exclude("README.md")
TEX_FILES = MD_FILES.ext(".tex")

CLOBBER.include("*.pdf")
CLEAN.include(TEX_FILES)
CLEAN.include("*.dvi", "*.log", "*.aux")

task :default => [:dvi2pdf]
  
task :dvi2pdf => [:tex2dvi] do
  sh "dvipdfmx", REPORT_FILE.ext(".dvi")
end
  
task :tex2dvi => [:md2tex] do
  sh "platex", REPORT_FILE.ext(".tex")
  sh "platex", REPORT_FILE.ext(".tex")
end

task :md2tex => TEX_FILES

# *.md -> *.tex 変換ルール
rule ".tex" => ".md" do |t|
  sh "pandoc", "-o", t.name, t.source
end
```
# 良かったこと
## 文章の記述に集中できる
Word だといろいろ装飾が邪魔してイライラしていたけど、Markdown なら簡単にマークアップしていくだけで見やすく、構造の変更がしやすい。
デザインと文章が分かれているので、後からでもデザインが変更できる。

# 思い通りに行かなかったこと
## 画像の挿入
下記の記述方法で画像が挿入できるけど、これ以上の細かい指定ができず、右詰めとかサイズ変更ができない。

```markdown:変換前
![hoge](hoge.eps)
```

```tex:変換後
\begin{figure}[htbp]
\centering
\includegraphics{hoge.eps}
\caption{hoge}
\end{figure}
```

## 画像へのリンク
tex では、label と ref でリンクが張れるが、Markdown にそのような記述がないからリンクが張れない。
文章中で画像を参照したいときに Markdown 内で完結しない。変換後の tex を修正するしかない。

## テーブルの作成
テーブルを使おうと思ったが、うまくtexがコンパイルできなかった。下のページを参考にしてみたが、うまくいかなかった。
仕方なく tex をそのまま書いた。
[pandocでmarkdownをtexに変換するとtableがおかしくなる件](http://qiita.com/vintersnow/items/8cae4ccbe92fd96c88bb)

# おわりに
Word よりイライラは少ないが、画像周りの処理がうまくもっと行けば快適にレポートがかけると思う。
もし記事内で僕ができなかったことで、やり方を知っている人は教えてください･･･
Swift で Phantom Type (幽霊型)

社内の「Scala 勉強会」で **Phantom Type (幽霊型)** という厨二心をくすぐる感じのデザインパターンを教えてもらったので、同じことを Swift でもやってみました。

インスタンスの状態を変数ではなく **型パラメータ** として持つことで、状態チェックを実行時ではなく **コンパイル時** に行えるというイカしたテクニックです。

```
class Status{}
class NotReady: Status{}
class Ready: Status{}
 
class Something<T: Status> {
    static func createInstance() -> Something<NotReady> {
        return Something<NotReady>()
    }
    
    func readify() -> Something<Ready> {
        return Something<Ready>()
    }
}
 
extension Something where T: Ready {
    func shout() {
        print("phantom types are awesome!")
    }
}
```

`Status` は `NotReady`, `Ready` をサブクラスに持つだけの空クラス（これが幽霊型）で、`Something` は `Status` 型の型パラメータ `T` を持っています。`Something` には `where T: Ready` という **型パラメータ制約付きの拡張** によって、`shout()` という関数を追加しています。

`createInstance()` で`Something<NotReady>` インスタンスが作られ、`readify()` を呼ぶと新たに `Something<Ready>` インスタンスが作られます。そうして作られた `T: Ready` のインスタンスに対してのみ `shout()` を呼ぶコードが書けるのです。

やってみましょう：

```
let s = Something.createInstance()
s.shout() // error: 'NotReady' is not a subtype of 'Ready'
```

ちゃんと **コンパイルエラー** が出ました！
一方で `readify()` を呼ぶと…
 
```
let s = Something.createInstance()
s.readify().shout() // phantom types are awesome!
```

エラーもなく、ちゃんと実行もできました！

こうすることで **コンパイラレベル** で間違った状態での処理を防げるので、そのためのテストも作らなくて済むことになります。

**Phantom Type** カッコイイですね :trollface::+1:
ChromeでAjax通信時にエラー発生したときのメモ

#Ajax通信時に「provisional headers are shown」エラーではまったメモ

```script.coffee
$.ajax({
  url: "http://example.com/ajax.php",
  type: "POST",
  dataType: datatype,
  cache: false,
  data: {'test':'test'},
  })
```

```ajax.php
<?php
# URL : http://hoge.example.com
$data = array("res"=>"responce");
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data);
?>
```
example.com も hoge.example.com　同一IPなので問題ないと思ったがクロスドメインと判定されエラーになっている。

この場合はhoge.example.comをexample.comに直せば改善するが
異なったドメインにアクセスするにはサーバーをCORS対策するかJSONNPで


[nginx CORS設定](https://gist.github.com/Stanback/7145487)

```nginx.conf
#
# CORS header support
#
# One way to use this is by placing it into a file called "cors_support"
# under your Nginx configuration directory and placing the following
# statement inside your location block(s):
#
#   include cors_support;
#
# A limitation to this method is that Nginx doesn't currently send headers
# specified by add_header when the backend returns a 4xx or 5xx status code.
#
# For more information on CORS, please see: http://enable-cors.org/
# Forked from this Gist: https://gist.github.com/michiel/1064640
#

set $cors '';
if ($http_origin ~* 'https?://(localhost|www\.yourdomain\.com|www\.yourotherdomain\.com)') {
        set $cors 'true';
}

if ($cors = 'true') {
        add_header 'Access-Control-Allow-Origin' "$http_origin";
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With';
}

if ($request_method = 'OPTIONS') {
        return 204;
}
```
ErrbitをLDAP連携してログインできるようにする


ErrbitのREADMEを見ると、[Configuring LDAP authentication](https://github.com/errbit/errbit#configuring-ldap-authentication)というのがあり、ログイン認証にLDAPを使うことができるようです。
Errbitにログインするために一々アカウントを作るのが面倒なのと、LDAPサーバがシステム内にあるので連携してみることにしました。

大体は[Configuring LDAP authentication](https://github.com/errbit/errbit#configuring-ldap-authentication)の通りに設定すれば良いのですが、ところどころ設定に躓いたのでまとめました。

<!--more-->

`USER_HAS_USERNAME`をtrueに変更します。

```
# .env
ERRBIT_USER_HAS_USERNAME=true
```

`Devise LDAP Authenticatable`というgemをインストールします。

```ruby
# Gemfile
# 追加
gem "devise_ldap_authenticatable", :git => "git://github.com/cschiewek/devise_ldap_authenticatable.git"
```

```bash
$ bundle install --path=vendor/bundle
$ bundle exec script/rails generate devise_ldap_authenticatable:install
      create  config/ldap.yml
      insert  config/initializers/devise.rb
        gsub  app/models/user.rb
      insert  app/controllers/application_controller.rb
```

`config.ldap_create_user`を有効にします。

```ruby
# config/initializers/devise.rb
Devise.setup do |config|
...(省略)...
  config.ldap_create_user = true
...(省略)...
end
```

`devise_ldap.rb`を新規作成します。

```ruby
# config/initializers/devise_ldap.rb
Errbit::Config.devise_modules << :ldap_authenticatable

```

LDAP認証後にErrbitでユーザ登録させます。
上記URLの説明だとLDAPに登録されている、givenName(名)、sn(姓)、mail(メールアドレス)からユーザ情報を登録させていますが、管理しているLDAPサーバにそれらの情報は登録していないので下記のように修正します。
また、タイムゾーンとadmin権限も合わせて設定します。

注意点として、`ldap_before_save`メソッドはpublicで定義する必要があるので、`private`より上で定義します。

```ruby
# app/models/user.rb
  # 追加
  def ldap_before_save
    name = Devise::LDAP::Adapter.get_ldap_param(self.username, "cn")
    self.name = name.first
    self.email = self.name + "@foo.com"
    self.time_zone = "Tokyo"
    self.admin = true
  end
```

LDAPサーバへの接続設定を行います。
ErrbitをProduction環境で動かしているので以下のように設定します。

```yaml
# config/ldap.yml
production:
  host: <LDAPサーバのホスト名>
  port: 389
  attribute: cn
  base: ou=people,dc=foo,dc=com
  admin_user: cn=admin,dc=test,dc=com # 設定する必要なし
  admin_password: admin_password      # 設定する必要なし
  ssl: false
  # <<: *AUTHORIZATIONS
```

ここまで設定したら、Unicornを再起動します。
私の場合、daemontoolsで起動しているので、プロセスをバッサリ切っても自動的に起動するので問題ありません。

```bash
$ sudo kill -QUIT $(cat tmp/unicorn.pid)
```

起動完了したら、Errbitにアクセスして、ユーザ名(メールアドレスではない)とパスワードを入力すれば、Errbitにユーザ登録されるはずです。
何かエラーがでたら、Railsのログを見て対応します。

## 参考URL

* [Configuring LDAP authentication](https://github.com/errbit/errbit#configuring-ldap-authentication)
* [Devise LDAP Authenticatable](https://github.com/cschiewek/devise_ldap_authenticatable#devise-ldap-authenticatable)

元記事は[こちら](http://blog.jicoman.info/2015/07/errbit_ldap_authentication/)
ATS + CoreDateを使う準備 忘備録

##ATS + CoreDate(Magical Record)でプロジェクトを作る順序

1 プロジェクトを生成
2 プロジェクト作成時に「Core Data」を使うとする。
3 ATSの設定を行う => 本来は、ドメインの指定を行うのが良い。
4 Podファイルの生成
今回は、AFNetworling + Magical Recordを使う。

```
//pod init podファイルの初期化

  platform :ios, "8.0"
  pod 'AFNetworking', '~> 2.0'
  pod 'AFNetworkActivityLogger', '~> 2.0'
  pod 'MagicalRecord' 

//pod install 指定したpodのインストール
```

5 モデルデータの生成



6 SwiftでObjectice-Cを扱うために「bridge headerファイル」を生成する。
  作ったObjective-Cのhとmは削除してよい。

7 Bridge headerファイルにimportを書く

```

```

8 ログを出力する => AppDelegate.swift

```
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    AFNetworkActivityLogger.sharedLogger().level = .AFLoggerLevelDebug
    AFNetworkActivityLogger.sharedLogger().startLogging()
    return true
}
```
Pythonで特異値分解してみる

やりたいこと：線型代数の特異値分解(singular value decomposition)を確かめてみる

$m$行$n$列の行列$A$に対して、

- $U$:$m\times m$のユニタリ行列
- $\Sigma$: $m\times n$の実対角行列(成分は非負)
- $V$: $n\times n$のユニタリ行列

が存在して、下記が成立

```math
A=U\Sigma \overline{V^T}
```

ここで上線は複素共役(complex conjugate)、$^T$は転置(transpose)。

## (サンプル)行列の定義
```math
A=\left(
\begin{matrix}
1 & 2 \\
3 & 4 
\end{matrix}
\right)
```

```py
> import numpy as np
> A = np.array([[1,2],[3,4]])
```

### 一応、中身のck
```py
> A 
array([[1, 2],
       [3, 4]])
```

## 早速、SVDしてみる

```py
U, s, V = np.linalg.svd(A, full_matrices=True)
```

返り値が3つです。

### 中身のck

```py
> U
array([[-0.40455358, -0.9145143 ],
       [-0.9145143 ,  0.40455358]])
> s
array([ 5.4649857 ,  0.36596619])
> V
array([[-0.57604844, -0.81741556],
       [ 0.81741556, -0.57604844]])
```

なんか、$s$が潰れてしまってる感じですが、実体は対角成分だけ、つまり

```py
> np.diag(s)
array([[ 5.4649857 ,  0.        ],
       [ 0.        ,  0.36596619]])
```

が実体の行列です。

## 元に戻るか確認

```math
A=U\Sigma \overline{V^T}
```
を確認してみます。

```py
>np.dot(np.dot(U, np.diag(s)),V)
array([[ 1.,  2.],
       [ 3.,  4.]])
```
いい感じですね♪
⇒ここで、行列$V$は実行列で求まっているため、複素共役はしなくて良いですが、転置は取らないものが返り値として戻ってきているようですね。

## 念のための確認

### Uがユニタリ行列

```py
> np.dot(U, U.T)
array([[  1.00000000e+00,   2.77555756e-16],
       [  2.77555756e-16,   1.00000000e+00]])
```

対角成分でないところに$0$でない値が入ってしまうのは数値的に仕方ないですね。

### Vもユニタリ行列

```py
> np.dot(V, V.T)
array([[ 1.,  0.],
       [ 0.,  1.]])
```
Rails4でMongodb使用時にDBエラーが出たときメモ



久しぶりにlocalで動かしてみたら、APIが動かなくなっていた。


```
Moped::Errors::ConnectionFailure in Api::V1::EntriesController#index
Could not connect to a primary node for replica set #<Moped::Cluster:70200329217200 @seeds=[<Moped::Node resolved_address="127.0.0.1:27017">]>
````

調べてみたらDBサーバーが動いてないだけだった。

```bash:
$ mongod --config /usr/local/etc/mongod.conf

```

でなおった
Macにsassをインストール & 基本的な　Sass  コマンド

#1.インストール
1.rubyがインストールされている事の確認
`ruby -v`
結果：![Kobito.HKF2NC.png](https://qiita-image-store.s3.amazonaws.com/0/72578/0437e7f2-a723-e3f1-ad5f-77497b5368b5.png "Kobito.HKF2NC.png")
確認OK

2.sassのインストール
`sudo gem install sass`
結果
![Kobito.V682Iv.png](https://qiita-image-store.s3.amazonaws.com/0/72578/fb00f4ad-b195-8411-2198-222110985a6e.png "Kobito.V682Iv.png")

3.インストールされた事の確認
`sass -v`
結果
![Kobito.VvFaW8.png](https://qiita-image-store.s3.amazonaws.com/0/72578/b33052d6-6ed0-14c8-62a1-5b29414b1024.png "Kobito.VvFaW8.png")

4.最新版へのアップデート

+ gem update

`sudo gem update --system`

結果
![Kobito.LB9dKy.png](https://qiita-image-store.s3.amazonaws.com/0/72578/61245ef2-96eb-f387-b967-36102bde383f.png "Kobito.LB9dKy.png")


+ Sass update
`sudo gem update sass`
 
 結果
 ![Kobito.okxxRm.png](https://qiita-image-store.s3.amazonaws.com/0/72578/d415a668-eb69-a459-b2d1-7c4a2d3d58ec.png "Kobito.okxxRm.png")
 
#2 Sassの基本的なコマンド
 1.コンパイル
 `sass input.scss:output.css`
 (inout.scssファイルをコンパイルしてoutput.cssファイルを作成）
 ＊コンパイル時にcssのスタイルを指定するのは--styleオプション
 `sass input.scss:output.css --style (expanded | compact | compressed | nested(default))`
 
 2.watchオプション
 フォルダ単位で更新を監視して自動的にscss → css へ
 `sass -- watch inputフォルダ(:outputフォルダ)`
 
 3.--cache-lacation オプションでキャッシュフォルダの場所を指定する
`sass --watch inputフォルダ(:outputフォルダ) --cache-lacation キャッシュフォルダ`

#3.おまけ シェルスクリプト化
```sass_compile.command
#!/bin/sh

cd $(dirname $0)
sass --watch sass:css --style expanded --cache-location cache
```
`chmod +x sass_compile.command`
変更入ったファイルのみトランスパイル等したかったので gulp-cached と gulp-remember を使った

Gulp初心者です。

```js:gulpfile.js
gulp.task('transform', function () {
  return gulp.src('./scripts/**/*.js')   
    .pipe(babel())
    .pipe(react())
    .pipe(gulp.dest('./dist'));
});
```

こんな感じで、`watchify`でファイル監視して、`gulp-babel`と`gulp-react`を使ってトランスパイルとトランスフォームの処理を行っているのですが（`babelify`のほうがいいのかな）、このタスクで現在`2sec`近くかかっていてなんかいい方法あるだろうと思って調べたら、

http://stackoverflow.com/questions/31712408/improving-build-time-with-gulp-and-babel

ありました。`gulp-cached`と`gulp-remember`使って、差分のみ処理行うようにできるよと。

```js:gulpfile.js
gulp.task('transform', function () {
  return gulp.src('./scripts/**/*.js')
    .pipe(cached('transform-cache'))    
    .pipe(babel())
    .pipe(react())
    .pipe(remember('transform-cache')) 
    .pipe(gulp.dest('./dist'));
});
```

これまで毎回処理が走る度にこれくらい時間のかかっていたものが

> [11:14:53] Finished 'transform' after 1.95 s
[11:15:15] Finished 'transform' after 1.42 s
[11:15:21] Finished 'transform' after 1.38 s
[11:15:27] Finished 'transform' after 1.57 s

以下のように確かに早くなっています（watch開始時にも処理を走らせているので初回は時間かかっている）

> [11:13:05] Finished 'transform' after 1.93 s
[11:13:20] Finished 'transform' after 78 ms
[11:13:28] Finished 'transform' after 80 ms
[11:13:33] Finished 'transform' after 68 ms
Chrome Developer Toolsの便利機能

Chrome Developer Toolsの便利機能の説明です

# Workspace

CSS、JavaScriptを編集してそのままローカルに保存できます
設定ダイアログのWorkspaceで設定します

## 使い方

Add folderをクリックしてローカルにあるフォルダを選択
![WorkSpace_Add folder.png](https://qiita-image-store.s3.amazonaws.com/0/54850/3e06ceab-a3c6-6c02-bec3-b789b4fb0ff7.png)


ウィンドウ上部に
「デベロッパー ツールでは ***** へのフルアクセスがリクエストされます。機密情報の漏洩にご注意ください。」
と表示されるので、問題なければ許可を選択

![WorkSpace_機密情報漏洩確認.png](https://qiita-image-store.s3.amazonaws.com/0/54850/6077d47b-00c0-2aa5-6274-9397cf2184ce.png)


Sourcesパネルにローカルのフォルダが追加されます
![WorkSpace_フォルダ追加.png](https://qiita-image-store.s3.amazonaws.com/0/54850/0811f26e-656e-8dc8-bec9-d890b0d3af9b.png)


マッピングしたいファイルを選択し右クリックして、「Map to file system resource」をクリックすると
![WorkSpace_Map to file system resource.png](https://qiita-image-store.s3.amazonaws.com/0/54850/b02371e4-65a0-c786-148c-853002175b11.png)
対応するローカルファイルが選べるようになってるので選択する
![WorkSpace_ローカルファイル選択.png](https://qiita-image-store.s3.amazonaws.com/0/54850/fdc8d912-bb11-982c-b5c9-1ab8e5bd2c51.png)


選択すると、再起動の確認ダイアログが表示されるので問題なければOKを選択
![WorkSpace_再起動確認.png](https://qiita-image-store.s3.amazonaws.com/0/54850/7b4b4cdd-d828-80fe-ddcc-bbb0aeecdf76.png)

**マッピングしたファイルをDeveloper Tools上で編集・保存すると
ローカルファイルにも反映されてます**

リロードせずにページが反映されて、その内容がローカルファイルにも記述されるので
ページを作る時とかに便利です

# CSSセレクタ、CSSプロパティにジャンプ

Ctrl(Cmd)＋クリックでCSSセレクタ、CSSプロパティにジャンプしてくれます
![CSSジャンプ.png](https://qiita-image-store.s3.amazonaws.com/0/54850/5dd86a8b-48d0-d31e-8a2c-86731aa2d42e.png)
↑ホバーした時にアンダーラインが表示される(div#viewportの部分)

# Consoleで改行

Shift+Enterで改行できます

# Developer Toolsの色を変えたい

これは標準の機能じゃないのでやる時は自己責任で

chrome://flagsにアクセスするとブラウザの設定画面が開きます
![enable-devtools-experiments.png](https://qiita-image-store.s3.amazonaws.com/0/54850/67e426cf-6935-38a4-59bf-a5a3c9ea4ba3.png)
↑この項目を見つけて有効にしてブラウザを再起動します(enable-devtools-experimentsで検索するといいです)

この状態でDevloper Toolsの設定ダイアログを開くとExperimentsという項目が増えているので
その中の「Allow custom UI themes」にチェックを入れます

![Experiments.png](https://qiita-image-store.s3.amazonaws.com/0/54850/a2cc9db4-9609-1455-c2d4-fc2c9206a5a5.png)

これで色を変えられる状態になったので、あとは「Developer Tools theme」とかで調べると色々出てくるので
インストールしてみてください
RailsのActiveRecordを継承しているModelでaccessorにbooleanを使いたい場合の対処法

### 問題点

ActiveRecord以外でアクセサを追加したい場合にformでboolean型の値を受け取ると文字列でセットされてしまう。

```rb:model
class Topic < ActiveRecord::Base
  # pickupフラグ
  attr_accessor :pickup_flg
end
```
これをコントローラーで受け取ると

```rb:controller
def create
  @topic = Topic.new(topic_params)
  p @topic.pickup_flg # 'true'とString型になる
end 
...
private

def topic_params
  params.require(:topic).permit(:pickup_flg)
end
```

### 対処法
setterをモデル内に定義し、その中でboolean型に変換する

```rb:model
class Topic < ActiveRecord::Base
  # pickupフラグ
  attr_reader :pickup_flg

  def pickup_flg=(value)
    @pickup_flg = value.is_a?(String) ? value.to_bool : value
  end
end
```

Stringを拡張してbooleanに変換するto_boolメソッドを定義する。
条件のもの以外はArgumentErrorを返す。

```rb:string
class String
  def to_bool
    return true if self == 'true'
    return false if self == 'false'
    raise ArgumentError.new("invalid value for Boolean: \"#{self}\"")
  end
end
```

これで一応対処できました。
【C# 】==を使ったらコンパイルエラーを出させる

演算子 == をオーバーロードしてSystem.Obsoleteをつける

``` Element.cs
public class Element
{
    public static Element None  = new Element(0);
    public static Element Fire  = new Element(1);
    public static Element Water = new Element(2);
    public static Element Wood  = new Element(3);
    public static Element Light = new Element(4);
    public static Element Dark  = new Element(5);

    private readonly int _value;

    private Element(int v)
    {
        _value = v;
    }

    [System.Obsolete("==は使用不可" , true)]
    public static bool operator == (Element t1, Element t2)
    {
        throw new System.NotImplementedException();
    }

    [System.Obsolete("!=は使用不可" , true)]
    public static bool operator !=(Element t1, Element t2)
    {
        throw new System.NotImplementedException();
    }
}
```


```
Element element1 = Element.Fire;
Element element2 = Element.Water;

if(element1 == element2) { } //コンパイルエラー
dplyr::selectで文字ベクトルの列を操作しようとしてヘマしたので反省文を書く

まったく個人的なメモ

アンケート集計ファイルの「自由記述」テキスト列に、特定のキーワードを含むレコードだけ抽出するという単純な作業。
dplyr と strintr を使って何気に操作したら想定外の結果がかえってきて、しばらくして自分の勘違いに気が付いた。

```r
> # 単純な文字列ベクトルを要素とするデータフレーム
> x <- c("ABC","CDE","EFG")
> xx <- data.frame(X = x, stringsAsFactors = FALSE)
> # X列の文字列にCを含むレコードだけみたい
> xx %>% select (X) %>% str_subset("C")
[1] "c(\"ABC\", \"CDE\", \"EFG\")"
> # あれ?
> xx %>% select (X) %>% grep(pattern="C", x = ., value = TRUE)
                             X 
"c(\"ABC\", \"CDE\", \"EFG\")" 
> # うん？
> xx %>% select (X) %>% nchar
 X 
22 
> # dplyr::selectが問題なの？ 
> xx $ X %>% str_subset("C")
[1] "ABC" "CDE"
> xx $ X %>%  grep(pattern="C", x = ., value = TRUE)
[1] "ABC" "CDE"
> xx $ X %>% nchar 
[1] 3 3 3
> # どうなってんの？
> xx %>% select (X) %>% dput
structure(list(X = c("ABC", "CDE", "EFG")), row.names = c(NA, 
-3L), class = "data.frame", .Names = "X")
> xx $ X %>% dput
c("ABC", "CDE", "EFG")
> # ああ、そうですか
> ## 結局、こうすれば良いんか
> xx %>% filter (str_detect(X, "C"))
    X
1 ABC
2 CDE
> ## 後でdplyrのソース読め、俺
```

以上、お粗末さまでした。反省します。
C > ビット演算 > MSBとLSBのみ1とする実装 > return (1u << (size-1)) | 1;

MSBとLSBのみ1としたい。
ビット関連のデバッグに使用する。

例として3ビットの場合、`101b`を得たい。
5ビットの場合、`10001b`を得たい。


## try1(間違いあり)

```c
#include <stdio.h>

unsigned long getOnlyMSBandLSB(int size)
{
	return (1u << (size-1)) + 1;
}

int main(void) 
{
	unsigned long res;
	
	res = getOnlyMSBandLSB(3);
	printf("0x%X\n", res);

	res = getOnlyMSBandLSB(5);
	printf("0x%X\n", res);
	return 0;
}
```

```txt:結果
0x5
0x11
```

http://ideone.com/Jg5DPC


## try2 (修正版)

size==1の時の失敗と訂正方法について @fuzzball さんに教えていただいた。
感謝です。

```
#include <stdio.h>

unsigned long getOnlyMSBandLSB(int size)
{
	return (1u << (size-1)) | 1;
}

unsigned long oldFunc(int size)
{
	return (1u << (size-1)) + 1; // mistake!!!
}

int main(void) 
{
	unsigned long res;

	res = oldFunc(1);
	printf("0x%X\n", res);

	res = getOnlyMSBandLSB(1);
	printf("0x%X\n", res);
	
	res = getOnlyMSBandLSB(3);
	printf("0x%X\n", res);

	res = getOnlyMSBandLSB(5);
	printf("0x%X\n", res);
	return 0;
}
```

```txt:結果
0x2
0x1
0x5
0x11
```

http://ideone.com/zEibIS
ブログ目次

[「はんだ部 ~社内活動~」を見に行く](http://www.atware.co.jp/blog/2014/12/19/handa)
[「プロジェクト技術紹介」を見に行く](http://www.atware.co.jp/blog/2015/1/10)
[「第 7 回 はんだ部 活動レポート」を見に行く](http://www.atware.co.jp/blog/2015/2/7/handa-7)
[「第 9 回 はんだ部 活動レポート」を見に行く](http://www.atware.co.jp/blog/2015/3/23/handa-9)
[「VirtualBox から vagarnt の box 作成」を見に行く](http://www.atware.co.jp/blog/2015/4/20/to-vagrant-from-vm)
[「RaspberryPiにサーバをたてよう！」を見に行く](http://www.atware.co.jp/blog/2015/7/16/lets-flask)
[「ApacheでProxyを実現」を見に行く](http://www.atware.co.jp/blog/2015/8/5/apache-proxy)
[「Raspberry Pi でCouchbase Liteを動かしてみた」を見に行く](http://www.atware.co.jp/blog/2015/8/13/raspberrypi-couchbaselite)
[「Raspberry PI でGoogle Calendar APIを呼んでみた」を見に行く](http://www.atware.co.jp/blog/2015/9/3/raspberrypi-google-calendar-api)
[「RaspberryPi上でRedisを動かしてみた」を見に行く](http://www.atware.co.jp/blog/2015/9/8/raspberrypi-redis)
[「IntelliJでGo言語を開発しよう」を見に行く](http://www.atware.co.jp/blog/2015/9/13/intellij-go)
[「CentOS7にCouchDBをインストールしてみた」を見に行く](http://www.atware.co.jp/blog/2015/9/18/centos7-couchdb)
[「React Native for Androidをさわってみた」を見に行く](http://www.atware.co.jp/blog/2015/9/23/try-to-react-native-for-android)
[「Couchbase Live Tokyo 2015」を見に行く](http://www.atware.co.jp/blog/2015/9/29/couchbase-live-tokyo-2015)
[「webpack + Angular」を見に行く](http://www.atware.co.jp/blog/2015/11/5/webpack-angular)
[CakePHP3]DB更新時にNULLをセットするビヘイビア

自分が確認した限り（がっつり調べられていない）では、CakePHP3ではVARCHAR型カラムに対して画面の入力フィールドが未入力の場合、NULLではなく**空文字**がセットされる（バリデーションの設定とかに影響されてそう）。

**未入力ならNULLをセットしてほしいのでそれに対応した簡易的なビヘイビアを作成してみました。**

これ以外にいい方法があればご教授いただけると幸いです。

```php:cakephp3_behavior_null
<?php
namespace App\Model\Behavior;

use Cake\ORM\Behavior;

/**
 * 各テーブルクラスで、$this->addBehavior('App'); で利用してください
 */
class AppBehavior extends Behavior
{
    function beforeSave($event, $entity, $options) {
        foreach($this->_table->schema()->columns() as $key => $val) {
            if ($entity->get($val) === '') {
                $entity->set($val, NULL);
            }
        }
        return true;
    }
}
```
Swiftで任意の文字列が含まれるか判定

```swift
var str : String = "hello Swift"

if str.containsString("Swift") { // -> true
    print("Swiftが含まれる")
}

if str.containsString("swift") { // -> false
    //ここには来ない
}

//大文字小文字を無視させて評価
if str.lowercaseString.containsString("swift") { // -> true
    print("swiftが含まれる")
}

//これも同様にcaseを無視
if str.localizedCaseInsensitiveContainsString("HELLO"){ // -> true
    print("HELLOが含まれる")
}
```

# Swift3
```swift
var str : String = "hello Swift"

if str.contains("Swift") { // -> true
    print("Swiftが含まれる")
}

if str.contains("swift") { // -> false
    //ここには来ない
}

//大文字小文字を無視させて評価
if str.lowercased().contains("swift") { // -> true
    print("swiftが含まれる")
}

//これも同様にcaseを無視
if str.localizedCaseInsensitiveContains("HELLO"){ // -> true
    print("HELLOが含まれる")
}
```
コードレス電話機を入れ換えた話

# コードレス電話機を入れ換えた話
## 数年使っていたコードレス電話機のバッテリーがヘタってきたので
コードレス子機(親機の紐なし受話器も含めて)が4台あったので、各々にバッテリーを購入しているとそこそこな金額になってしまいそう

## たまたま見つけたコードレス電話機
[コードレス電話機 VE-GDW54DW](http://panasonic.jp/phone/p-db/VE-GDW54DW.html)

![1428110189563.png](https://qiita-image-store.s3.amazonaws.com/0/89027/6a090259-14e6-0173-f90c-6df30b7e4144.png)

見た目は昔からあるような普通のコードレス電話機
しかしこの電話機はスマートフォンとの連携ができるらしい
### 商品の特長
* (専用アプリをインストールすると)スマートフォンが自宅電話の子機になる  
[iOS対応版スマートフォンコネクト](https://itunes.apple.com/jp/app/sumatofonkonekuto/id875767286)  
[Android対応版スマートフォンコネクト](https://play.google.com/store/apps/details?id=com.panasonic.psn.android.jpdect.spct&hl=ja)  
ということはアプリのできがそこそこなら、  
・ コードレス子機を買い足さなくて済む  
・ 退役したスマフォの使いみちができる  
ということになります
* Fusion IP-Phone SMARTと連携して簡易なボイスワープ的に使える  
この機能はたぶん使わないと思う
* 留守番電話で用件があることをメール通知できる
* スマフォの電話帳を転送できる  
もうポチポチ入力する時代は終わったようです
* 別途購入すればワイヤレスセンサー(窓センサー、ドアセンサー)と連携できる


## 買ってみた
価格的に普通のコードレス電話機より少し高いかなレベルだったので、買ってみた

## 設置
### ◆電話機に電源、回線を接続
とりあえず子機は初回10時間充電しないといけないらしい(液晶パネルにそういう表示)
この電話機は親機の受話器も紐なしなので、先に充電しておいた

### ◆日付・時刻の設定
この系は定番作業ですね
そろそろRTC搭載かNTPによる時刻合わせ機能を持ってほしいものです
ショートカット：[機能]#001[決定]

### ◆無線LAN設定
スマートフォンと連携するためには無線LANの設定が必須です
WPSか手動接続(APを検索、SSIDを設定)が使える
ショートカット：[機能]#048[決定]
IPアドレスはDHCPによる割当か手動設定ができる
ショートカット：[機能]#049[決定]

### ◆在宅応答機能
在宅応答機能：留守設定に指定なくても15回コールされると留守設定にしてくれる便利機能
ショートカット：[機能]#112[決定]

### 留守呼び出し回数
留守設定している時のコール回数
ショートカット：[機能]#121[決定]

### ◆音声モニター
居留守(笑)使うときに
ショートカット：[機能]#074[決定]

### ◆スマートフォン増設
専用アプリをインストールしたスマートフォンを子機登録する
ショートカット：[機能]#124[決定]

### ◆いつか使うかもしれない機能
備忘的に取説から転記しておく
#### オフフック応答
充電台から外しただけで着信に応答できる
ショートカット：[機能]#009[決定]

#### エニーキーアンサー
どれかのキーを押せば着信に応答できる
ショートカット：[機能]#064[決定]

#### 電話帳登録
この電話機でしこしこ登録するより、専用アプリでスマフォの電話帳を転送できるので、そっちを使った方が楽そうだ
ショートカット：[機能]#200[決定]

#### 電話帳全消去
廃棄処分するときに
ショートカット：[機能]#144[決定]

#### 子機のキーロックと解除
[#]長押し

#### 出荷時へ戻す
ショートカット：[機能]#111[決定]

## まとめ
・スマフォが子機になると超便利
・そもそも着信は当てにしていない
→バッテリーの持ち等の関係もあるので、本来の子機で出ればいい
・スマフォアプリを含めた子機間の内線通話はできる
→VPNで接続して使えればいいのに...

個人的にはよい買い物でした

### これは是非欲しい機能
パナの人もし見てたらぜひぜひ機能追加してください
→この電話機はファームウェアアップデート機能もあるようなので..

#### ・NTPによる時刻合わせ機能はそろそろ搭載してもいいと思う
せっかくIPネットワークに接続するんですから
#### ・「外で通話」機能のために登録したFusionのIP-Phone SMARTを通話(発着信)に使わせて欲しい
「外で通話」機能では発信専用モードを使ってるんでしょう
今のところFusion IP-Phone SMARTは基本料金0円で契約できるんですから、Fusion IP-Phone SMARTの電話機としても使えたら使用の幅が広がると思います
#### ・留守番電話で用件があることをメール通知してくれるんだから、そのメッセージに音声を添付して欲しい
留守メッセージが入ったことだけがわかってもねぇ
もしくはFusion IP-Phone SMARTで着信できればいいと思うんです
2015-11-05 coding79 > 覚えている数値を使う > 3.141592 / 2.7 1828 1828 / 0.5772 ...

##内容

覚えている数値を使う。

自分がよく使うのは以下のようなもの。

- pi : 3.14159265358979
- [ネイピア数](https://ja.wikipedia.org/wiki/%E3%83%8D%E3%82%A4%E3%83%94%E3%82%A2%E6%95%B0) : 2.7 1828 1828
- [オイラー・マスケロニー係数](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%A4%E3%83%A9%E3%83%BC%E3%81%AE%E5%AE%9A%E6%95%B0) : 0.5772
- 79
- [アボガドロ定数](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%9C%E3%82%AC%E3%83%89%E3%83%AD%E5%AE%9A%E6%95%B0) : 6.022 x 10^23

3.141592を314.1592などとして使うのも適宜している。

ネイピア数は 2.7　と　1828　x 2とすると記憶の宮殿に格納しやすい。

##理由

ある桁数まで覚えている数値を使うことで、桁落ち、小数点の表示間違いなどが瞬時にわかる。
「何か変だ」というのをとらえることができる。

変な例 (途中から数値がおかしい)
`3.1412932`

変な例 (小数桁表示失敗)
`3.14000`


### 検索用キーワード
(2019-11-18追記)

- napier
WordPressでPHPをいじらずに「おっと、失礼しました」（404エラー）ページを変更する

WordPressで「おっと、失礼しました」と表示されると驚く、文面を変更しようと思ったがphpをいじらないとダメなようなので、他の方法がないか調べてみた。

見つかったのが下記の方法。
プラグインで「404page」（作者：smartware.cc）を検索しインストール。
「設定」から表示する固定ページを選択するだけ。
固定ページは作ってもいいし、既存のページでもよい。
【PHP】google app engine 登録手順

■対象ページ
[今すぐ Google App Engine をお試しくださいページ](https://console.developers.google.com/start/appengine?_ga=1.16522997.217577227.1438750412)

■プロジェクト（今回はgyosyo）を作成してデプロイ、コマンド
appcfg.py -A gyosyo-1028 update appengine-try-php

コマンドがエラーになる場合「--no_cookies」をいれるとよいらしい
appcfg.py --no_cookies -A gyosyo-1028 update appengine-try-php

ブラウザが立ち上がって、「The authentication flow has completed.」と表示される

そしてエラー
Error 400: --- begin server output ---
PHP 5.4 applications are prevented from being deployed to Google App Engine from any version of the SDK, including older ones. If you need to continue to deploy PHP 5.4 applications for compatibility reasons, you can request that your application be whitelisted for PHP 5.4 deployment by visiting http://goo.gl/qjKEuk.
--- end server output ---
なんかphpのバージョンが古いらしいのでこちらを[参考](http://qiita.com/tink1e_/items/5fa5bc8048170ca566ba)にapp.yamlを変更とコマンドに「--runtime=php55」を追加
appcfg.py --no_cookies --runtime=php55 -A sacred-result-102806 update appengine-try-php



■プロジェクトダッシュボードで管理
https://console.developers.google.com/
https://appengine.google.com/

■参考
http://nyarurato.hatenablog.com/entry/2014/08/22/033309
Inkscape の Mesure Path のエラーの解決方法(Mac OS X)

# はじめに

Inkscape では、Path の長さを `Extensions > Visualize Path >  Mesure Path` から測定することができます。

# エラーが発生して Mesure Path が使えない

エラーメッセージの内容を控え忘れましたが、2つの作業をしてエラーが解消したのでメモ。

## python3-lxml を入れる

`STATIC_DEPS=true sudo pip install lxml`

## Locale(?)を修正する

`/Applications/Inkscape.app/Contents/Resources/bin/inkscape` というテキストファイルの127行目に次の行を挿入する。

`export LANG="en_US.UTF-8"`
mysqlでカラムをコピー(update)

こんな感じでできました^^

テーブル：AAA
コピー先のカラム:BBB
コピー元のカラム：CCC

```ruby:例
UPDATE `テーブル` SET `コピー先のカラム` = `コピー元のカラム`

UPDATE `AAA` SET `BBB` = `CCC`
```
MacでAtomの環境変数PATHを設定する



## 背景

[Atomのプラグイン等](https://atom.io/packages/rst-preview-pandoc) で、``/usr/local/bin`` 等のexecutable fileを参照しようとして、"No such file" になりました。

Mac(Unix)では、親プロセスの環境変数を引き継ぐので、AtomをTerminal.appから起動した場合は ``~/.bash_profile`` 等に設定した環境変数が有効になります。

DockからアイコンクリックしてAtom開いた時はdefaultのPATHしか設定されていません。

## どうするか？

もっとうまい方法があるとは思いますが、取り敢えず↓でいけます。

メニューから...

* ``Preferences...`` → ``Open Config Folder`` → ``init.coffee``

を開いて、↓を書きます。


```
process.env.PATH = [ "/usr/local/bin", process.env.PATH ].join(":")
```

Atomを再起動します。
Windowsのgitと文字コードについて

Git for Windowsで、BOM付きUTF-16のテキストファイルを使用すると、gitにファイルがBinaryとして扱われてしまい、デフォルトの状態で以下の問題がある。

* git diff でdiffを見たときに、Binary files differ と表示され、差分の内容を見ることができない。
* git merge, git rebase を実行すると、修正した場所が別の所でも、CONFLICTが発生し、Automatic merge failedになる。

そこで、普段使いそうな文字コードでファイルを作成し、それぞれがどのように扱われるかを見てみた。

| 文字コード        | 扱い    | diff         | merge/rebase |
|:-----------------|:-------|:-------------|:--------|
| CP932            | text   | 文字化けする   | 成功する |
| UTF-8(BOM無し)    | text   | 文字化けしない | 成功する |
| UTF-8(BOM付き)    | text   | 文字化けしない | 成功する |
| UTF-16LE(BOM無し) | binary | -            | 失敗する |
| UTF-16LE(BOM付き) | binary | -            | 失敗する |

.gitattributes等はない状態での話です。
ES6過渡期のMithril入門　①静的に実行(JS&LS編)


#0) 方針
最速本:『[Mithril――最速クライアントサイドMVC](http://www.oreilly.co.jp/books/9784873117447/)』を購入し、ななめ読みしながら、Mithrilに入門。
適宜、書籍の[サンプル](https://github.com/oreilly-japan/mithril-book-sample)も参考。サンプルがexpress+ES5+Mithrilなのに対し、Koa+AltJS/ES6+Mithrilで書いていきたい。
ES6がブラウザで広く普及する頃には、AltJSのいくつかがES6対応するだろうと期待しつつ。

当座、node4.2系とnpm2.14系が前提。

#1)ローカルで、静的にお試し実行する環境を準備
ローカルでのお試し環境は、http-serverで良いと考える。
```$ npm install -g http-server```

使い方は、index.html入れたフォルダに移動して、ポート番号を指定してhttp-serverを起動するだけ:

```zsh
cd to/your/folder
http-server -a localhost -p 3000
```


#2)ToDoサンプルを実行してみる

farzher氏作のLS(Livescript)/JS同包の以下を試す:

```zsh
git clone https://github.com/farzher/mithril-livescript-todomvc
cd mithril-livescript-todomvc
tree                                                                                                        
.
├── app.js
├── app.ls
├── index.html
├── mithril.min.js
├── mithril-extended.js
└── README.md

http-server -a localhost -p 3000
```

そのまま動作。あとは、.jsをいじくるもよし、.lsをいじくるもよし。

# 3)次回
Koaを導入。
Mongoのインデックスの改善についてまとめてみた


インデックスは闇雲に貼ればいいという物ではなく、既存のシステムにインデックスを作成するのであれば調査から行うのが定石ということで、まずはボトルネックの調査方法から紹介します。

# 撲滅スロークエリ

## スロークエリ

```shell:MongoShell
# まずはMongoShellにログインします
$ mongo

# DBを選択します
use sample

# db.setProfilingLevel(level, slowms)
# level:1 スロークエリのみ出力
# level:2 すべて
# slowms 以下の例だと20ms以上かかっているクエリを出力する
db.setProfilingLevel(1,20)

# いくつかクエリを実行したあとに実行してみます
#  forEach(printjson) は見やすく整形するメソッド
db.system.profile.find().forEach(printjson)
```

system.profile.find()だと全て出力されるので新しいスロークエリ3件だけ
commandの要素を見るとqueryとあるので、この中がwhereに設定した条件
今回の例だとage: {"$gt": 0}なので、年齢 > 0という条件というのがわかる

```javascript:MongoShell
> db.system.profile.find().sort({ts: -1}).limit(3).forEach(printjson)
{
	"op" : "command",
	"ns" : "user_model_development.$cmd",
	"command" : {
		"count" : "people",
		"query" : {
			"age" : {
				"$gt" : 0
			}
		}
	},
	"keyUpdates" : 0,
	"numYield" : 1,
	"lockStats" : {
		"timeLockedMicros" : {
			"r" : NumberLong(15597646),
			"w" : NumberLong(0)
		},
		"timeAcquiringMicros" : {
			"r" : NumberLong(82294),
			"w" : NumberLong(3)
		}
	},
	"responseLength" : 48,
	"millis" : 8104,
	"execStats" : {

	},
	"ts" : ISODate("2015-11-04T10:29:00.841Z"),
	"client" : "127.0.0.1",
	"allUsers" : [ ],
	"user" : ""
}
```

## クエリを調査

クエリを調査するにはMySQLでもおなじみのexplainを使用して調査します。
先ほどのスロークエリをexplainで解析してみます。

```javascript:MongoShell
> db.people.find({age: {"$gt": 0}}).explain()
{
	"cursor" : "BasicCursor",
	"isMultiKey" : false,
	"n" : 2624196,
	"nscannedObjects" : 2624196,
	"nscanned" : 2624196,
	"nscannedObjectsAllPlans" : 2624196,
	"nscannedAllPlans" : 2624196,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 20509,
	"nChunkSkips" : 0,
	"millis" : 6404,
	"server" : "vagrant-centos64.vagrantup.com:27017",
	"filterSet" : false
}
```

ただRailsでMongoidを使用している人はこのクエリが一体どこから来たものなのかわからない場合があると思うので、
そういう時は直接Modelのfindやwhereに対してexplainをかけることも可能なので、それでも実行計画を見てもいいと思います。

```Ruby:RailsConsole
Person.where(age: {"$gt": 0}).explain
```

チェックする項目はcursorとnとnscannedObjectsとnscannedとmillis

1. cursor
cursorにBasicCursorと書いてあったらインデックスが使われていない
BTreeCursor

2. n
実際にヒットしたドキュメントの件数

3. nscannedObjects
ドキュメント(RDBでいうところのレコード)を検索した件数

4. nscanned
インデックスを使用して検索した件数

5. millis
実行時間 短い方がうれしいね

インデックスを効率的に使用して検索できているか調査するので n / nscanned が1に近い方がいい。
次に nscannedObjects と nscanned に乖離がある場合はwhereに複数条件を指定している場合や、
ソートの指定を行っていて、インデックスでヒットしたドキュメントからBasicCursorを使ってmongoが
ドキュメントをチェックしていっていることがあるので、複合インデックスを貼ることを考えた方が良いかもしれない。
複合インデックスの張り方についてはMySQLと同じ考えなので、以前ボクが書いたMySQLの記事が役に立つと思います。
BTreeIndexのことにも触れているので参考にしてください。
http://qiita.com/kkyouhei/items/e3502ef632c48d94541d

# インデックス

mongoで一般的に使用されるインデックスはMySQLでもお馴染みB-TreeIndexです。
インデックスを貼る作業はマシンにとってとてもコストのかかる処理なので、運用中のシステムに実行する場合は
バックグラウンドで実行するオプションをつけたり、アクセスが少ない時間帯にやるなどしたほうが懸命です。
バックグラウンドで実行と言っても更新などのロックがかからないというだけで、マシンにかかる負担は変わらないので、やっぱり気をつけましょう。

## インデックス参照

```javascript:MongoShell
db.people.getIndexes()
```

## インデックス作成

```javascript:MongoShell
db.people.ensureIndex({"field_name": 1})

# バックグラウンドで実行
db.people.ensureIndex({"field_name": 1}, { background: true})
```

## インデックス削除
```javascript:MongoShell
db.people.dropIndex({"field_name": 1})

# 全部消す
db.people.dropIndexes()
```
visio代替Diaの勧め

* [公式HP](https://wiki.gnome.org/Apps/Dia)
* 自分は OpenOffice DrawやyEdよりかはvisioに近い操作に感じた。
* 図形が充実している。
    * CCNAの本で見たことある図形だ

![dia.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d7b6e5a6-becd-1fb4-5b8e-f6dc07df5c35.png)

## 対応していない操作

* 図形の回転 : dia_rotate.py


## おすすめ設定

* 表示 > アンチエイリアス
* 表示 > グリッドに合わせる
* 入力メソッド > Xの入力メソッド (これをしないと日本語入力ができなかった)
    * [windowsの場合](http://blogs.yahoo.co.jp/touchan_since1971/50939017.html)
* ファイル > 設定 > インタフェース > 戻すの回数 > 150
* ファイル > 設定 > 表示 > アンチエイリアス効果を付与する
* ファイル > 設定 > グリッド線 > グリッドに合わせる


## キーボードショートカット(一部)

* `shift alt c` : 中央に揃える
* `ctrl g` : グループ化
* `shift ctrl g` : グループ化解除
* `ctrl e` : フィットさせる
* `shift ctrl b` : 再背面に移動
* `shift ctrl f` : 再前面に移動
* `alt enter` : プロパティ
    * 四隅の丸み付けができる
* `F2` : 文字の編集
* `l` : 線を引く
dotNet > WebClient() > Encoding指定 > new時の指定 / プロパティ指定

WebClient()を使う時にEncodingを指定する方法

## new時に指定

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
3.2 Webアクセスのためのクラス

> 文字コードを明示的に指定する例

```csharp
// たとえば、MSDN は UTF-8
var url = "http://msdn.microsoft.com/ja-JP/";

var c = new WebClient { Encoding = Encoding.UTF8 };
var x = c.DownloadString(url);
```

## プロパティを指定

https://msdn.microsoft.com/ja-jp/library/system.net.webclient.encoding(v=vs.110).aspx

```csharp
public static void UploadString (string address)
{
    string data = "Time = 12:00am temperature = 50";
    WebClient client = new WebClient ();
    // Optionally specify an encoding for uploading and downloading strings.
    client.Encoding = System.Text.Encoding.UTF8;
    // Upload the data.
    string reply = client.UploadString (address, data);
    // Disply the server's response.
    Console.WriteLine (reply);
}
```
RailsからJavaScriptへデータを渡す方法

#1.RailsからJavaScriptへデータを渡す。
サーバサイドで生成したデータを、フロントエンドで使いたいといったことは、良くあると思います。
Rails⇒Javascript,jQueryの環境であればGon gemがおすすめです。

#2.Gon gemのインストール
Gemfileに以下の行を追加して、$ bundle installを実行。
```
gem 'gon'
```
#3.利用方法
application.html.erbのヘッダに以下の一行を埋め込みます。
```rb:views/layouts/application.html.erb
    <%= include_gon %> #add
    <%= javascript_include_tag "application" %>
    <%= stylesheet_link_tag    "application" %>
```

controller側で、JavaScriptに渡したいデータをgonオブジェクトに格納する。
```rb:your_controller.rb
def hoge
  gon.hoge_list = your_list
  gon.hoge_name = your_name
end
```

#4.実行結果
ブラウザで開くと以下のようにgonオブジェクトに格納したデータがソースに埋め込まれます。
```
//<![CDATA[
window.gon={};gon.hoge_list=[[hoge1,hoge2],[hoge3,hoge4]];gon.hoge_name="hoge";
//]]>
```
JavaScript側では以下のように記載すれば、gonに格納したデータを利用できます。
```js:your_js.js
var = gon.hoge_list;
var = gon.hoge_name;
```

以下を参考にさせていただきました。
http://qiita.com/mosa_siru/items/e69eee47a183b13cfb62
技術英語 > the [status quo] of irrigation in the upper basin / as it is / Stay still.

@ LOE > May 4, 2012

http://loe.org/shows/shows.html?programID=12-P13-00018
> the status quo of irrigation in the upper basin

http://eow.alc.co.jp/search?q=status+quo&ref=sa
> 〈ラテン語〉現状（維持）、そのままの状態、体制◆通例 the ～

http://ejje.weblio.jp/content/status+quo
> そのままの状態，現状.

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

http://ejje.weblio.jp/content/as+it+is
> (2) [文中・文尾に用いて] 現状で(も), 今のままでも(すでに).

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

stay still
http://ejje.weblio.jp/content/sit+still
> keep [stand, sit] still
じっとしている

Voyagerのドクターが患者に対してよく使う。「じっとしてなさい」という時。
How to measure a light level of Network devices/ネットワークデバイス毎の光レベルの測定方法

How to measure a light level of network devices
====

# Overview
ファイバーを接続する時、した時にいつでも聞かれる「光の受光レベル」。
従ってお馴染みのコマンドになるわけなのだが、Junier/Ciscoの違いだけで無く
機器（OS,ファーム）によってもコマンドが異なるので忘れることがしばしば。
従って、ここにメモを残しておく

# Juniper

# Cisco

## ASR等
* コマンド

<pre>
 # show controllers (IF) (port) all | i Power
</pre>
* 見方
<pre>
Thu Nov  5 XX:XX:XX.XXX PDT
           Transmit Power:  2.23870 mW (3.49996 dBm)   1.12200 mW (0.49993 dBm)   0.15140 mW (-8.19874 dBm)   0.06030 mW (-12.19683 dBm)
            Receive Power:  2.23870 mW (3.49996 dBm)   1.12200 mW (0.49993 dBm)   0.03630 mW (-14.40093 dBm)   0.01450 mW (-18.38632 dBm)
        Tx Power:  0.63250 mW (-1.98939 dBm)
        Rx Power:  0.33060 mW (-4.80697 dBm)
        Temp/Alarm/Power Flags: COM, commercial 0C to 70C
</pre>


* コマンドその2
<pre>
 # show hw-module subslot <IF>/<IF> transceiver <Number> status
</pre>


## Catalyst等
* コマンド
<pre>
 # show (IF) (port) transceiver
</pre>
* 見方
<pre>

                                 Optical   Optical
           Temperature  Voltage  Tx Power  Rx Power
Port       (Celsius)    (Volts)  (dBm)     (dBm)
---------  -----------  -------  --------  --------
Te1/0/1      27.4       3.28      -2.0      -1.9
</pre>
はっきり言って見やすい

# Arista
etckeeper + remote-git on CentOS

# Overview
　/etc/に限った話では無いが、設定ファイルの構成管理をしたいので幾つか候補を考えている。
chefやAnsibleも良いが、これらはパッケージを含めた構成管理など大掛かりになってしまうので
とりあえずはお手軽な感じでできるetckeeperを使ってみることにした

## Actually
　単に引き継いだシステムに組み込まれていたものの殆ど活用されておらず
また動作仕様が残されていなかったので調査結果としての備忘録を残すのが目的。
ただし、日々変更が掛かりやすいconfigファイルをpuppet-clientやらchefやらで
大掛かりに管理して吸い上げるのも馬鹿馬鹿しいので設定ファイル等は
それ以下は、etckeeper等に任せる方が気楽かもしれない。
例えばchefを使おうにもどうせ設定ファイルはGitなりに放り込んで管理しておくのだから。

基本はマスターを編集してchef/Ansibleで適用なんだけれど
現実には直接ホストに入って編集してしまうことがままあるので
その辺りのcommit漏れを防ぐというバックアップ要素の方が強いかもしれない。

# etckeeper とは
　以下のサイトにある文字通り /etc/ の変更管理をする為のアプリケーション

　http://etckeeper.branchable.com/

　但しあくまで/etcの変更管理を目的として作られたと言うだけで
別に他の場所に適用できないというわけでは無い

## リモートgit での管理
 [ここ](http://blog.keshi.org/hogememo/2012/05/27/aggregate-multiple-host-config-using-etckeeper)にも書いてあるが、etckeeperは設定ファイルをVCSで管理すると言っても
リモートのリポジトリにcommitする、というような動作を前提としていない。

従って、リモートのVCSで管理するためにはpush処理をフックしてたたき込んでやる必要がある。
[このへん](https://github.com/thomasvandoren/puppet-etckeeper/issues/14)を見ていると、どうやら誰もがそういった要望を持っていたらしくオプションが追加された。
フックしやすくなったと言うだけで別に設定ファイルにremote vcsみたいな物を入れるわけでは無いようだ。
あくまでremote pushをONにするためのフラグが組み込まれた、という程度。

　因みにetckeeperの項ではGitと書かず、VCSと書いていたのはGit以外もサポートしているから。
従って、ここではGitを前提として作り込むので、以後はGitのみの設定を記載。
とはいえ、etckeeeperにはフック機能が付いた程度なので、
必要な知識はむしろGitだったりする。etckeeper自体の設定はetckeeper本家でも見ろということで。

# 実装

## etckeeper/gitのインストール
いずれもepel等を使えばyum installでインストール可能なので省略

## etckeeperの仕込み - etckeeper.conf の設定
　/etc/etckeeper/etckeeper.conf が設定ファイル。
下記のような項目があるのでGitのremote-nameを入れてやる。
 - 以下の場合はremote-nameがremoteの場合
<pre>
# To push each commit to a remote, put the name of the remote here.
# (eg, "origin" for git).
PUSH_REMOTE="remote"
</pre>
 
## etckeeper の初期化
下記のようにコマンドを実行すると /etc/.git が作られ、管理されるようになる
<pre>
 # etckeeper init
</pre>
また、 /etc/cron.daily/etckeeper が作成され、autocommitをOFFにしていなければ
1日1回、必要に応じてバックアップが自動的に取られるようになる。

## リモートGitの仕込み
…が、やはりremote-gitの設定は作ってくれないようだ。
従ってここからがリモートgitを使う際の肝。
　
以下のように実行してやるとリモートgitエントリが追加されるので
PUSH_REMOTEで指定したremote-nameにPUSHができるようになる。
<pre>
 # cd /etc
 # git remote add [remote-name] [remote-git URL]
</pre>
 - 作成結果
<pre>
 # cd /etc/
 # vi /etc/.git/config
 [core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "backup"]
        url = git://remote-host/remote-host
        fetch = +refs/heads/*:refs/remotes/backup/*
</pre>

# 関連リンク
 - http://etckeeper.branchable.com/
 - http://anights.blogspot.com/2014/04/etckeeper.html
 - https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%81%A7%E3%81%AE%E4%BD%9C%E6%A5%AD
 - http://jonarcher.info/2015/06/etckeeper-config-version-control/
 - http://blog.glidenote.com/blog/2012/04/23/etckeeper-bitbucket/
 - https://www.digitalocean.com/community/tutorials/how-to-manage-etc-with-version-control-using-etckeeper-on-centos-7
Faraday で s3 の公開領域にバイナリを PUT する

よくよく考えたら当然のことだが、multipart では PUT できない。

```rb
Faraday.new(url: s3_url).put do |req|
  req.header['Content-Type'] = 'application/octet-stream'
  req.body = File.binread('/path/to/file')
end
```

`Content-Type` は PUT するバイナリの Content Type に合わせる。

セキュアな bucket に PUT したい場合、`Authorization` ヘッダがさらに必要になる。
section要素に関するガイドラインっぽい覚え書き


HTML5のセクショニング・コンテンツの中で、section要素の解釈と使い方が実務上でももっとも難儀な気がしたので、おさらいがてら調べたことを記しておく。
article要素との使い分けについてはほぼ触れていないので、各自ゴニョゴニョしていただけると。

## 覚書

- 内部に見出し(h1〜h6要素)を含むものに対し適用する  
見出し(h1〜h6要素)を持たないケースへの使用はあまり好ましくない
- 文書構造的に正しい配置であればスタイリングやJSのフックとして用いても良いことにする  
ex.  

```html
<section id="hoge" class="piyo" style="margin-bottom: 10px;">...</section>
```
- ただし、レイアウト目的やフックのみで使用しない。その場合はdiv要素で行う
- body要素などのセクショニング・ルート(それ自体が独自のアウトラインを持つ要素)に用いる必要はないことを理解しておく
- アウトラインの確認には『[HTML 5 Outliner(アウトライナー)](https://gsnedders.html5.org/outliner/)』を推奨  

### 用語解説
- __セクショニング・コンテンツ__… HTML5におけるコンテンツモデルの1カテゴリー。以下の4つの要素が属する　
  - article
  - aside
  - nav
  - section  
　　
- __セクショニング・ルート__… 独立したアウトラインを持つことができる要素。文書全体のアウトラインに影響を与えない。以下の6つが属する
  - blockquote
  - body
  - details
  - fieldset
  - figure
  - td  
　　　
- __アウトライン__… 全体の構造を示す概念。階層(入れ子)構造
- __セクション__… 文書の区分、区切り。明示的なセクションと暗黙的なセクションが存在する

### 補足
section要素を含めたセクショニング・コンテンツは明示的なアウトラインを生成するため、暗黙的なアウトラインを生成するヘッディング・コンテンツ(h1〜h6要素)よりも優先される。

## 参考サイト
- [アウトラインで迷わない！ sectionと見出しについて](http://webcre8.jp/think/html5-section-outline.html)
- [「section要素」の使い方の基本をまとめよう](http://www.mdn.co.jp/di/articles/2605/?page=5)
- [section, article を使う前に知っておきたいこと](http://wp-e.org/2014/04/06/1734/)
- [HTML5のアウトラインを極めるための6つのルール](http://be-shi.tumblr.com/post/121266132377/html5%E3%81%AE%E3%82%A2%E3%82%A6%E3%83%88%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%92%E6%A5%B5%E3%82%81%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE6%E3%81%A4%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%AB)
- [HTMLのセクションとアウトラインを理解する](http://dekiru.net/article/12895/)
Unityを使う時にする初期設定

## uGUIを使う時の初期設定（Canvas Scalerの設定）
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/e75012fe-0cc3-489a-c4d3-a37ef2467613.png)
Ui Scale Mode：Scale With Screen Size
Reference Resolution：画面サイズを指定します。
Screen Match Mode：Expend
に変更します。  
※解像度早見表
http://qiita.com/tomohisaota/items/f8857d01f328e34fb551
  
## フォルダ名
- Scenes
- Prefabs
- Scripts
- Sprites
- Animations
- Materials
- Physics Materials
- Fonts
- Audio
- Resources(Unityの予約語)
- Editor(Unityの予約語)
- Plugins(Unityの予約語)
FirefoxOSアプリでTCP Socket通信をするための準備(ただしPrivilegedアプリのみ)

FirefoxOSで一番かわいい（しかも世界で唯一ISO-2022対応の）IRCクライアント「[FoxkehChat IRC](https://marketplace.firefox.com/app/foxkeh-chat/)」というのを作っているのだが、まあIRCという古の古物はTCPしゃべれないと何も出来ないんですよ。よって以下の様な準備をする。

`manifest.webapp`ファイルに`"permissions"->"tcp-socket"`と書くだけ。`description`は、適当でOK、ただしマーケットプレイス審査時に見られるので、妥当な内容のほうが良い。

なお、TCP通信が行えるのは`"type": "privileged"`なアプリケーションだけなので、ウェブアプリ型の場合は、milkcocoaやnode.jsなどのバックエンドを使って頑張る必要がある。

````js:manifest.webapp
"type": "privileged",
"permissions": {
	"tcp-socket": {
		"description": "connect to IRC servers."
	}
},
````
また、[MDN: TCP Socket API](https://developer.mozilla.org/en-US/docs/Web/API/TCP_Socket_API)も参照されたい。ちなみに使われるのは、かなり嫌っぽそうな雰囲気。レッツ・トライ。
WordPressを利用してslackからメールを送信する

なんかイチからPHP書くのもしんどいし、ちょうどいいラッパーがないかと探したらWordPressが居たので、これを利用してSlackからメールを送信する。

肝は、WordPressの安全なPOSTゲット、および`wp_mail()`関数など。メールヘッダー部分などは、コピペです（コピペ元が探せなかったのですが、ありがとうございます）

````php:tpl_mailfromslack.php
<?php
/*
Template Name: mail from slack
これは、WordPressテーマ上で動作させることを前提としていて、
専用に１こ固定ページをつくり、このテンプレートを読み込ませ、
その固定ページのURIでslack apiと連携させ動作させる
あと、tokenは slack api outbound webhooksで設定したのをいれる
送信先アドレスで、headersにいれてあるfromのアドレスを許可するように
↑Google groupsなど
*/
if( isset($_POST['token']) && $_POST['token'] == '####_API_TOKEN_####' ) {
    // mailfromslackならばこっち
    
    $text = $_POST['text'];
    $text_arr = preg_split('/[\s]+/', $text, 4);
    $sendUser = htmlspecialchars($_POST['user_name']);
    $fromCh = htmlspecialchars($_POST['channel_name']);
    
    $addTo = '送信先メールアドレス';
    
    $setSubject = '[slack #'.$fromCh.'] '.$text_arr[1];
    
    $setText = $sendUser.'が slack #'.$fromCh." から送信 \n\n".$text_arr[2]."\n\n"."-- \n".'slackより自動送信';
    
    $headers[] = 'From: '.$sendUser.' <tpl_mailfromslack.php@example.com>';
    $headers[] = 'Cc: あればなんかメールアドレス';
    
    $return = wp_mail( $addTo, $setSubject, $setText, $headers );
    
    if($return){
        echo json_encode(array('text' => '送信実行！ちゃんと送れてるか確認してね'));
    } else {
        echo json_encode(array('text' => '送信失敗！'."\n".'この失敗は wp_mail() 関数による判断です。'));
    }
} else {
    // mailfromslackじゃなければ404
    wp_safe_redirect( home_url() );
    exit;
} 
````

1. これを有効化されたWordPressテーマディレクトリに`tpl_mailfromslack.php`として保存（ファイル名はなんでもいい）
2. 固定ページを作成、適当にわかりづらいslug名をつけて、「テンプレート」を「mail from slack」にする
3. 公開する
4. slackのintegrateから「OutBound WebHooks」で、このテンプレートが指定された固定ページのURLを指定
5. 再度ファイル編集する、`####_API_TOKEN_####` の部分に、slackから指定されたAPIキーを入れる
6. APIキーが書かれたtpl_mailfromslack.phpに更新する
5. あとは適当に実験するべし

順序は前後してもいいんだけど、要はAPIキーを入れてねってこと。

`wp_mail()`からの戻り値を`json_encode`してるのは、slackに結果を返すため。
slackからOutbound webhooksによるPOST時に、指定URLを叩き、その結果を取得します。そのとき決められたjsonを出力できると、その内容をslackのチャネルにエコーしてくれます。

`wp_safe_redirect( home_url() );`は、POSTじゃなく普通にその固定ページを開いた時や、tokenが無い・間違ってる時に、安全にトップページへリダイレクトしてくれます。

WordPressは簡単なフレームワークとしての利用価値も、結構ありますよ（強引すぎるが）
AWS　一括請求設定でハマった時の覚書

AWSのアカウントが増えてきており、一括請求設定（Consolidated Billing）をしていた時のハマった時の覚書

**2018/4/11追記**
以前は請求ダッシュボードから一括請求設定が可能でしたが、
現在は「AWS Organizations」に統合されたようです。
親アカウントから一括請求に紐付けたいアカウントを追加し、子アカウントから承認する流れは同一でした

#一括請求設定は、子アカウントに承認してもらうべし
根本的な勘違いとして、子からのリクエストを親が承認するという、いたって普通な日本人感覚のワークフローで複数アカウント間を操作していたのが過ち

#親アカウントから、子アカウントへリクエストを送る
精算を親にぶらさげたければ、親からリクエストを送り、子アカウントに承認してもらいましょう。（反省）
[だいたい解決] Cygwin(babun)で、ansible&node&javaの開発環境構築

#0)Windowsのlinux風シェル環境は、babunで概ねなんとかなりそう。

自分的にはだいたい解決したので、簡単な付記の後、うまくいった結果と留意点を記す。

*(付記) 経緯:windows環境でansibleする際に、便利な配布物cygwin-ansibleを使わせていただいたことをきっかけに、cygwin周りをいろいろとカスタマイズしようと考え([方針はこちら](http://qiita.com/kmry2045/items/8e74287f14f7091b3134))、[試行錯誤](http://qiita.com/kmry2045/items/d2719f4cebdf6ac0c6d1)し、半日かけて、oh-my-zshやjavaは割合普通に動かせるようになった。...というあたり、一部の人には知られている、気合入ったカスタマイズ版cygwinである、babun（a windows shell you will love）の存在を知る。 名前がなんかひっかかるのはさておき、、[ Babunの本家サイト](http://babun.github.io/)を見るに、パッケージ管理ツールはじめいろいろ工夫されているし、インストーラーは、windows側の環境を汚さない模様。ということで、ちょっと使ってみた・・・*

#1) ansible導入
インストール後、コマンドラインでbabunとタイプし、とりあえず、python2.7系の存在を確認。
ということで、ansibleを入れる。
[この投稿](https://plus.google.com/+ScottMiller171/posts/jBDmCGWNh5p)を参考にさせていただきつつ:

```
babun update
pact install python-paramiko python-crypto gcc-g++ wget openssh python-setuptools
wget https://bootstrap.pypa.io/ez_setup.py -O - | python
easy_install pip
pip install ansible
```

babunを再起動すると、

```zsh
» ansible --version
ansible 1.9.4
```
と、無事立ち上がる。

#2) node&npmを使ってみる。

windowsにインストール済のnode&npmにアクセス(バージョンコントロールは必要になった際に考えることとする)。

```
$ node -v                                                                                                                                                                     v4.2.1
$ npm -v
2.14.7
```

cygwinでnodeするのは、改行コードの関係でdos2unixを入れたりなど下調べの段階ではいろいろと面倒そうな気がしていた。が、babunの
[本年の作業記録](http://xjlin0.github.io/tech/2015/04/14/babun-the-new-cygwin-for-ruby-rails-sinatra-and-nodejs/)によるとあっけなく動きそうに思えたので、いくつかnpmでパッケージを入れてみる。

> npm install -g livescript mithril coffee-script webpack

ひとまずは問題なく、/cygdrive/c/Users/kmr_r/AppData/Roaming/npm/以下に各コマンドが入った。

- 一点問題発生 : coffeeコマンドでbabun上でREPLできるが、lscコマンドでlivescriptのREPLは実行できない(lsc -cでのlsファイルのコンパイルはできる。windowsのコマンドプロンプトからはlscも実行可能)。

...何かはまりどころがあるのかもしれないが、とりあえずnodeできている。念のため、、実行したlivescriptを付記。

```test.ls
times = (x, y) ->
  x * y

console.log times(2,3)
```

lscでJSにコンパイルし、nodeでJSを実行。

```zsh
$ lsc -c test.ls
$ node test.js
6
```

#2)git&java(&sbt)使ってみる。
依存関係毎gitを入れ、git clone:
さらにそのまま、scalaのwebフレームワークfinatraをsbtで実行してみる。
```
pact install gettext-devel
git clone https://github.com/twitter/finatra
./sbt helloWorld/run
```

javacでこけたが、cygwinにおける"\"と"/"の扱いに難あることは経験済のため、[出典](http://promamo.com/?p=4118)の指示に従い、java_wrapper経由で、windows上のJavaがこのあたりをcygwin上で適切に扱えるようにする(よくわからない人は、[試行錯誤編](http://qiita.com/kmry2045/items/d2719f4cebdf6ac0c6d1)を参照)。

結果、無事、localhostでJVM上のwebフレームワークfinatraが立ち上がる（JVMの実行環境はwindows側のもの）。

#3)今後の方針
とりあえず、cygwin(babun)で一通りの開発作業はできるようになったが、過度の期待はせずに、ansible経由でdockerなどの上の開発環境管理も行えるようにしていく。