perlスライス

perlのスライスってわかりづらいよね。

use strict;
use warnings;

use Test::More;

my %hash = ( key1 => 'val1', key2 => 'val2' );

# スライス
my ( $a, $b ) = @hash{qw/key1 key2/};
is $a, 'val1', 'val1';
is $b, 'val2', 'val2';

# keysを使っても取れるが、順番はランダム
my ( $a1, $b1 ) = @hash{ keys %hash };
is_deeply + { $a1 => 1, $b1 => 1 }, +{ 'val1' => 1, 'val2' => 1 }, "keys";

# ハッシュリファレンスでも使えます
my $hash = +{ key1 => 'val1', key2 => 'val2' };
my ( $a2, $b2 ) = @$hash{qw/key1 key2/};
is $a2, 'val1', 'hash ref val1';
is $b2, 'val2', 'hash ref val2';

# マージにも使えますね
my $hash1 = +{ key1 => 'val1', key2 => 'val2' };
my $hash2 = +{ key3 => 'val3', key4 => 'val4' };
my $ret = +{
key1 => 'val1',
key2 => 'val2',
key3 => 'val3',
key4 => 'val4',
};

@$hash2{ keys %$hash1 } = @$hash1{ keys %$hash1 };
is_deeply $hash2, $ret, 'merge';

# 単純なマージならこれでもできます
my $hash3 = +{ %$hash2, %$hash1 };
is_deeply $hash3, $ret, 'merge2';

done_testing;

vimのシンタックスハイライト

vimを使ってテンプレートエンジンを編集するときに、
色が出ないよーってことでいろいろ設定してみました。

ここからファイル(tt2.tar.gz)をダウンロード
http://www.vim.org/scripts/script.php?script_id=830

~/.vim/syntax/を作る(なければ)

ダウンロードしたファイル(tt2.vim,tt2html.vim)をコピーする

シンタックスハイライトを設定する
au BufNewFile,BufRead *.mt setf tt2html

mysqldumpでバックアップ

mysqldumpを使ってmysqlのバックアップをとる

ただピンポイントでやりたい場合、既にあるSQLにちょっと追加したい場合など、
lvやlessでコピペしたい

mysqldump -uroot data-base-name

いろいろなperlを持っているPCの実行

scriptの先頭に#!/usr/bin/perl ってかかれてるのに(shebang 行というらしい)、
実際にはperlbrewでいれたperl~/perl5/...にあるやつを使いたい。

#!/usr/bin/env perl


これで大丈夫。

perlで同じようなメソッドを楽に定義する

同じような処理をする似たようなメソッドはfor文使って楽しちゃいましょう。

例えば、
sub debug {
my ($self, @args) = @_;
$self->log->debug(@args);
}
sub info {
my ($self, @args) = @_;
$self->log->info(@args);
}
sub warn {
my ($self, @args) = @_;
$self->log->warn(@args);
}


こんなやつはこんな感じでやっつけちゃいましょ。

for my $name (qw/debug info warn/) {
no strict 'refs';
*{$name} = sub {
my ($self, @args) = @_;
$self->log->$name(@atgs);
}
}

DBIモジュール

DBIモジュールに付いて調べる


1レコードづつ取得する


selectrow_array => 配列


my @ret = $dbh->selectrow_array(
'select user_id, reg_date, nickname from user_data');
is_deeply \@ret, [ 10001, 1297573789, 'はるく' ];


selectrow_arrayref => 配列リファレンス

my $ret = $dbh->selectrow_arrayref(
'select user_id, reg_date, nickname from user_data');
is_deeply $ret, [ 10001, 1297573789, 'はるく' ];


selectrow_arrayref => ハッシュリファレンス

my $ret = $dbh->selectrow_arrayref(
'select user_id, reg_date, nickname from user_data');
is_deeply $ret, +{ user_id => 10001, reg_date => 1297573789, nickname => 'はるく' };


複数レコード取得

selectall_arrayref => 配列リファレンス

my $ret = $dbh->selectall_arrayref('select user_id, reg_date, nickname from user_data');
is_deeply $ret, [[10001, 1234567, 'はるく'], [10002, 1234567, 'ひかり']];



selectall_arrayref (Slice[]) => 配列リファレンス

my $ret = $dbh->selectall_arrayref('select user_id, reg_date, nickname from user_data', +{ Slice => []});
is_deeply $ret, [[10001, 1234567, 'はるく'], [10002, 1234567, 'ひかり']];


selectall_arrayref (Slice+{}) => ハッシュリファレンス

my $ret = $dbh->selectall_arrayref('select user_id, reg_date, nickname from user_data', +{ Slice => +{}});
is_deeply $ret, [ +{ user_id => 10001, reg_date => 1234567, nickname => 'はるく'}, ... ];


selectall_arrayref (Columns) => ハッシュリファレンス

my $ret = $dbh->selectall_arrayref('select user_id, reg_date, nickname from user_data', +{ Columns +{}});
is_deeply $ret, [ +{ user_id => 10001, reg_date => 1234567, nickname => 'はるく'}, ... ];


selectall_hashref => ハッシュリファレンス

my $ret = $dbh->selectall_hashref($sql, 1); # user_idでも一緒
is_deeply $ret => +{
10001 => +{ user_id => 10001, reg_date => 12345, nickname="はるく"},
10002 => +{ user_id => 10002, reg_date => 12346, nickname="ひかり"},
}



my $ret = $dbh->selectall_hashref($sql, [1, 2]); # qw/user_id reg_date/でも一緒
is_deeply $ret => +{
10001 => +{ 12345 => +{ user_id => 10001, reg_date => 12345, nickname="はるく"} },
10002 => +{ 12346 => +{ user_id => 10002, reg_date => 12346, nickname="ひかり"} },
}

vimをより良くするよ

インストールしているもの。

コマンド
Ctrl-w + カーソルのある画面を一行分大きくする
Ctrl-w + カーソルのある画面を一行分小さくする
Ctrl-w > カーソルのある画面を右にー列大きくする
Ctrl-w < カーソルのある画像を左に一列大きくする
Ctrl-w = 画面のサイズを同じにする

プラグイン

補完機能
acp.vim




オートクローズ
autoclose.vim

自動で'"(などを入力shしたときに閉じてくれる



ツリー型ファイルエクスプローラ
opsplorer.vim




タグ
taglist.vim

タグリストを表示

Google Map APIメモ

表示したマップの緯度経度を取得


var myOptions = {
zoom: 14,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

var latlngBounds = map.getBounds();
// 中央
latlngBounds.getCenter();
// 北東端
latlngBounds.getNorthEast();
// 南西端
latlngBounds.getSouthWest();

geohashの調査

位置情報のgeohashについての調査

ある地点(DeNA本社)の位置を基準に周囲の情報を取る場合、
geohashをつかってやろうとすると、

139.689949864418, 35.6832269343074 => xn76fxzjgg85feqxv9h8t


ここまではよいが、geohash特有の先頭x文字だけ使って範囲を絞っていくと、
よく考えればそうだけど、左下範囲が選択されることになる。

xn76fxzjgg 地図上に現れる
http://aligach.net/geohash/geohash_visualizer2.html#xn76fxzjgg,19,500,400

xn76fxz 右側に拡大
http://aligach.net/geohash/geohash_visualizer2.html#xn76fxz,18,500,400

xn76fx 大きく左側に拡大
http://aligach.net/geohash/geohash_visualizer2.html#xn76fx,15,500,400

xn76fx 大きく左側に拡大
http://aligach.net/geohash/geohash_visualizer2.html#xn76fx,15,500,400

これぐらいでいいか

jQuery Mobileをつかう

リンクでページ遷移をする場合、基本ajaxで行ってるみたい。

直接遷移して欲しい時はaタグの場合
rel="external"

を付ける

formタグの場合は
data-ajax="false"

をつける


<a href="/hoge" rel="external">りんく</a>
....
<form action="/hoge" action="post" data-ajax="false">
<input type="submit" value="GO">
</form>


すべてを無効にする場合

1.config.jsを作成

$(document).bind("mobileinit", function(){
$.mobile.ajaxLinksEnabled = false; // Ajax を使用したページ遷移を無効にする
$.mobile.ajaxFormsEnabled = false; // Ajax を使用したフォーム遷移を無効にする
});


2.jqueryの読み込みを見込ませる。
読み込ませる順番も大事 jquery.js => config.js => jquery.mobile.js
<script type="text/javascript" src="/static/js/jquery.1.5.0.min.js"></script>
<script type="text/javascript" src="/static/js/config.js"></script>
<script type="text/javascript" src="/static/js/jquery.mobile-1.0a3.min.js"></script>

google blogの投稿フォーマット

コード引用


<pre style="background: none repeat scroll 0pt 0pt rgb(247, 247, 247); border: 1px solid rgb(215, 215, 215); margin: 1em 1.75em; overflow: auto; padding: 0.25em;">
ココにコードを書く
</pre>


use strict;
use warnings;

sub hoge {
my $args = shift;
}

1;


エスケープ
「&」----&amp;
「>」----&gt;
「<」----&lt;
「"」----&quot:

gitの設定

~/.gitconfigの設定。
このままコピペで大丈夫。

[user]
name = ******
email = ******
[color]
ui = auto
[alias]
co = checkout
st = status
di = diff
br = branch
ci = "commit -a"
[core]
pager = lv -c

iPhoneをMacに接続したときにiPhotoを起動させない

自宅に充電器がないので、充電だけしたいのに、いつもよけいなiPhotoが起動してしまう。

そこで、えいっと消したいんだがiPhotoの設定には見つからず。
じつは「イメージキャプチャ」というものが絡んでいました。

iPhoneを接続した状態で、
「アップリケーション」=>「イメージキャプチャ.app」
を起動すると、左下に「このiPhoneを接続時に開くアプ...」となっているところを「割り当てなし」に選択すると、接続しただけでは表示されません。

べつに変な写真が入ってるわけじゃないからね。

perltidyをインストールしてみた

インストールはいたって簡単

$ cpanm install Perl::Tidy


そうすると、perltidyがインストールされる。

$ which perltidy
/usr/local/bin/perltidy


あとはそれを使い綺麗にしてもらう。

perltidy old_sample.pl -o old_sample.pl


エディターなんかに登録すると、らくちん
~/.vimrcに

map ,ptv :'<,'>! perltidy
map ,pt :%! perltidy

を追加して、
,ptvを入力すると選択している箇所が、
,ptを入力すると、ファイル全体を綺麗にしてくれます。

ついでに~/.perltidyrcも公開

-l=78 # Max line width is 78 cols
-i=4 # Indent level is 4 cols
-ci=4 # Continuation indent is 4 cols
#-b # backup
#-st # Output to STDOUT
-se # Errors to STDERR
-vt=0 # vertical tightness
-cti=0 # Closing Token Placement
-pt=1 # Medium parenthesis tightness
-bt=1 # Medium brace tightness
-sbt=1 # Medium square brace tightness
-bbt=1 # Medium block brace tightness
-nsfs # No space before semicolons
-nolq # Don't outdent long quoted strings
-bbvt=1
-bar
-ce
-nsbl
#-sot
#-lp
# Break before all operators
# -nibc コメントが先頭にくる
# -olc
# -isbc
-wbb="% + - * / x != == >= <= =~ !~ < > | & >= < = **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x="

.bashrcを大公開

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

export PS1="[\u@\h \w]\\$ "
PROMPT_COMMAND='echo -ne "\033]0;$(whoami)@$(hostname):$(pwd)\007"'

# svn
export SVN_EDITOR="vim"
alias svn_diff="svn diff --diff-cmd svn-diff"

# git
source ~/.git-completion.bash

# command
alias exec_vim="/Applications/MacVim.app/Contents/MacOS/MacVim &"

.screenrcを大公開

escape ^Z^Z

bind a title
bind ^u encoding utf8
bind ^j encoding sjis
bind ^e encoding euc-jp

# バッファーサイズ
defscrollback 100000
# vim,lessを閉じたときに画面を元に戻す(on) 戻さない(off)
altscreen off

autodetach on

caption always "%{=r dd} %-w%{=d dd}%n %t%{-}%+w %= %{=r dd}"

screen -t "localhost"

shell bash

term xterm-256color
termcapinfo xterm 'is=^[r^[m^[2J^[H^[?7h^[?1;4;6l'

Mac OSXにhomebrewでmysqlをインストール

どうもrootのパスワードが設定できなくて、2回ぐらいuninstallしましたが、
テーブル定義?(/usr/local/var/mysql/)がのこっていたので、うまくいかず、
まっさらな状態にするとインストールできました

$ brew uninstall mysql
$ rm -r /usr/local/var/mysql

インストール
$ brew install mysql


==> Downloading http://mysql.mirrors.pair.com/Downloads/MySQL-5.1/mysql-5.1.54.tar.gz
[省略]
==> Caveats
Set up databases with:
unset TMPDIR
mysql_install_db

If this is your first install, automatically load on login with:
cp /usr/local/Cellar/mysql/5.1.54/com.mysql.mysqld.plist ~/Library/LaunchAgents
launchctl load -w ~/Library/LaunchAgents/com.mysql.mysqld.plist

If this is an upgrade and you already have the com.mysql.mysqld.plist loaded:
launchctl unload -w ~/Library/LaunchAgents/com.mysql.mysqld.plist
cp /usr/local/Cellar/mysql/5.1.54/com.mysql.mysqld.plist ~/Library/LaunchAgents
launchctl load -w ~/Library/LaunchAgents/com.mysql.mysqld.plist

Note on upgrading:
We overwrite any existing com.mysql.mysqld.plist in ~/Library/LaunchAgents
if we are upgrading because previous versions of this brew created the
plist with a version specific program argument.

Or start manually with:
mysql.server start
==> Summary
/usr/local/Cellar/mysql/5.1.54: 220 files, 45M, built in 8.2 minutes


ひとまずインストール完了

上記のコマンドをそのままやっても良いが、
自動的に起動してほしくないので、
セットアップのみ実行

$ mysql_install_db
$ mysql.server start
$ /usr/local/Cellar/mysql/5.1.54/bin/mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!


In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

[ルートのパスワード設定しますか?]
Set root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!


By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.

[ルート以外のユーザは削除する?]
Remove anonymous users? [Y/n] n
... skipping.

Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.

[リモートからルートのログインする?]
Disallow root login remotely? [Y/n] Y
... Success!

By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.

[テスト用のデータベースは削除する?]
Remove test database and access to it? [Y/n] n
... skipping.

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

[今すぐ設定を反映させる?]
Reload privilege tables now? [Y/n] Y
... Success!

Cleaning up...



All done! If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!

Mac OSX 起動時に実行するアプリケーションの設定方法

Windowsで言うとこのスタートアップ

システム環境設定

アカウント

ログイン項目

"+"を押して追加

memcached の中身を見る

memcachedに接続する方法

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.

statでいろいろな情報を表示(よくわからない・・・。)

$ stat
STAT pid 7692
STAT uptime 19177
STAT time 1297328806
STAT version 1.2.6
STAT pointer_size 32
STAT rusage_user 0.017997
STAT rusage_system 0.058991
STAT curr_items 83
STAT total_items 163
STAT bytes 21606
STAT curr_connections 5
STAT total_connections 500
STAT connection_structures 9
STAT cmd_get 406
STAT cmd_set 163
STAT get_hits 234
STAT get_misses 172
STAT evictions 0
STAT bytes_read 46646
STAT bytes_written 23103
STAT limit_maxbytes 67108864
STAT threads 4
END

コマンド形式は
[]\r\n

取得は
# get hoge
VALUE hoge 0 3
var

設定は
# set hoge 0 5 3
# var
STORED

ちなみに、こっちでも表示することが可能

$ memcached-tool localhost dump

DataStoreの辛いところ

# DataStoreの限界 FacebookやインスタグラムのようなSNSで、投稿、公開範囲、お気に入りなどの機能をDataStoreで実現しようとするとどうしても辛くなる。 ## DataStoreで実現可能? - users - id - feeds - i...