月別: 2015年3月

VimでGo言語を書く環境を設定する

概要

Go言語をインストールして実行できる環境を作り、
VimでGo言語を書く設定をしていきます。

Goのインストール

以下のページでバイナリをダウンロードし、ホームディレクトリに設置します。
https://golang.org/dl/

wget https://storage.googleapis.com/golang/go1.3.3.linux-amd64.tar.gz
tar xvzf go1.3.3.linux-amd64.tar.gz
mv go1.3.3.linux-amd64 ~/go

Goパッケージの保存先であるディレクトリを作成します。

mkdir ~/go/packages

.bashrcなどに、以下の環境変数を設定します。

export GOROOT=~/go
export GOPATH=$GOROOT/packages
export PATH=$PATH:$GOROOT/bin

「source ~/.bashrc」で設定を有効にすると、goコマンドが使用できるようになります。

Vimの設定

goコマンドを使用して、以下のパッケージをインストールしておきます。

パッケージ 機能
gocode 入力補完
golint コーディング規約チェック
godef 定義ジャンプ

インストールコマンドは以下のようになります。

go get github.com/nsf/gocode
go get github.com/golang/lint/golint
go get code.google.com/p/rog-go/exp/cmd/godef

Goに対するVimの設定ですが、パッケージに同封されているVim設定ファイルを使用します。
上記の方法でインストールしている場合は、~/go/misc/vimに存在しています。

※現在のGoリポジトリにはmisc/vimは入っていないようです。将来的には少し違う設定になると思います。http://vim-jp.org/blog/2014/09/02/vim-go-extra.html

.vimrcに以下の設定を追記します。

filetype off
filetype plugin indent off
set runtimepath+=$GOROOT/misc/vim
filetype plugin indent on
syntax on
autocmd FileType go autocmd BufWritePre  Fmt
set rtp+=$GOPATH/src/github.com/nsf/gocode/vim
set rtp+=$GOPATH/src/github.com/golang/lint/misc/vim
set completeopt=menu,preview

これで自動補完や自動フォーマットが動作するようになります。

以下、よく使うコマンドを表にしておきます。

コマンド 意味
:Import {コマンド名} importにパッケージ名を追加
:Drop {パッケージ名} importにパッケージ名を削除
:GoDoc {パッケージ名} パッケージのドキュメントを閲覧する
:Godef {定数名/関数名など} 定義ジャンプ

参考

Vimを使ったGo言語開発手法
http://mattn.kaoriya.net/software/vim/20130531000559.htm

Go言語のインストール
http://golang.jp/install

GOPATH は適当に決めて問題ない
http://qiita.com/yuku_t/items/c7ab1b1519825cc2c06f

Go言語の開発環境構築 (Golang + Mac OS X + Vim)
http://note-of-engineer-b.blogspot.jp/2013/12/golang-setup.html

3.14

HTML5のcanvasを使って絵を書いてみました。

モンテカルロ

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Canvasでお絵かき</title>
<script type="text/javascript">
function fig() {
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
context.lineWidth = 2;
// 正方形
context.beginPath();
context.rect(20,20,500,500);
context.stroke();
// 円
context.beginPath();
context.arc(270,270,250,0,2*Math.PI,true);
context.stroke();
}
function dots() {
var canvas    = document.getElementById('canvas');
var context   = canvas.getContext('2d');
for (i = 0; i < 1000; i++) {
var x = Math.random();
var y = Math.random();
if (Math.pow(2 * x - 1, 2) + Math.pow(2 * y - 1, 2) <= 1) {
context.fillStyle = "rgb(255, 0, 0)";
} else {
context.fillStyle = "rgb(0, 0, 255)";
}
context.beginPath();
context.arc(20 + x * 500, 20 + y * 500, 2, 0, 2*Math.PI, true);
context.fill();
}
}
</script>
</head>
<body onLoad="fig()">
<input type="button" value="点を打つ" onclick="dots();"><br>
<canvas width="540" height="540" id="canvas">
</canvas>
</body>
</html>

「点を打つ」ボタンを押すと、dotsメソッドが動いて正方形の中にランダムに点が1000個打たれます。
円の中と外で色分けもしてみました。

ところで、、

3月14日と言えばみなさん何の日かご存知ですよね。
はいそうです。みなさん正解です。円周率の日です。

永遠に続くとかで結婚とかには縁起の良い日みたいですよ!

canvasで書いた上の絵から円周率が求まります(´▽`)

円周率3.14・・・

上の絵で、円の半径をrとして正方形の面積と円の面積の比を計算すると、
比 = 円の面積 / 正方形の面積
  = (π x r x r) / (2r x 2r)
  = π / 4

この比は何を意味するかというと、正方形の中にランダムに点を打って円の中に入る確率に相当します。
だいたい78%くらいですかね。

そうです。赤い点の数を数えて1000で割って4倍すると円周率が求まります。
数えるのは面倒臭いので、プログラムにやらせましょう。
上で書いたJavascriptのdotsメソッドで円の中に入った時に点の数を数えるようにして、最後に計算します。

function dots() {
var canvas    = document.getElementById('canvas');
var context   = canvas.getContext('2d');
for (i = 0; i < 1000; i++) {
var x = Math.random();
var y = Math.random();
→       var in_circle = 0;
if (Math.pow(2 * x - 1, 2) + Math.pow(2 * y - 1, 2) <= 1) {
context.fillStyle = "rgb(255, 0, 0)";
→           incircle += 1;
} else {
context.fillStyle = "rgb(0, 0, 255)";
}
context.beginPath();
context.arc(20 + x * 500, 20 + y * 500, 2, 0, 2*Math.PI, true);
context.fill();
}var pi = 4 * in_circle / 1000;
}

こんな感じです。メチャ簡単!

実行してみましょう!
pi = 3.192
pi = 3.184
pi = 3.116
pi = 3.100
pi = 3.132

精度悪い∑(゚□゚;)

サンプル数を増やしましょう。
だいたい2ケタ増やすと精度が1ケタ良くなるそうです。

例外はきちんと書こう

PHPで、とあるリクエストに対して、xml形式でレスポンスを返すというプログラムを作成していました。

メインPHP

main.php
function main() {
// 1.DBより何か参照してくる
$rs = $child->reference();
// 2.domDocumentを利用し、xml生成する
$dom = new domDocument('1.0', 'UTF-8');
・・・省略・・・
// 3.レスポンス返す
header('Content-Type: application/xhtml+xml');
echo $dom->saveXML();
}

サブPHP

child.php
function reference() {
try {
// selectして結果返す
$rs = $dao->select('table', $columns, $where);
return $rs;
} catch (Exception $e) {
throw $e;
}
}

が期待した動作をせず、、、

Empty reply from server

みたいなエラーが返されてます。空がサーバから返されてる。。!?

何気にapacheのログを参照すると、、

child pid xxxx exit signal Segmentation fault (11)

なるエラーが!?
ググってみるとふむふむ、うーん、参照してはいけないメモリ領域を参照してるみたいで詳細を調査する場合は、コアダンプをはいてみないといけない・・・はい、レベル高いです!!
まだロジックで調べてみることがあるだろうと、気持ちを入れなおし、ごにょごにょ調べていると。。おおっ!SQLがエラーログはいてました!!

2以降の処理は、1からの正常処理しか期待していないロジックを書いていました。
きちんと例外(エラー)のことを考えないといけないですね。
メインPHPを以下のように改善しました。

改善後メインPHP

main.php
function reference() {
// 1.DBより何か参照してくる
$isSuccess = true;
try {
$rs = $child->reference();
} catch (Exception $e) {
$isSuccess = false;
}
// 2.domDocumentを利用し、xml生成する
$dom = new domDocument('1.0', 'UTF-8');
if ($isSuccess) {
// 2-1.正常処理
・・・省略・・・
} else {
// 2-2.例外処理
・・・省略・・・
}
// 3.レスポンス返す
header('Content-Type: application/xhtml+xml');
echo $dom->saveXML();
}

エラーでなくなりました。よかったです!
SQLエラーは仕方ないとして、どうしてSegmentation faultが出力されるのでしょうかね。
XML(DOM?)オブジェクトあたりが怪しい??詳細は不明、、、

例外処理もちゃんと考慮して書くようにしましょう。

【MYSQL】サイズの大きなテーブルに対して素早く属性変更を行う方法

テーブルにインデックスやカラムを追加したりする場合、ALTER TABLE、CREATE INDEXを利用すると思いますが、サイズの大きなテーブルに対して実行する場合、時間がかかり、テーブルもロックされてしまうために、状況によっては安易に実行することはできません。(これらのDDLは、データを全コピーしなおすような仕組みになっているので、時間がかかるようです。)

今回は、この作業を短時間で実行する方法をご紹介したいと思います。
ざっくり言うと、属性追加後のテーブルを新規で作成して、データを流し込み、名称変更で完了です。

1.テーブル「A」に(属性追加など)変更を加えたテーブル「A’」を新規作成

create table A';

2.「A」から「A’」にデータコピー

insert into A' select * from A;

※データ量に応じて、where句で分割挿入するなど工夫が必要

3.「A」を「A_bk」にリネーム

alter table A rename to A_bk;

4.「A’」を「A」にリネーム

alter table A' rename to A;

あとは、コピー元のテーブル「A_bk」を削除すればOKです。

テーブル名称の変更は瞬間で終わりますし、データ量の多いテーブルの属性変更が短時間で行えます。それまでの事前準備(1~3)に時間はかかりますが・・・
ただ、今回の手法では、2に時間がかかりますので、(更新頻度が高い)トランザクション系のテーブルに対して適用するのは難しいと思われます。あくまで、(更新頻度が低い)マスタ系の切り替え時に有効な手法だと思います。

要素の選択について Vol.2

光陰矢の如しとはよく言ったもので、気づけばもう3月…そう”弥生”です。
普段の生活の中で、各月の別名を使うことは少ないと思いますが、皆さん知っておられますか?
自分はこういうの得意です!任せてください!
では、1月から…
あれ…? えーっと… あー… あ!  正月!

さて、気を取り直して、前回の記事に引き続いてjQueryでの要素の選択について書きます。
指定方法は多々ありますので、今回も自分の思うところの指定方法を抜粋して、記事にします。

フィルタを用いたセレクタ指定方法

フィルタと呼ばれる、要素の状態などを判断して指定が行なえます。

<ul class="hoge">
<li>テキスト1</li>
<li>テキスト2</li>
<li>テキスト3</li>
</ul>
<ul>
<li>テキスト4</li>
<li>テキスト5</li>
<li>テキスト6</li>
</ul>

上記のようなコードがあるとして説明していきます。

順序などによるフィルタ

:first :last

最初、最後の指定ができます。

$("ul.hoge li:first").css("color", "#f00")

上記指定で、リスト内の最初の要素(テキスト1)の文字色が赤色になります。

$("ul.hoge li:last").css("color", "#00f")

上記指定で、リスト内の最期の要素(テキスト3)の文字色が青色になります。

:first-child :last-child

“first”、”last”に似た指定方法で”:first-child”、”:last-child”というのもあります。

$("li:first-child").css("color", "#f00")

上記指定で、”各リスト内”の最初の要素(テキスト1とテキスト4)の文字色が赤色になります。

$("li:last-child").css("color", "#00f")

上記指定で、”各リスト内”の最期の要素(テキスト3とテキスト6)の文字色が青色になります。

:even :odd

偶数、奇数を指定できます。

$("li:even").css("color", "#00f")

上記指定で、リスト内の偶数番目の要素(テキスト2)の文字色が青色になります。

$("li:odd").css("color", "#f00")

上記指定で、リスト内の奇数番目の要素(テキスト1とテキスト3)の文字色が赤色になります。

:eq(n)

n番目を指定できます。
注意点として、nは0から始まる番号です。

$("li:eq(2)").css("color", "#f00")

上記指定で、リスト内の3番目の要素(テキスト3)の文字色が赤色になります。

:lt(n)

n番目より前を指定できます。

$("li:lt(3)").css("color", "#f00")

上記指定で、リスト内の3番目より前の要素(テキスト1とテキスト2)の文字色が赤色になります。

:gt(n)

n番目より後を指定できます。

$("li:gt(1)").css("color", "#00f")

上記指定で、リスト内の1番目より後の要素(テキスト2とテキスト3)の文字色が青色になります。

:nth-child(n)

n番目を指定できます。
なお n には番号だけでなく、数式などでも指定可能です。
また、:nth-childでは1から始まる番号になります。

$("li:nth-child(2n+1)").css("color", "#f00")

上記指定で、リスト内の1、3、5…番目の要素(テキスト1とテキスト3)の文字色が赤色になります。

状態などによるフィルタ

:animated

アニメーションしている要素の指定ができます。

$("div:animated").css("background", "#f00")

上記指定で、アニメーションしている要素の背景色が赤色になります。

:visible :hidden

表示、非表示を判断し、要素の指定ができます。

$("div:visible").css("background", "#f00")

上記指定で、表示されている要素の背景色が赤色になります。

$("div:hidden").show()

上記指定で、非表示の要素が表示されます。
※inputのtype=”hidden”の要素も対象です。

:enabled :disabled

利用可能、不可能を判断し、要素の指定ができます。

$("input:enabled").val("YES");

上記指定で、利用可能な要素の値を”YES”に変更します。

$("input:disabled").val("NO");

上記指定で、利用不可能な要素の値を”NO”に変更します。

まとめ

前回と同じくですが、セレクタの指定方法は多々あり、フィルタを用いたセレクタ指定方法を網羅しているわけではありません。
他に、”:checked”、”:selected”などフォーム周りで使えそうな選択状態の要素を指定する方法などもあるようです。
jQueryの本家サイトや日本語翻訳サイトもありますので、さらに詳しくお知りになりたい場合は、そちらをご覧下さい。

後述

記事とは関係ありませんが、冒頭の月の別名については…

  • 1月 – 睦月
  • 2月 – 如月
  • 3月 – 弥生
  • 4月 – 卯月
  • 5月 – 皐月
  • 6月 – 水無月
  • 7月 – 文月
  • 8月 – 葉月
  • 9月 – 長月
  • 10月 – 神無月
  • 11月 – 霜月
  • 12月 – 師走

でした。
恥ずかしくないようちゃんと覚えておこうと思います。

© SEEDS Co.,Ltd.