OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelで既存のDBからmigrationsファイルを作成する「migrations-generator」


## 追記：2020/06/09
本記事で説明で利用しているリポジトリの[migrations-generator(Xethron)](https://github.com/Xethron/migrations-generator)はLarvel5.4までの対応でした。
それ以降のバージョンは[migrations-generator（oscarafdev）](https://github.com/oscarafdev/migrations-generator)のリポジトリで対応しているようです。（Xethron側の色々なissueで書いてあった)
oscarafdevの方リポジトリでXethronの方がコミットしているので正式に引き継いだのではなかろうか。
自分は試して無いので、どなたか試してコメント頂くか、別な記事にして頂けるとありがたいです。
追記:2020/06/09ここまで

## 経緯
* 運用中のサービスをDBはそのままでAPI用のPHPフレームワークをLaravelに差し替える事になった。
* テーブルの数が100を超えていてとても手書きでmigrationを書く気が無い
* 色々なmigrationsに関する記事を確認しても新規サービスを想定している
* 困った。(^_^;)

## Laravel用パッケージ「migrations-generator」
* [migrations-generator](https://github.com/Xethron/migrations-generator)
* Laravel5、Laravel4に対応。(4の方は自分は未確認)
* 既存のテーブルのマイグレーションファイルを作成してくれる。
* 使い方簡単

## 環境とか
確認した自分の環境
* Mac OSX Yosemite
* vagrant CentOS 7.2
* DB pgsql 9.3
* Laravel 5.2


## 使い方
githubのreadmeの通り。一応ここでも手順を書く。
### インストール
```
composer require --dev --no-update "xethron/migrations-generator:dev-l5"
composer require --dev --no-update "way/generators:dev-feature/laravel-five-stable"
composer config repositories.repo-name git "git@github.com:jamisonvalenta/Laravel-4-Generators.git"
composer update
```

```composer update```の実行時に何やらTokenを入力しろ的な感じになった。
```ctl+c```で処理を停止。

### githubの認証登録
調べてみるとgithubの認証が無い模様。
[composerでGitHub apiのアクセス制限対処法](http://qiita.com/ma_me/items/7d1823c27d6ef45cdf9f)を参考に以下を実行

```
curl -u '[user name]' -d '{"scopes":["repo"],"note":"Help example"}' https://api.github.com/authorizations
```

```[user name]```は自分のgithubのユーザ名を入れる。続けてパスワードを入力する。
認証に成功すると```token```を含むjsonが返ってくる

コンポーザーにgithubのトークンを登録する為に以下を実行

```
composer config -g github-oauth.github.com [get token]
```

```[get token]```はjsonの中身の```token```を入れる。

### 改めてインストール
```
composer update
```
を実行。今度はインストールされる。

### Laravelの設定
app.phpのproviders配列に以下を追加

``` config/app.php
Way\Generators\GeneratorsServiceProvider::class,
Xethron\MigrationsGenerator\MigrationsGeneratorServiceProvider::class,
```


### マイグレーションファイルの作成
用意が出来たのでマイグレーションファイルの作成をする。ここではDBの接続の設定が完了しているものとします。

#### 単純に全てのテーブルのマイグレーションファイルを作成
```
php artisan migrate:generate
```

#### 無視するテーブルを指定してマイグレーションファイルを作成
自分は```users```と```password_resets```テーブルをマイグレーションから作成してしまった。この2つを無視する場合は以下を```ignore```オプションを付けて実行

```
php artisan migrate:generate --ignore="users,password_resets"
 Do you want to log these migrations in the migrations table? [Y/n] :
 > Y

 Next Batch Number is: 2. We recommend using Batch Number 0 so that it becomes the "first" migration [Default: 0] :
 > 0
```

処理を待つとマイグレーションファイルの出来上がりです。

#### 補足

「connection」オプションもある模様。自分は試して無いです。


以上です。なにか間違いや意見などあればコメントか編集リクエストお願いします。
Ubuntu 16.04 LTS(xenial)にzabbix3.0をソースからインストール


ubuntu 16.04 LTS(xenial)のzabbix3.0公式パッケージが来ていない(2016/06/01時点)のでソースから導入してみます。

# **前提条件**

ソースをコンパイルしますので、gccとmakeを準備しておきます。

`sudo apt-get install gcc make`

zabbixの公式サイトからソースを取得して置きます。
http://www.zabbix.com/jp/download.php

# **コンパイル**

ソースのファイルを展開してコンパイルしてインストールします。
今回は、zabbix-agentのみ作成します。

````
tar zxf zabbix-3.0.3.tar.gz
cd zabbix-3.0.3
./configure --prefix=/usr/local --enable-agent
sudo make install
````

# **環境設定**

zabbix用アカウントを作成してログのディレクトリも用意します。

````
sudo groupadd zabbix
sudo useradd -g zabbix -s /bin/false -M zabbix
sudo mkdir /var/log/zabbix
sudo chown zabbix:zabbix /var/log/zabbix
````

zabbix-agentの起動設定ファイルをソースのサンプルからコピーします。

````
sudo cp misc/init.d/ubuntu/zabbix-agent.conf /etc/init
sudo cp misc/init.d/debian/zabbix-agent /etc/init.d
````

systemdの起動に合わせたinfo情報を追記します。

````lang:/etc/init.d/zabbix-agent
#!/bin/sh

### BEGIN INIT INFO
# Provides:          zabbix-agent
# Required-Start:    $remote_fs $netw
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start zabbix-agent
### END INIT INFO
````

zabbix-agent設定ファイルは以下を編集します。

````lang:/usr/local/etc/zabbix_agentd.conf
LogFile=/var/log/zabbix/zabbix_agentd.log
Server=[zabbix serverのIPアドレス]
Hostname=[zabbix agentのホスト名]
````

# **起動方法**

以下の起動コマンドでzabbix-agentが起動します。

`sudo /etc/init.d/zabbix-agent start`

# **自動起動**

システムの再起動時にzabbix-agentを自動起動させる。

````
sudo apt-get install sysv-rc-conf
sudo sysv-rc-conf zabbix-agent on
````
CloudFomationを使ったlambdaのDeployをやってみた

AWS Summit2016のday2のdevcon2発目のTim Wagner氏のセッションにて、CloudFormationによるLambdaのデプロイのデモが行われました。

その際にCloudFormationのTemplateJSONにlambdaで動かしたいコードがハードコーディングされており、twitter上でマジ？となっていた人がいた気がするので、そうじゃない版の方法を共有したいと思います。

S3にzip形式で圧縮したソースコード(今回はpython)をアップロードしておいて、そいつをTemplateで指定してdeployします。

## 1. S3へのコードのアップロード
まず、zip形式に圧縮したpythonコードを適当にS3にアップロードします。
今回はAWSのhelloworldのサンプルを使います

```python:code
from __future__ import print_function

import json

print('Loading function')


def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    print("value1 = " + event['key1'])
    print("value2 = " + event['key2'])
    print("value3 = " + event['key3'])
    return event['key1']  # Echo back the first key value
    #raise Exception('Something went wrong')

```

## 2. Templateの作成
JSONで下記のようにテンプレートを作成します。
注目していただきたいのはCodeの値です。
S3のbucket名とkey名を指定してdeployするコードを指定することができます。
これでJSONにコードを直書きする生活とおさらばできます！

Roleのところは適当にlambda関数を実行する際に使いたいロールを設定してください。

python以外の言語が良ければRuntimeをそれに合わせて変えてください。
なお、RuntimeはEnumなので、決まった値じゃないとcloudformation実行時に失敗します。

これを使ってCloudFormationでStackを作成してください。

```json:template
{
  "AWSTemplateFormatVersion" : "2010-09-09",

  "Description" : "sample of cloudformation template for deploying a lambda function form S3.",


  "Resources" : {
    "HelloSample": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Handler": "コードのファイル名.ハンドラ名",
        "Role": { "Fn::GetAtt" : ["LambdaExecutionRole", "Arn"] },
        "Code": {
          "S3Bucket": "コードが置いてあるS3のバケット名",
          "S3Key": "zip形式に圧縮してアップロードしたコードのファイル名"
        },
        "Runtime": "python2.7",
        "Timeout": "25"
      }
    },
    "LambdaExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [{ "Effect": "Allow", "Principal": {"Service": ["lambda.amazonaws.com"]}, "Action": ["sts:AssumeRole"] }]
        }
      }
    }
  }
}

```

以上です
Javascriptメモ

難しいと噂のJavaScript勉強途中で詰まったところなどの備忘録

#１．じ・ゃ・ば・す・く・り・ぷ・と
JavaScriptは「ジャバスクリプト」であって「ジャバスプリクト」（なぜかh… ではない。戒め


#２．グローバル変数
JavaScriptでグローバル変数を宣言する方法は二つある。
①関数本体の外で、変数宣言を行う。
②プログラムのいずれかの箇所で、varキーワードをつけずに変数宣言を行う。
[参考にしたサイト](http://builder.japan.zdnet.com/script/sp_javascript-kickstart-2007/20373861/2/)

スコープ云々はおいといて、これ自体覚えれば問題ない話な気がするが、
変数に値代入したつもりが①だった時泣きたくなったのでメモ_φ(｡_｡*)

```js:jstest.js
var javascript;
javasprict = "ジャバスクリプト";
console.log(javascript);  //--> undefined !?
```
javascriptの闇は深い。。。
#３、即時関数
「即時関数は関数を定義すると同時に実行するための構文」
関数を気軽に実行できるので重宝、いろんな書き方があるみたい。

```js:jstest.js
(function(){console.log("do")})();
!function(){console.log("do")}();
+function(){console.log("do")}();
-function(){console.log("do")}();
~function(){console.log("do")}();
```




随時更新したし
Error inflating class android.support.design.widget.CollapsingToolbarLayout


CollapsingToolbarLayoutを含むViewに遷移するとタイトルのようなエラーが出るようになった。

support libraryの値を整えてuninstall => 再インストールしたら動いた


原因不明すぎて2日も費やしてしまった。

```before
compile 'com.android.support:appcompat-v7:23.+'
compile 'com.android.support:design:23.+'
```

```after
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
```
【R】ファイルをまとめて楽に読み込むテクニック

### クリップボードからデータを読み込む方法
ファイル名に「clipboard」とうつだけで、読み込める！

```r
read.table(`clipboard`)      # for Windows
read.table(pipe(`pbpaste`))  # for Mac
```
### ファイルの連番を読み込む方法
一般的には、dir()関数を使う方法でしょう。
指定ディレクトリ内のファイル名をcharacterとして取ってきてくれます。
ファイルが連番で保存されている場合は、次のような工夫もできます。
連番をfor文の変数iで表現します。
sprintf関数でフォーマット付きの文字列編集し、iをファイル名に組み込みます。
結果として、「input_数字.txt」という形式のファイル名を一括して読み込むことができます。

```r
for(i in 1:10){
    path <- sprintf(`input_%02d.txt`, i)  # input_01.txt, input_02.txt ...
    read.table(file=path)
    }
```
SAKURAのVPS CentOS6.6 で yum update が失敗する

「Linux初心者がSakuraのVPSに、**nginx**サーバーやら**Percona-Server**やら**php-fpm**やら**iptables**やら**wordpress**やらを入れまくった結果、"yum update"が```
”http://ftp.riken.jp/Linux/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404 Not Found"
```になって、何も追加で入れられなくなってしまったときにやったこと」を記録しておきます。

結論からいうと、"/etc/yum.repos.d/epel.repo"の内容を編集するだけです。

```
[epel]
name=EPEL RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/
enable=0
```
こうなっているのを

```
[epel]
name=EPEL RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/centos/6/centosplus/x86_64/
enable=0
```

こう変更します。

これだけだとドラマにならないので、この変更情報をどうやって取得したかを説明します。

あるURLが見つからないという時、私の場合まず見つからないURLを直接探してみて（これは見つからない）、だんだんとURLを短くして、どこまでなら見つかるかを探します。

```
http://ftp.riken.jp/Linux/repodata/repomd.xml　 ←　見つからない
http://ftp.riken.jp/Linux/repodata/　　　　　　　←　見つからない
http://ftp.riken.jp/Linux/　　　　　　　　　　　　←　見つかった！！
```
この時に見えるのは、こんな感じ。

![image](https://qiita-image-store.s3.amazonaws.com/0/50675/e2639e01-7df2-8c16-3f91-ec6e72ec042f.png)

この中から、今回の問題に関係ありそうなリンクを「力技で」探します。

今回は「エラー: Cannot retrieve repository metadata(repomd.xml) for repository: epel.」というメッセージから、"repomd.xml"が見つからないんだな、ということは分かるのですが、それだけではリンクを探しきれません。そこで着目したのは、もともとのURLではLinuxの直下に"repodata"フォルダが有ったらしいことです。つまり「Linux直下で管理していたが、必要に応じて分類を追加した」ということが推測されます。そこでまずはこのリストから"epel"を探しますが、見つかりません。ここで挫けそうになりますが、ぐっと堪えて、何となく眺めていくと"centos"ディレクトリが見つかりました。開いてみるとその下にはバージョンが並んでいます
。![image](https://qiita-image-store.s3.amazonaws.com/0/50675/dd4d23fb-cbc7-7633-8a33-37813b961114.png)

これは何となく期待できそうです。

そのあと、ピンポイントのバージョン"6.6"を開いて「このバージョンはもう古いです。今は"6"を参照してください。」などと書かれたreadmeファイルに翻弄されながら、深く潜っていくと、"/Linux/centos/6/centosplus/x86_64/repodata”に目指すファイル"repomd.xml"が見つかりました。

これが正しいかどうか、保障などありませんが、ここまでの道のりで何となく手応えを感じつつ、”Linux"を接合点にして"epel.repo"を編集し、その後”yum clean all","yum update"で問題なくレポジトリを更新でき、目的の”MongoDB"をインストールすることができました。

以上です。ご参考になれば幸いです。

p.s.　あ、リンクの中の"x86_64"のところは"i386"の選択肢もありましたが"arch"コマンドで"x86_64"を確認しました。
CentOS6.8 nginx + php-fpm + MySQLでWordPress

#概要
nginxでWordPressサーバーを構築済み（当時CentOS6.7)
kernel等セキュリティアップデートでyum updateしたら、remiからインストールしたMySQLのphpライブラリがバッティング、よく調べずにメッセージのままコマンドを叩き続けたらPHP、MySQLどころかいろいろ削除されてお亡くなりになったので再構築メモ。

##構築メモ
前回はデフォルト設定だったnginxのコンテンツ、MysqlのデータディレクトリをNFSマウントされたRAIDディスク上に構築する。

- NFSサーバー側は構築済み
- NFSクライアント側で新しく作成するユーザーAのUID,GIDをNFSサーバー側のユーザーAに合わせる(以下はUID,GIDともに500とする）
- NSFサーバー側
    - マウントするディレクトリをユーザーAで作成、パーミッションを777にする
    - /etc/exportsに以下オプションで記述
        - `/raid/mount 192.168.x.x(rw,sync,no_root_squash,no_subtree_check,anonuid=500,anongid=500)`
- NSFクライアント側
    - /etc/fstabに記述
        - `NFS_server:/raid/mount /mnt/www nfs rw,nosuid,_netdev,auto,hard,intr 0 0`
     

##nginxの設定
[この辺参照](http://qiita.com/f-akazawa/items/a5d0bf61d78a052df85a)、今回はiptablesをオフにするのを忘れて1時間位htmlが表示されず真っ白だった。

##Wordpress復旧
DBダンプファイルをエクスポートするためにphpMyAdminをインストール

[インストールと設定はこちら](http://webkaru.net/linux/nginx-mysql-phpmyadmin/)

SQLファイルのインポートが終わったらSearch-Replace-DB-masterを使ってDBの中身を書き換える(phpMyAdminは入れたけど使っちゃダメ！絶対！！）

[参考サイトはこちら](http://www.infoscoop.org/blogjp/2014/08/14/use-search-and-replace-for-wordpress-when-moving/)
【AWS】EC2からのS3操作で403が出た場合に疑うこと。

# EC2からのS3操作で403が出た場合に疑うこと。
  - 最近よく遭遇するのでここ見といてね、というためのメモ。具体的な設定例はいろいろ転がっているので割愛。

## 【遭遇率40%】S3ACL、バケットポリシーが悪い。
 - 自分で設定しといて忘れてるケースがあるのでちゃんと確認する。
 - 特定のバケットだけ事象が発生するならまずここが悪い。

## 【遭遇率40%】IAMRoleが悪い。
 - RoleにS3Fullaccessを付けてみて通るならほぼこいつが悪い。

## 【遭遇率20%】VPCエンドポイントが悪い。
 - VPCエンドポイントポリシーで制限している場合がある。
 - リージョン変えると繋がるとかだとこいつを疑う必要がある。
 - ついでにサブネットのRouteTableやIGWも確認する。（S3までつながってなければ403にならないけども。）

## 【レア】aws-cliが悪い。
 - aws-cliのバージョンが古いと繋がらない、ということがまれにあるようです。

## 大事なこと
 - 冷静になること。全てのバケットからバケットポリシーを全解除、S3FullAccessを付与しても、VPCEndpointが悪い場合は再現してしまい、労力が無駄になる。
 - ので、まずは```aws s3 ls```などの影響の少ない操作で原因を絞り込もう。
bitriseでビルドしたiOSアプリをS3へアップロードする際、バージョン番号を付与する

bitriseでビルドしてFabric配布してるが、ビルドしたIPAやdSYMファイルは一応とっておきたいので、「Deploy to Amazon S3」を使用してS3へアップロードを行っている。この際、S3へのアップロードするファイル名にビルドするiOSアプリのバージョンを付与する話。


##Scriptステップを追加

ワークフローエディタで「Deploy to Amazon S3」ステップの前に「Script」を追加して以下のようなフローに構成する

![スクリーンショット 2016-06-02 14.39.23.png](https://qiita-image-store.s3.amazonaws.com/0/4361/c732fb39-f8d1-a712-e742-9384a46baa84.png)

##バージョン情報を設定するスクリプトの追加
追加したら、ScriptステップのScript contentに以下を記述する
(Path/To/Info.plistの部分は適時書き換え)

```
#!/bin/bash

IPA_VERSION=`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" Path/To/Info.plist`
IPA_BUILD=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" Path/To/Info.plist`

envman add --key IPA_VERSION --value $IPA_VERSION
envman add --key IPA_BUILD --value $IPA_BUILD
```

bitriseが提供しているenvmanというツールで設定すると、以降のステップからも参照できる。

##S３にアップロードされるファイル名を変更
「Deploy to Amazon S3」ステップのAmazon S3 File Path In Bucketを変更して、アップロード時のパス名を変更。
先のステップで設定したIPA_VERSION,IPA_BUILDを使用する。

```
${BITRISE_TRIGGERED_WORKFLOW_TITLE}/v${IPA_VERSION}_${IPA_BUILD}
```

上記の場合だと指定したバケットに、「bitrizeのワークフロー名/vバージョン名_ビルド番号」にIPAやdSYM,plistがアップされる
控えめに言ってBindingAdapterが最高だからみんな使おうぜって話


みんなDataBinding使ってますか？
ぼくはそろそろこれからのAndroidネイティブには必須にしていきたい気持ちでいっぱいです。

DataBindingはBindableメソッドやObservableFieldなどを使って、BaseObservableを継承したクラスからViewに直接値を教えることができます。
findViewByIdしなくていいよやったね！という記事がいっぱいでましたね。

今回はDataBindingの中でも最高なBindingAdapterってやつを紹介します。

### BindingAdapter is 何

すさまじく雑にいうと、｢Binding先をAdapterしてくれる何か｣です。
Adapterパターンのソレだと考えてもらって多分大丈夫です。

ひとまず実際に使ってみましょう。

### ~~それっぽいサンプル~~

仮にListViewにList<Hoge>なパラメータを突っ込んでリストを表示するものをつくるとします。
まず、`List<Hoge>`を返すBindableメソッドをBaseObservableなクラスに作成します。

```java
public class Clazz extends BaseObservable {

...

	@Bindable
	public List<Hoge> getHogeList() {
		List<Hoge> hogeList = new ArrayList<>();
		// なんか適当にデータ作る
		return hogelist;
	}

}
```

ListViewにセットするカスタムArrayAdapterを作成します。
いつものやつですね。

```java:CustomArrayAdapter
public class CustomArrayAdapter extends ArrayAdapter<ListHoge> {
	...
}
```


次に、アプリケーションパッケージ直下に適当なファイル名でBindingAdapterを作成していくjavaクラスを作成します。
アプリケーションパッケージ直下にあることが重要なので、変な場所に置いたら動きません。

```java:BindingAdapterUtils

public class BindingAdaptrerUtils {
	@BindingAdapter({hoge})
	public static void setHogeListAdapter(ListView listView, List<Hoge> hogeList) {
		listView.setAdapter(new CustomArrayAdapter(context, hogeList))
	}
}

```

ここまで準備すると、あとはレイアウトxmlのListViewにこのBindingAdapterを紐付けるだけです。

```xml:content_sample
	<date>
		<variable
			name="item"
			type="jp.tacksman.sample.Clazz"
		>
	</data>
	<ListView
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		app:hoge="@{item}"
	>
```

はい、これで出来上がりです。
BindingAdapterUtilsの@BindingAdapter({"hoge"})に書いた"hoge"をアトリビューションとして、Adapterをセットするという流れです。


### ファットなdataタグから解放されよう
BindingAdapterを導入することで個人的に最高だと思ってるところは、ActivityからAdapterという文字を抹殺できるところかなと思ってます。

setAdapterは勝手にやってくれる上に、BaseObservableなクラスをレイアウトにセットしてやれば、欲しいデータはそこのBindableメソッドから手に入れればよくなります。

これで、AdapterやListenerで膨れ上がりがちなdataタグから解放されます。


### しめ
というわけでBindingAdapterのさっくりしたお話でした。
控えめに言って最高なので、DataBindingとBindingAdapterをみんないっぱい使っていこうな！
Swiftでタップした点の座標を取得し表示するアプリを作りたい

Swift初心者です。

Xcodeで、タップした点の座標を取得し表示するというアプリを作ろうとしています。
段階としては
・タッチイベントで座標を取得する
・StoryBoardに設置したLabelにX, Yそれぞれの値を文字に起こし代入
だと思うのですが、さっぱりで・・・
回答よろしくお願いします。
「php -i」コマンドで出てくる_SERVER["PWD"], _SERVER["OLDPWD"] について

phpinfo()だと出てこないのにphp -iだと表示されるので気になって調べてみました。

# _SERVER["PWD"]

「php -i」コマンドを実行した時のカレントディレクトリ

# _SERVER["OLDPWD"]

「php -i」コマンドを実行した時に、ひとつ前にいたディレクトリ

# 補足
$_SERVERについては詳しくはこちらに記載されています。
http://php.net/manual/ja/reserved.variables.server.php
SQLServerで連番データ

### SQLServerで連番データ

#####「再帰SQL」を使って指定された値までのデータを取得




```sql:0～9の連番.sql
WITH serial AS ( 
  SELECT 0 AS N -- 開始値
  UNION ALL 
  SELECT N + 1 FROM serial 
  WHERE serial.N < 9 -- 最大値
) 
SELECT N FROM serial
```

- 結果

|  N  |
| --- |
|  0  |
|  1  |
|  2  |
|  3  |
|  4  |
|  5  |
|  6  |
|  7  |
|  8  |
|  9  |

##### 再帰は多すぎるとダメ（規定値では100回まで？）

MAXRECURSIONで設定できるらしい
最大再帰数「MAXRECURSION」
設定できる値は「0」から「32,767」までで、「0」は上限なし
規定値は「100」

```sql:0～1000の連番.sql
WITH serial AS ( 
  SELECT 0 AS N -- 開始値
  UNION ALL 
  SELECT N + 1 FROM serial 
  WHERE serial.N < 1000 -- 最大値
) 
SELECT N FROM serial
OPTION ( MAXRECURSION 1000 )
```


##### 大量データ

大量データの場合、再帰では遅くなる
100以上必要なときはこんな感じにするといいかも
再帰だけでやるより、こっちのほうが150～200倍早かった

```sql:100万件.sql
WITH serial AS ( 
  SELECT 1 AS N 
  UNION ALL 
  SELECT N + 1 
  FROM serial 
  WHERE serial.N < 10
) 
,K AS (
SELECT 1 AS N 
FROM serial A, serial B, serial C  -- 10×10×10で1000件
)
SELECT ROW_NUMBER() OVER (ORDER BY A.N) AS N 
FROM K K1, K K2  -- 1000×1000で100万件
```

##### PIVOTも絡めて応用

###### 九九の表を作ってみた


```sql:九九の表.sql
WITH serial AS ( 
  SELECT 1 AS N 
  UNION ALL 
  SELECT N + 1 FROM serial 
  WHERE serial.N < 9
) 
,base AS (
SELECT x.N AS X , y.N AS Y ,(x.N * y.N) as A
FROM serial x,serial y
)
SELECT
Y AS [X/Y], 
[1], [2], [3], [4], [5], [6], [7], [8], [9]
FROM base
PIVOT (SUM([A]) FOR [X] IN ([1], [2], [3], [4], [5], [6], [7], [8], [9])) AS PV

```

##### 再帰を使わない方法

システムテーブルを利用して内容を使用しないで、
ROW_NUMBER()で連番を作成

システムテーブルの行数までの範囲ならこれでいいかも
大量データの場合はシステムテーブルを複数重ねるとできるが、列が複数ある分、再帰を使ってのほうが速そう


```sql:システムテーブルを利用.sql
SELECT TOP 1000
  ROW_NUMBER() OVER (ORDER BY A.object_id) AS N  --  ORDER BY にはプライマリキーを指定
FROM
  sys.all_columns A  -- 件数が多くて速そうなシステムテーブルあるいはビュー
```
Androidでslick.jsのスライダーがスクロールできない

※今の最新バージョン(20160602現在は1.6.0)は起きないです。

そう、昔構築したものでは起きていなかったし、最新版で試しても起きなかったから、てっきりちょうど使ったバージョンがいけないのかと思っていた

**jsのバージョンが**

全く解消されない。
混ぜなら原因は

```css
touch-action: none;
```

だったのだから。

CSSは、カスタマイズを加えたりしていたので、そっくり書き換えるのは、軽い気持ちでできなかった。
だから、気付けなかった。

古いバージョンのslick.jsでも、CSSを書き換えれば問題ないです。

```css
.slick-slider{
    touch-action: pan-y;
}
```

これでスクロールできます。


参考
[html { touch-action: none; } に潜む罠](http://lealog.hateblo.jp/entry/2015/02/19/124748)
いつの間にかaptコマンドが簡単になっていた

あんまり普段Linuxを使わないので知らなかったのですが、いつの間にかaptコマンドが簡単になっていました。

今までだと、次のようなコマンドでアプリのインストールを行っていました。

```
$ sudo apt-get install apache2
```

実はこれが、次のコマンドでも実行できるようです。

```
$ sudo apt install apache2
```

何文字か入力を減らすことができそうです。

```
$ apt help
```

で、使い方が表示されます。
apt search は、 apt-cache search とちょっとだけ表示フォーマットが違うようでした。

## 参考リンク
http://gihyo.jp/admin/serial/01/ubuntu-recipe/0327
Mysqlで文字コードを一括変換するSQLを作成するSQL

AmazonRDS使い始めたんだけど、パラメータ設定忘れてて、文字コードがおかしくなった。。。。orz
みたいな時に使ってください。

#テーブルの文字コードを一括変換するSQLを作成するSQL

```sql:
SELECT
`TABLES`.TABLE_NAME,
`TABLES`.TABLE_COLLATION,
CONCAT("ALTER TABLE ",`TABLES`.TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;")
FROM
`TABLES`
WHERE
`TABLES`.TABLE_SCHEMA = "データベース名"
AND
`TABLES`.TABLE_COLLATION != "utf8mb4_general_ci"
```

#カラムの文字コードを変換するSQLを作成するSQL

ALTER TABLE "テーブル名" MODIFY "カラム名" "型" CHARACTER SET "文字コード" COLLATE "文字コード照合";
C++Builder フォームでの特定のUIパーツに対する TObject*の扱い

チョット困ったこと。

C++Builderでデザインタブ上で複数のUIパーツを作ったとき。
で、共通メソッドを使ってるんだけど、特定のUIパーツ（オブジェクト）にのみ特定の挙動をさせたい！

となったとき。

```cpp:file01.cpp
MyButtonClick(TObject* Sender) {
  TButton* btn = (TButton*) Sender;   // ここでSenderはクリックしたボタンになる

  // クリックしたボタンをnameプロパティでフィルタリングできます
 if(btn->Name == "btn_name1") {
  /* 特定のボタンなどにさせたい内容*/
 } else {
  /* 他ボタンに共通の処理*/
 }
}
```
LaravelでCsrfTokenを無効化するよ。(ただし5.1〜）

外部からのアクセス時にAPIを利用させる時など、
`VerifyCsrfToken`のチェックを無効化させたい時があります。

5.1から、このMidllewareVerifyCsrfTokenクラスで、無効化したURLを指定出来るようになりました。

このファイルに、
`/app/Http/MiddlewareVerifyCsrfToken`

こんな感じで、URLのパターンを書いておけば、そこだけ無効化されます。
```
protected $except = [
    'api/*'
];
```

ますます、Laravel便利ですね。
Homebrew Cask の Cask を更新する


毎度やることは以下の通り。

```zsh
ssh-add ~/.ssh/id_rsa

# use to update <outdated_cask>
outdated_cask='<the-cask-i-want-to-update>'
github_user='<my-github-username>'
cd "$(brew --repository)/Library/Taps/caskroom/homebrew-cask/Casks"

cask-repair --pull origin --push $github_user $outdated_cask
```

最初の1回は設定が必要: https://github.com/caskroom/homebrew-cask/blob/master/CONTRIBUTING.md#updating-a-cask
Masterブランチへのコミットを新しいブランチに移動する

多數メンバーが共同で開発のリポジトリには原則できにmasterブランチに直接コミットできないです。

例え誤ってmasterにコミットしたら、下記の手順でそのコミットを新しいブランチに移動できます。

**注意：リモートブランにプシュした場合、下記のURLを参考してください。この例はあくまでリモートにpushしたい時、誤りが発見しただけです。**

まずはmasterブランチにgit statusで移動するコミットのハッシュ値を覚えて：

```
git log
```
masterブランチをリセット：

```
git reset --hard HEAD^
```

新しいブランチを切る：

```
git checkout -b the-right-branch-to-commit
```

もとのコミットをcherry-pickで新しいブランチに移動する：

```
git cherry-pick d1eff2d25b4ac5bb0ea6d0220e8bb1019951df3f
```


上記より複雑なケースであれば、このURLを参考してください：　http://stackoverflow.com/questions/2941517/how-to-fix-committing-to-the-wrong-git-branch
変換式 > Link > 気圧から高度 > International Standard Atmosphere：ISA

## International Standard Atmosphere：ISA

http://www.geocities.jp/zattouka/GarageHouse/micon/Arduino/Pressure/Pressure1.htm
にて実装されている気圧から高度への変換式。

検索して見つかったのは以下。

http://www.namiyoi.com/info/dan/info.html
> 国際標準大気(International Standard Atmosphere：ISA)


別途、googleで[pressure altitude 44330.8]で検索したときに出てくる「A Quick Derivation relating altitude to air pressure - Resea...」というPDFファイルにて該当の係数を使った計算が記載されている。

## 式7の変形

@it__ssei さんに教えていただいた資料の式7の変形

```math
P / P0 = (1 - 0.0065 h / T0)^{5.2561} -- (1)
```

以下の式を使う

```math
t^a = exp(a * logt)
```

(1)式は

```math
P / P0 = exp ( 5.2561 * log(1 - 0.0065 h / T0) )
```

両辺の対数を取り

```math
log(P / P0) = 5.2561 * log(1 - 0.0065 h / T0)
```

after some of algebra

```math
1 / 5.2561 * log(P / P0)  = log(1 - 0.0065 h / T0)
```

```math
0.190255 * log(P / P0) = log(1 - 0.0065 h / T0)
```

```math
log(P / P0) ^ {0.190255} = log(1 - 0.0065 h / T0)
```

```math
(P / P0) ^ {0.190255} = (1 - 0.0065 h / T0)
```

```math
0.0065 * h / T0 = 1 - (P / P0) ^ {0.190255}
```

```math
h = T0 / 0.0065 * (1 - (P / P0) ^ {0.190255})
```

T0 = 288.15の時、T0/0.0065 = 44330.8


係数 0.190263 と 0.190255 の違いがあるようだ。

式変形は最初から両辺の対数を取ったほうが早かったかも。。。

## 関連資料

http://www-mdp.eng.cam.ac.uk/web/library/enginfo/aerothermal_dvd_only/aero/atmos/atmos.html

> Lapse rate (0.0065 K/m)

など
AWS Summit Tokyo 2016 参加メモ１　Day2キーノート

# Day2 キーノート　長崎 忠雄（アマゾン ウェブ サービス ジャパン株式会社 代表取締役社長）
  - 入りきらなくて別室でモニタ見ながら鑑賞。
  - キーノートの話は毎回忘れてしまうのでメモを残す。

## 今回のサミットについて
 - 16000人の申し込みがあった。
 - 合計60社以上のスポンサーがあった。

## AWSの歴史
 - AWS10年、Tokyoリージョン5年
  - ものすごいスピードでクラウドが浸透している。
    - 3年前は導入の検討が多かった。今は効率的に使う方法の議論が多い。

## Amazonのビジネス
 - Amazonの成長戦略
  - お客様満足が中心。スケール戦略を徹底（沢山売ることで安くできる。）

## AWSの最新情報
 - 倉庫用ロボットの導入。
 - Amazon Echoの紹介。（日本は未だ）
  - 話しかけるだけで天気や交通状況などの便利な情報を取得できる。

## AWSの現在
  - アクティブカスタマーが100万以上。（１ヶ月で実際に使った顧客。）
  - 去年だけで700以上の新しい機能。
  - 年率10%以上の売上増を継続。去年1兆円超えた。
    - スマニュー、グノシー、freee、などのベンチャー。
    - 業種を問わない企業が採用。
    - 公共・教育などの機関。
  - パートナー。日本では5社が最上位。
    - クラスメソッド、NRI、CloudPack、あとふたつなんだっけ。
  - 事例大全集を会場で配ってる。
  - グローバル展開
    - リージョンとかの説明。
    - より柔軟に、よりスピーディに、というのがどんどん求められてる。AWSを使えばそれがry
  - STAT CAST(メジャーリーグの中継にリアルタイムにデータを表示。)の紹介。
  - AWSには70以上のサービスがある。
  - X1インスタンスの紹介。
  - ビッグデータビジネスは不確実性が高い。AWSならスケール出来るよね、というお話。
    - スシロー、無印（？）、ベルシステム（コールセンターの応対を全て保持、分析。）、etc、、、

## スピーカー１、末延 寛和（株式会社ゲオホールディングス　業務システム部ゼネラルマネージャー）
  - GEO社のビジネス。
    - リユース（2ndstreet）と、レンタル（GEO）
    - リユースは拡大、レンタルは縮小傾向にある。
  - ビジネスの変化によるIT変革が必要。
    - AWSをフル活用する。
      - AWSコスパ良いから。スピーディだから。
  - 2014年にOracle Exadataの保守切れがあり移行を検討。
    - 1年で移行したい。
    - 社内SE20名の意見もあり、AWSに。
  - IT中継2020　戦略方針（2020年のIT状況を予測。）
    - 顧客ニーズをITで充実する必要がある。
      - レコメンド、GEO-Cｈ、などを短期間で構築。

## 技術紹介１
  - snowballの紹介。実機を持ってきて説明した。
    - 大容量のデータ移行をスピーディに。
    - 今年中に全リージョンリリース予定！
  - IoT事例を紹介。
    - 融雪のために積雪量をセンサで測定し融雪量を調節。
    - 太陽光パネル上のゴミを検知して発電効率を向上。
    - etc、、、
  - IoTデバイスでは安定したネットワーク、デバイスの増加、セキュリティに対応しなければならない。
    - そこでAWS-IoTです。

## スピーカ－２、佐藤 年成（日本電産株式会社　常務執行役員 CIO（最高情報責任者））
  - 日本電産の紹介。
    - 業務改革推進室のITビジョン2020を策定。
    - クラウド化を推進。社内にサーバは一台もない。（すごい！）
    - 出来る限り流行りの技術を使うようにした。
      - ラズパイやソラコム、東芝のデバイス等。
      - アーキテクチャを紹介。（AWS-Lambdaとか、RとかZabbix使っている。）

## 事例紹介２
 - RDSの紹介。Auroraとか国内導入事例多数。
 - セキュリティ系のサービス紹介。Amazonの堅牢性。
  - certification managerとか。

## スピーカー３、佐々木 大輔（freee株式会社　代表取締役）
 - freeeのTシャツで登場。
 - freeeのサービス紹介
  - 中小企業向け（~500人）のクラウド会計ソフト。
  - 2012年からで急成長のサービス。
 - AWSセキュリティの堅牢性で認められて、銀行等とも連携できている。
 - 具体的な使用サービスはよくわからなかった。

## 最後に。
 - お客様の声を紹介。


## 感想
 - ビッグデータ系の話はだいぶ少なくなった気がする。
 - いかにスピーディに、安く、柔軟にサービスを実現できるか、というところを強調していた印象。
 - セキュリティ系サービスはあまりマークしていなかったけど、増加傾向にありそう。
Ubuntu 16.04でGUIログインを無効にする

次のコマンドを入力すると無効にできるようです。

```
$ sudo systemctl disable lightdm
```


今までのバージョンでは、 /etc/init/lightdm.override というファイルを作る方法もあったようですが、16.04ではこれがうまく動きません。

ちなみに、GUI起動時にCtrl+Alt+F1〜F6を押すと、ターミナルの画面になります。
Ctrl+Alt+F7でGUIが出てきます。

GUIを起動しないようにするだけで、手元の環境ではメモリが400MBほど節約できました。メモリ使用量は、次のコマンドで調べることができます。

```
$ free -h
```

## 参考リンク

http://askubuntu.com/questions/139014/how-to-disable-lightdm
springの再入門


javaで開発するときに使ったフレームワークはstrutsと富士通のinterstage（java ee）しかない。
springについてはEJBの軽量化バージョンということで少し触れた程度。
最近springについてググってみたらspring rooとかbootなど知らないものが出ってきたので調べてみた。
序でに近頃使われているJAVA系のフレームワークの傾向についても整理した。

## frameworkとは

一般的な機能をもつ共通コードをユーザーが選択的に上書きしたり特化させたりすることで、ある特定の機能をもたせようとする抽象概念のことである。（wikipediaより）

パッとこない人のために補足する。
近頃のWebアプリケーションはmvcアーキテクチャーを採用して作られている。
mvcとはソフトウェアのデザインパターンの一つでこれを採用してWebアプリケーションを作るとビジネスロジックとプレゼンテーションが分離されて全体的な開発コストが下がるようになる。
しかし、mvcアーキテクチャーは最初から作ろうとすると骨を折る作業になってしまう。
そこでどこかで心優しいエンジニアさんがmvcアーキテクチャーである程度作られているもの（フレームワーク）を公開してくれた。
ある程度作られているものだからそれに合わせて必要な機能の実装に力を入れれば終わりというわけよ。

心優しいエンジニアさんが大勢いたので、世の中には多数のフレームワークが存在する。
多数のフレームワークの中でも人気を集めているものがあるので、できればそれを使った方がいいと思う。

次はjava言語で作られたフレームワークのトレンドである。  

__Googleのトレンド__
![google_trend.png](https://qiita-image-store.s3.amazonaws.com/0/93752/ec464c01-e248-db53-64fc-d3dc1e90fae8.png "google_trend.png")

最近はspring bootの検索頻度が増えている。

__Indeedのジョブトレンド__
![indeed_trend.png](https://qiita-image-store.s3.amazonaws.com/0/93752/0c6e38ed-0d9b-fccd-b44d-05ddca060150.png "indeed_trend.png")

Indeedのジョブトレンドで企業で求めているスキルが何なのか見るとspring frameworkが一番多くてspring bootが徐々に増えている。

spring bootはruby on railsの影響を受けてspring frameworkをより簡単に使うためのもので新しいフレームワークではない。

## spring framework

* DI（Dependency Injection、依存性注入）をベースにしたフレームワーク
* spring frameworkを土台として多数のフレームワークが用意されている。spring mvcもその中の一つ

## spring mvc

* MVCアーキテクチャーによる開発を可能にするフレームワーク
* 基本的にはspring framework + spring mvcの構成でWebアプリケーションを作るがspring framework + apache strutsの構成で作る場合もある。

## spring roo

* ruby on railsのgeneratorのように枠組みを自動生成してくれるツール

## spring boot

* ビルドツールの設定ファイルを記述し、専用のコマンドを実行することにより最適化されたWEBアプリケーション環境を構築
* spring mvc + spring boot = railsライクなフレームワーク
* Groovy（JVM上で動作するスクリプト言語）とjavaによるアプリケーション開発をサポートする。  

## 次回

* springの開発ツールとしてeclipseを設置
* spring legacy project（旧spring framework）の生成
* spring starter project（spring boot）の生成
nginxのproxy_http_versionのデフォルト値が1.0

リバースプロキシでNWアプライアンスの管理画面にTLS接続してたんですが、
ファームウェアバージョンアップ以降突如みえなくなったのでどうしたことかと思って
apacheのipベースのvhostに書き換えてみたりしたところつながったりして（apacheならNameベースもいけた）、
nginxだとどうしたことかどっちもいけず、なんでなのnginx？とおもってたところ、
スーパーエンジニアの方から、
nginxがproxyでアップストリームに接続するときにデフォルトでHTTP/1.0を使用しているようで、
`proxy_http_version 1.1;`を指定すると動いたということで解決しました。

確かにこのへんにそんなんかいてありました。そうだったのかー。
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version

未確認だけどNWアプライアンスのhttpのバージョンがアップデートで1.0切られたのかな。たぶん。
そんなときは`proxy_http_version`を指定しましょうという。

`proxy_http_version 1.1;`

apacheは以下のあたりをみると、
https://httpd.apache.org/docs/current/ja/mod/mod_proxy.html#envsettings

デフォで1.1で古いのしかしゃべらないアプリ向けにforce-proxy-request-1.0 と proxy-nokeepalive を設定する
ということのようです。だからうまくいったんですね。
勉強になりました。

参考：
http://qiita.com/toritori0318/items/a85d0b1efbd3ea1fc950
https://httpd.apache.org/docs/current/ja/mod/mod_proxy.html#envsettings
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version
ファイルとかディレクトリの命名規則についての参考文献


* [ファイル名の変更 by MSDN](https://msdn.microsoft.com/ja-jp/library/cc294974.aspx)
* [ファイルの命名と整理のルール by 筑波大学流域管理研究室](http://ryuiki.agbi.tsukuba.ac.jp/~nishida/MEMO/naming.html)
JavaScriptでドメインの自動更新設定をする(AWS SDKのRoute53Domainsを使ってみるpart.2)


よく見るとSDKドキュメントまんま書いてるだけじゃねーか企画その２。

Route53DomainsのregisterDomainでautorenew(自動更新)の設定ができるのは前回記事で紹介しましたが、これだけだとドメインを解約したいときに困りますよね。

ということで自動更新の設定を有効にしたり無効化したりします。

## 使う処理
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Route53Domains.html#enableDomainAutoRenew-property
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Route53Domains.html#disableDomainAutoRenew-property


## コード

せっかくなのでモジュールにしてみた。

```autorenew.js
var AWS = require('aws-sdk');

exports.autorenew = function ( domain, isAutoRenew ) {
	var config = conf.getConf();
	var route53domains = new AWS.Route53Domains({
		apiVersion: '2014-05-15',
        accessKeyId: "YOUR_AWS_ACCESS_KEY_ID",
        secretAccessKey: "YOUR_AWS_SECRET_ACCESS_KEY",
        region: "REGION" #省くと怒られる。（いらないはずだけど）
	});
	var params = {
	  DomainName: domain
	};

	if ( isAutoRenew  ) {
		route53domains.enableDomainAutoRenew(params, function(err, data) {
		  if (err) console.log(err, err.stack); // an error occurred
		  else     console.log(data);           // successful response
		});
	} else {
		route53domains.disableDomainAutoRenew(params, function(err, data) {
		  if (err) console.log(err, err.stack); // an error occurred
		  else     console.log(data);           // successful response
		});
	}
};

```

## 使い方
```
var domainRenew = require('./autorenew.js');
var domain = 'EXAMPLE.com';
var isAutoRenew = true;
domainRenew.autorenew( domain, isAutoRenew );

```

isAutoRenewをtrueにすると自動更新が有効化されます。
もう更新しなくていいって場合はfalseにしておけばいいかなと。
iTerm2をアップデートしたら背景色を変えるscriptが動かなくなった時のメモ

iTermでsshするときに[ssh-host-color](https://gist.github.com/thomd/956095)を利用させてもらって背景色を変更しているんですが、iTerm2を3.0.0にアップデートしたら

```
end of line があるべきところですが identifier が見つかりました
```

と出るようになってしまった。
AppleScriptの互換性がなくなったことが原因の模様。

ので、

```
  /usr/bin/osascript <<EOF
tell application "iTerm"
  tell the current terminal
    tell the current session
      set background color to {$(($R*65535/255)), $(($G*65535/255)), $(($B*65535/255))}
    end tell
  end tell
end tell
EOF
```

を

```
  /usr/bin/osascript <<EOF
  tell application "iTerm"
    tell current session of first window
      set background color to {$(($R*65535/255)), $(($G*65535/255)), $(($B*65535/255))}
    end tell
  end tell
EOF
```

と修正したら直りました。
ApppleScript詳しくないので、どなたかスマートな書き方ご存知でしたら教えてください。
Spock関連記事のまとめ（主に自分用）

# Spockとは
Groovy（JVM上で動くスクリプト言語）で書かれたテスティングフレームワーク

# 日本語資料
- [Spockのドキュメントを読んだよ](http://bufferings.hatenablog.com/entry/2014/01/17/234736)
    - 丁寧にフィーチャが説明されてる
- [魅惑的(Fascinating)なテスティングフレームワーク Spock](http://etc9.hatenablog.com/entry/2015/04/12/195504)
    - 日本語では一番まとまってる？
- [JavaのユニットテストにSpockを適用する](http://qiita.com/euno7/items/1e834d3d58da3e659f92)
    - Qiitaの記事。JUnitからの移行を考えている人は読むといいかも
gitのブランチ移動（checkout）を楽にするやつ

# こういうことがありました
開発中のブランチが多くなってきて、ブランチ移動が頻繁になり、
「git branchでブランチ名をコピーしてgit checkoutと書いてペースト・・・git branchでブランチ名をコピーしてgit checkoutと書いてペースト・・・git branchでブランチ名をコピーしてgit checkoutと書いてペースト・・・」
ということを繰り返していたため、そのうちに怒りシンジくんになってしまったので、
さくっとブランチのcheckoutをできるスクリプトを書いてみた。

# これ
```bash
#!/bin/bash

branches=`git branch | grep -v -e"^\*" | tr -d ' '`

PS3="Select branch > "

echo 'Branch list:'
select var in ${branches}
do
    echo "git checkout ${var}"
    git checkout ${var}
    exit 0
done
```
こいつを適当な場所においてaliasを設定してやります。
そして、いつもgit checkoutしてた場所でaliasに設定してやったコマンドを叩くことで、
ブランチ名が出てきて、チェックアウトしたいブランチを選択したらチェックアウトされるというちょう嬉しい感じになります。

# 例
状態：
- ~/binにgit_checkout.shとしてスクリプトを作った
- ローカルリポジトリはbranch_bに向いている
- branch_aにcheckoutしたい
```
$ alias gitch='~/bin/git_checkout.sh'
$ cd (ローカルリポジトリの場所)
$ gitch
Branch list:
1) master
2) branch_a
3) branch_c
Select branch > 2
git checkout branch_a
Switched to branch 'branch_a'
$
```
てな感じになります。

# gistにもうｐしました
https://gist.github.com/aminosan/e3cbe51743994a7273a248671aa47a70
コメントには豪華付録「コピペでダウンロードから設定までをやってくれる使うの自己責任ワンライナー」があります。
DNSのオンラインチェックツール

DNSのオンラインチェックツール集をメモする記事．色々ありますが，個人的に便利だと思ったものをリストアップしてます．見つけ次第更新．

# DNSSECを確認できるサイト
* http://dnsviz.net/
    * 図で視覚的に見せてくれて，どこまでが信頼できるかをわかりやすく見せてくれます．
* https://www.zonemaster.fr/

# DNS Delegationをトレースして見せてくれるサイト
* http://dns.squish.net/
    * 個人的に好きなサイト．全て辿ってくれるのでわかりやすい．
* http://simpledns.com/lookup-dg.aspx
    * dns.squishに比べてシンプルにテキストで表示してくれます．

ちなみにローカルで動作するものも公開されてます．https://github.com/squish/dnstraverse

```console
# gem install dnstraverse
Fetching: dnsruby-1.52.gem (100%)
Fetching: dnstraverse-0.1.0.gem (100%)
Successfully installed dnsruby-1.52
Successfully installed dnstraverse-0.1.0
2 gems installed
Installing ri documentation for dnsruby-1.52...
Installing ri documentation for dnstraverse-0.1.0...
Installing RDoc documentation for dnsruby-1.52...
Installing RDoc documentation for dnstraverse-0.1.0...
# PATH=$PATH:/var/lib/gems/1.8/bin
# export PATH
# dnstraverse www.google.com
```


# DNSの健全性をチェックしてくれるサイト
* http://dnscheck.jp/
* http://www.e-ontap.com/dns/health/dnscheckw.cgi

# 外部からdigを叩けるサイト
* http://www.e-ontap.com/dns/dig.html
  * v4しか使えない
* http://www.subnetonline.com/pages/network-tools/online-dig.php
* http://mgt.jp/t/dns#
* https://www.digwebinterface.com/
めざせpythonライブラリマスター （７）numparser

#【ライブラリ説明】
　文字列を数へ変換

#【プログラム】
```py:numparser.py
# -*- coding: utf-8 -*-

import numparser

print int(numparser.numparser('one quadrillion two hundred thousands three'))
print numparser.numparser('six million four hundred thousand five')
print numparser.numparser('$410 million')
print numparser.numparser('50,000,001 to $100,000,000')
print numparser.numparser('Fifty-two Million Five HundredThousand Dollars')
print numparser.numparser('less than $5,000,000.00 (five million dollars')
print numparser.numparser('$50 million $160,000')
```
#【結果】
　1000000000200003
　6400005.0
　410000000.0
　100000000.0
　52500000.0
　5000000.0
　50160000.0

#【参考サイト】
　[numparser](https://pypi.python.org/pypi/numparser/0.0.2)
　[github](https://github.com/sadovnychyi/numparser)
.NETラボの勉強会に参加してきました

同フロアのMVP(Microsoft Most Valuable Professional)の先輩に５月度の.NETラボの勉強会に誘われたので、興味本位ながら参加してきました。

今回の勉強会のセッションとしては大きく分けて４つあり、
1.「Visioで自分専用のシェイプを作る」 Microsoft MVP for Visio 上村 国慶
2.「従来型ソフトウェアで実践するリーンスタートアップ ～The story of Forguncy～」グレープシティ プロダクトマネージャ 八巻 雄哉
3.「Xamarin の今までとこれから」 Microsoft MVP for Xamarin 田淵 義人
4.勉強会参加者によるライトニングトーク
といったものが有りました。

その中で個人的に注目したのは2番目に行われた「従来型ソフトウェアで実践するリーンスタートアップ ～The story of Forguncy～」です。

スライドはこちらで公開されています。
http://www.slideshare.net/forguncy/the-story-of-forguncy

私は恥ずかしながらタイトルに出てきたリーンスタートアップという単語がここで聞くまでどういう意味かも知りませんでした。
話を聞いたり調べてみたところリーンスタートアップとは『事業の立ち上げに関する方法論のうち、仮説の構築、製品の実装、および軌道修正、という過程を迅速に繰り返すことによって、無駄な無価値な要素を最小限に抑えつつ素早く改良を続け、成功に近づく、というビジネス開発手法である。』(BINARY IT用語辞典 http://www.sophia-it.com/content/%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97 より引用)の意味で、開発手法であるアジャイルを事業アイデアに置き換えた感じのもののようです。

概要としてはForguncyというExcel感覚で手軽にWebアプリを作成できる製品についての企画・開発を通して、経験したことや学んだことをリーンキャンバスやMVP(Minimum Viable Product(実用最小限の製品))といった手法などを例にして共有していくというながれでした。

その中で注目したこととしては、リーンキャンバスの話でした。
リーンキャンバスを作成する際に課題・ソリューション・主要指標・独自の価値提案・圧倒的な優位性・チャネル・顧客セグメント・コスト構造・収益の9つの区切りから作成していくわけですが、同じ商品に対しても、どこか一つを変更することでその他の構造が大きく変わっていくというのは非常に興味深く感じました。
例として今回の話の中では顧客セグメントを変えた時の話が出ていましたが、
顧客セグメントを変えた結果、課題・ソリューション・チャネルの方向性がガラッと変わったのを見て土台をきちんと決めることの大事さを感じました。顧客ターゲットを変えれば、方向性もいろいろと変わるのは当たり前なのですが、表としてきっちりとこのように変わると出されるとまた違うなと感じました。実際の業務では顧客ターゲットだけではなく課題やソリューションと言った項目をかえたものを10枚単位で作成し、リスクの観点から順序を決めていきダメなものをそぎ落として良い物を決めていくそうです。
規模は違いますが、開発における要件定義や設計の際のものでも重要性も同じなのだろうと思いますので、今まで業務などでなんとなくでやっていたところを理屈づけて行っていきたいです。

この話はどちらかと言うと技術というよりも別のジャンルの話な気がしますが、一応経営学部で学んできた人間としては、とても興味深い内容でした。

おまけですが、イベントで参加者の方が提供した日経Linuxの雑誌を頂いてきました。
Ubuntuのフリーソフトについていろいろと載っているので、久しぶりにLinuxを入れて遊んでみたいと思います。
![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/127059/db8c5f54-5a33-70ef-5522-d2aee03f6d26.jpeg)
Node::getChildByName()で"/"区切りで再帰的に検索し取得できるようにする

# Node::getChildByName()で"/"区切りで再帰的に検索し取得する

```cpp:CCNode.cpp
Node* Node::getChildByName(const std::string& name) const
{
  std::string str = name;
  auto pos = str.find("/");
  if( pos == 0 ){
    str = str.substr(1,std::string::npos);
    pos = str.find("/");
  }
  std::string a = str.substr(0,pos);
  std::string b;
  if( pos != std::string::npos ){
    b = str.substr(pos,std::string::npos);
  }

  std::hash<std::string> h;
  size_t hash = h(a);

  for (const auto& child : _children)
  {
    // Different strings may have the same hash code, but can use it to compare first for speed
    if(child->_hashOfName == hash && child->_name.compare(a) == 0){
      if( b.empty() || b == "/" ){
        return child;
      }
      else{
        return child->getChildByName(b);
      }
    }
  }
  return nullptr;
}

```
Qiitaをコンソール（シェル）で閲覧できるようにした

黒い画面から出たくなかった。
vimと離れるの怖かった。

qitReader: https://github.com/nocotan/qitReader

UNIXコマンドを扱うように操作、閲覧することができます。  
Python使いました。
##使い方  
初回認証が必要
Qiitaのアクセストークンは、Qiitaにログインして、　
"設定"->　"アプリケーション"　->　"個人用アクセストークン" -> "新しくトークンを発行する"
で取得できます。



```
$ python3 qit_reader.py
YOUR ACCESS TOKEN: <your_access_token>
```

```
QitReader[user] ~ $
QitReader[user] ~ $ ls
all_items  follow_items  all_tags  follow_tags
QitReader[user] ~ $ cd all_items
QitReader[user] ~/all_items $ ls
[0] 記事1  [1] 記事2  [2] 記事3 ......
......
QitReader[user] ~/all_items $ 0
**************************内容表示*************************************
```
Macでtmuxを使う方法


## インストール

* brew経由でインストール

	```console
	$ brew install tmux
	```

* 確認

	```console
	$ tmux -V
	tmux 2.1
	```



* 設定ファイル作成
	* [達人に学ぶ.tmux.confの基本設定](http://qiita.com/succi0303/items/cb396704493476373edf)を参照
swift2.2 import Glibc

#概要
paizaのswiftをたたいているが、情報少ないので載せておく。
#import Foundationできない。
NS**が使えない。
ibm swift sandboxでは、使える。

```
import Foundation
import CoreFoundation

let time = UInt32(NSDate().timeIntervalSinceReferenceDate)
srand(time)
print("Random number: \(rand()%10)")
```
#実際
https://paiza.io/projects/vIQ0VjS1LRc5sDxbZF82EA
#Stringのformatが使えない。
```
import Glibc

let avgTemp = 66.844322156
print("test\(avgTemp)")
var t = String(format:"%.2f", avgTemp)
print(t)
```
#実際
https://paiza.io/projects/jjy7gSSrwHFOngnitniavg
#import Foundationに NSURLConnectionが無い。

#実際
http://swiftlang.ng.bluemix.net/#/repl/9557fe2121feb9c15071cbacc4aa085cc0a25871cd6c54adfcf2d9c17b9f09fb
zooライブラリによる欠損値補完

## zooライブラリによる欠損値補完
* パッケージ zoo は、時系列を扱うためのクラス zoo および zooreg とその操作のための関数群を提供するパッケージ
* zooクラスにすることによって欠損値の補完に便利になる

## 欠損値補完例
* 対象のカラムに欠損値がある場合、隣のカラムに存在する値で欠損値を埋めることが出来る

```r
library(zoo)
kw_rank_ver2 <- t(na.locf(t(kw_rank_ver1.5), fromLast = TRUE))
kw_rank_ver2 <- as.data.frame(kw_rank_ver2,stringsAsFactors=FALSE)
```

## 参考
http://d.hatena.ne.jp/teramonagi/20111201/1322686548
https://sites.google.com/site/leihcrev/r/package-zoo
rysnc&cronによるバックアップシステム

# パスなしssh
サーバ側で鍵を作成し，バックアップサーバに送る．
```
ssh-keygen
scp id_rsa.pub
```
バックアップ側で，以下のconfigを作成．
```
PermitRootLogin yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
```

# cron設定
/etc/cron.weekly/にシェルをおく．
次に，
```
crontab -e
>* * * * * * /etc/cron.weekly/bkup.sh
```
ES5をES6/ES7にリプレースする

##import/require class
ES5

    var React = require('react');
    var Component = require('react').Component;
    var PropTypes = require('react').PropTypes;

ES6/ES7

    import React, { Component, PropTypes } from 'react'
##classを作る
ES5

    var App = React.createClass({
    	...
    });
ES6/ES7

    class App extends Component {
    ...
    }
##export function/class
ES5

    //class
    module.exports = App
    //function
    module.exports.functionName = function functionName() {
      ...
    }
ES6/ES7

    //class
    export (default) App
    //function
    export (default) function functionName() {
      ...
    }
(default)を使う方：https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export
##valueの定義
ES5

    name1 = this.props.name1
    var name2 = this.props.name2
ES6/ES7

    var name1 = this.props.name1
    var {name1, name2} = this.props
    let name3 = this.props.name3
    const name4 = this.props.name4
    ...
##functionの定義
ES5

    functionName: function(params) {
       ...
      },
ES6/ES7

    functionName(params) {
      ...
    }
##最後に
**もっと詳しくES6/ES7情報**
http://es6-features.org/
http://webapplog.com/es6/
LuaLaTeX で PDF ファイルを埋め込む

## <i class="fa fa-paw fa-fw"></i>はじめに
以前は，TeX の図を埋め込むのに EPS 形式を主に使っていたのですが，うまく埋め込まれないことがあり，最近では PDF 形式（写真は,JPEG 形式）を使うようになりました．

最近，記憶力の低下が甚だしいので，忘備録がわりに残しています．画像の取り込みには，`graphicx` パッケージを使用します．

詳細は，[Acetaminophen’s diary](http://acetaminophen.hatenablog.com/entry/2015/07/18/233500) に詳しく書かれています（参考になりました >_<）．

## <i class="fa fa-leaf fa-fw"></i>元の PDF に手を加えない方法
`\includegraphics` に `pagebox=artbox` オプションを使用する．最初は，PDF を編集しても処理しなくてもいいので，この方法を使ってましたがなんとなくやめました．

```tex:
\includegraphics[pagebox=artbox,clip,scale=1.0]{fig/xxx.pdf}
```

## <i class="fa fa-leaf fa-fw"></i>元の PDF に手を加える方法
TeX 環境の構築には，`TeX Live` を使用しています．付属している `pdfcrop` を使用して，トリミングをします．ただ，大量のファイルを処理するときは，邪魔くさいので，バッチファイルを作って処理しました．

```bat:pdftocrop.bat
@echo off

set ORG=pdf
set CROP=crop

for /R %ORG% %%i in (*.pdf) do (
    pdfcrop %%i %CD%\%CROP%\%%~nxi
)
```

トリミングする前の PDF を `pdf` フォルダに，トリミング後の PDF を同じファイル名で `crop` フォルダに掃き出します．

```
>pdftocrop pdf
```

基本的なバッチ処理なのですぐ作れますが，毎回 `help for` で構文を確認するのが面倒なので，落書きを残しておきます．
naming > vx, vy, vxyの平均値 > avgの前置、後置

vx, vy, vxyの平均値を計算する場合の変数名の検討。

## 前置
avg_vx, avg_vy, avg_vxy

- 長所: avg_XXXで平均関連のものだとわかりやすい
- 短所: avg_vxで検索時にavg_vxyもひっかってしまう

## 後置

vx_avg, vy_avg, vxy_avg

- 長所?: Code Completeでは「a set of names like revenueTotal, expenseTotal, revenueAverage, and expenseAverage has a pleasing symmetry.」と言っている @ Computed-Value Qualifiers in Variable Namesの節
- 長所: vx_avg, vy_avg, vxy_avgはそれぞれユニークな文字列で検索時に混在しない
- 短点: _avg表記と単位表記(例: _cm)などの同時使用時はいかがなものか

スコープの狭いローカル変数の場合、vxAvg_cm_sec (cm/secの意味)の表記でもいいのかもしれない
Reduxの実装



1. [ReduxとReflux](http://qiita.com/DinhDuyThanh/items/90e7876f12c541335a03)
2. [React:ES6/ES7Javascriptを書く](http://qiita.com/DinhDuyThanh/items/23fbd6f02702cb6dff0c)
3. [ES5をES6/ES7にリプレースする](http://qiita.com/DinhDuyThanh/items/0dd214b1bafa753747cb)
4. [Refluxで機能を作る](http://qiita.com/DinhDuyThanh/items/ab974a99e23c77d2dbb6)
5. [[RefluxをReduxにリプレースする] Actions
](http://qiita.com/DinhDuyThanh/items/b98128accd6d05de7bc8)
6. [[RefluxをReduxにリプレースする] Reducers
](http://qiita.com/DinhDuyThanh/items/79a7a973267e32cd8b93)
7. [[RefluxをReduxにリプレースする] Stores
](http://qiita.com/DinhDuyThanh/items/466b1ea78fc68966dc5d)
8. [[RefluxをReduxにリプレースする] View
](http://qiita.com/DinhDuyThanh/items/8ccfc2911e15ab8facf1)
9. [[RefluxをReduxにリプレースする] DevTool
](http://qiita.com/DinhDuyThanh/items/ece2c67f7fb623458efe)
10. [[RefluxをReduxにリプレースする] Mixin
](http://qiita.com/DinhDuyThanh/items/7b27d8bbecff8bafaaff)
11. [[RefluxをReduxにリプレースする] Dispatcher
](http://qiita.com/DinhDuyThanh/items/8551525195839a33780c)
12. [[RefluxをReduxにリプレースする]実行する方法の説明
](#)
React:ES6/ES7Javascriptを書く

#1.セットアップ
**babelify**を使います。

    npm install gulp-util

他のpackage.jsonの中にgulp-utilを追加するとnpm installを使います。

    "babelify": "6.1.2"
#2.gulpファイルの修理
**reactify**代わりに、**babelify**を使います。
以前コード：

    var reactify = require('reactify')
    ...
    var bundle = browserify(path.ENTRY_POINT, {
        extensions: ['.jsx'],
        transform: ['reactify'],
        cache: {},
        packageCache: {}
      });
現在コード：

    var babelify = require('babelify')
    ...
    var bundle = browserify(path.ENTRY_POINT, {
        extensions: ['.jsx'],
        transform: ['babelify'],
        cache: {},
        packageCache: {}
      });
Ext JS の ViewModel で共通の Store を使う

Ext JS の MVVM で ViewModel の stores でストアを定義できます。
Version 4 以前の様に store 下のグローバルなストアは使わない方向です。

しかし、あっちのビューでもこっちのビューでも使われる Store ってありますね。
そんな時には Store クラスを定義しておいて、それを ViewModel で使います。

    Ext.define('MyApp.store.SomeStore', {
        extend: 'Ext.data.Store'.
        alias : 'store.somestore',
        model : 'MyApp.model.SomeModel',
        proxy: {
            type: 'ajax',
            url : 'hoge/fuga.php',
            reader: {
                type: 'json',
                rootProperty: 'data
            }
        }
    });

適当ですがこんな感じの store を定義します。
2行目の alias コンフィグがポイントです。
これを、ViewModel で使うには次のようにします。

    stores : {
        someStore: {
            type: 'somestore'
        }
    }

これで、ViewModel に proxy 定義つきのストア定義を重複して書かなくてもよくなります。
SwipeRefreshLayoutの使い方

SwipeRefreshLayoutを導入してみたので簡単にまとめます。
まずはactivity_main

```xml:activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

//ListViewやGridViewを<android.support.v4.widget.SwipeRefreshLayout>で囲む
    <android.support.v4.widget.SwipeRefreshLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <GridView
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    </android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>
```

上をやるだけでもswipeするとグルグルが出るようになる。
でも、情報更新されないしグルグル止まらない。
MainActivity.javaでそのあたりの設定をする。

```java:MainActivity.java
public class MainActivity extends ActionBarActivity {

    private SwipeRefreshLayout mSwipeRefreshLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        /*この辺でadapterとかGridViewとか通信処理の設定やってる*/

        //SwipeRefreshLayoutとListenerの設定
        mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.refresh);
        mSwipeRefreshLayout.setOnRefreshListener(mOnRefreshListener);
    }

    //swipeでリフレッシュした時の通信処理とグルグルを止める設定を書く
    private SwipeRefreshLayout.OnRefreshListener mOnRefreshListener = new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
           　
　　　　　　　　/*リフレッシュした時の通信処理を書く*/

　　　　　　　　//setRefreshing(false)でグルグル終了できる
　　　　　　　　mSwipeRefreshLayout.setRefreshing(false);
        }
    };
```
bitbucket用に公開鍵を作る

### bitbucket用に公開鍵作っときます

名前は別になんでもOK

```
$ ssh-keygen -f ~/.ssh/id_rsa_bitbucket
```

### ssh設定

.ssh/configを設定

```
$ vim ~/.ssh/config

==== 下記を追加 ====

Host bitbucket.org
  User git 
  HostName bitbucket.org
  IdentityFile ~/.ssh/id_rsa_bitbucket
  IdentitiesOnly yes

```

### bitbucketに公開鍵を追加する

* [bitbucket](https://bitbucket.org/)にアクセスしてログイン
* 画面右上の人型のアイコンをクリック

![my account.png](https://qiita-image-store.s3.amazonaws.com/0/23276/9a82ea56-b626-3994-63d1-de3d86e26f44.png)

* 画面左側のメニューの `SSH　keys` を選択

![ssh keys.png](https://qiita-image-store.s3.amazonaws.com/0/23276/f6650cfb-89f5-6afc-5b62-5217e8619041.png)

＊ `Add Key` というボタンを押下して登録する

![スクリーンショット 2016-09-13 08.33.21.png](https://qiita-image-store.s3.amazonaws.com/0/23276/c3c7e0c0-4ee1-c3ee-6559-472ac36977a4.png)

＊ Labelには、どのサーバのどのユーザのSSHKeyかが分かるようにしとけばOKです
＊ Keyの所に、↓の公開鍵の内容をコピペします

```
$ cat ~/.ssh/id_rsa_bitbucket.pub
```

### 接続出来るかテスト

```
ssh -T git@bitbucket.org

下記が出ればOK

Are you sure you want to continue connecting (yes/no)? yes
logged in as ｛ユーザ名｝.

You can use git or hg to connect to Bitbucket. Shell access is disabled.
```
Slackの Ctrl+k でQuickSwicherを起動させない

SlackのQuickSwicher便利ですか?
`Ctrl`+`k`で開くのですが、チャネル数がそこまでないチームに所属している身としてはあまり恩恵にあずかれていないというか、
そんなことよりブラウザ(Firefox)の検索バーへのショートカットと被っていて、これが使えなくなることへのストレスの方がすごいわけです。

加えて僕の場合、検索バーに入力してエンター → 別タブで検索結果表示 → 検索バーの中身クリア みたいな感じにしているので、これが使えなくなると死活問題なんですよね。

で本題ですが、`Preferences` > `Advanced Options` > `Other Options` に `Ctrl + S starts the quick swicher` てのがあるのでそのチェックを外すだけです。
その下の説明にも書いてありますね、「ブラウザの挙動を上書きしますよ」って。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/111100/adb6860a-1447-bbef-f01f-f7417ddbc517.png)

これで従来通り検索バーが使えますね!
ただ、この場合どうやってQuickSwicherを開くのかは今のところ不明です。
デスクトップ版を使えって? …ぐぬぬ。
ビルトインサーバーで動かすSymfony2に外からアクセス 

Symfony2 で開発していると、普通ビルトインサーバー使いますよね。

    php app/console server:start

あるとき、iPad からテストしたくなったんです。
で、開発マシンのIPを調べてアクセスしてみると、見事に繋がりません。

    http://192.168.0.x:8000

外からのアクセスに対応するには、ビルトインサーバー起動時に次のように指定します。

    php app/console server:start 0.0.0.0:8000

簡単なことですが、知らなかったら死ぬまで繋がりません。
結構長いことハマりましたｗ
awk

「芸」というほどのものでもないですが・・・笑

# 前提
awk --version
GNU Awk 3.X.X


# やりたいこと
csvファイル5列目にあるタイムスタンプを、yyyyMMdd形式に変更する。

"2016-04-01 00:00:00"
↓
"20160401"


# 方針
方針としては、
・"-"を取り除く
・最初から8文字取る


# 全フィールドに適用したいとき
```bash:
awk -F',' '{gsub("-", ""); $5 = substr($5, 0, 8); print $0}' sample.csv
```


# 特定のフィールドのみ適用したいとき
```bash:
awk -F',' '{gsub("-", "", $5); $5 = substr($5, 0, 8); print $0}' sample.csv
```
ttyコマンドは標準入力のデバイスを表示するコマンド

タイトルの通り、Linuxのttyコマンドは標準入力のデバイスを表示するコマンドです。現在の標準入出力のデバイスではなく、**標準入力**のみを表示します。マニュアルには次のように書いてあります。

> tty - print the file name of the terminal connected to standard input

それでも疑う人へ
----------------
標準入力の2つのターミナル（それぞれ `/dev/tty1`, `/dev/tty2` とします）を開いて次のことを試してみてください。まず`/dev/tty1` 側で次のコマンドを実行します。

```sh
tty    # @/dev/tty1
```

```txt:実行結果
/dev/tty1
```

表示されるのは期待した、`/dev/tty1` です。

では次のはどうでしょう。

```sh
tty </dev/tty2    # @/dev/tty1
```

```txt:実行結果
/dev/tty2
```

表示されたのは `/dev/tty2` でした。標準入力をリダイレクトで切り替えたので、`tty` は切り替え後のデバイスが表示されました。最後に次のコマンドを実行してみます。

```sh
tty </dev/null    # @/dev/tty1
```

```実行結果
not a tty
```
Meteor が妙に重いとき


Meteor が、妙に重い。常時ファンが回っていてパソコン本体が熱を帯びている。
Mac のアクティビティモニタでみると、CPU使用率が100％を超えている。

そんなあなた、

$ npm start 

していませんか？

そうじゃなくって、

$ meteor npm start

すると、CPU使用率が1桁台（起動時のコンパイル時間は除く）に改善されるケースがありますよ。

生でインストールされている npm と、Meteor が持っている npm のバージョン不整合などが原因じゃないかなと思われます。

package.json が

```
  "scripts": {
    "start": "meteor run"
  }
```

こんなかんじになっているときのことです。