shimxmemo

メモをのこすよ!

dotfiles修正、Neovimとdein.vim導入

備忘録。

 

dotfilesの構成とか

GitHub - k-shogo/dotfiles

 

Neovim、dein.vimについて

neovimが実用段階になったようなのでvimを置き換えてみた話 - 5.1さらうどん

NeoVim、そしてdein.vimへ - Qiita

dein.vimによるプラグイン管理のマイベストプラクティス - Qiita

GitHub - kawaz/dotfiles: いつもの設定

 

vim plugin

Vim pluginへの入門[NeoBundle.vim] - Qiita

 

lightline.vim

作者が教える! lightline.vimの導入・設定方法! 〜 初級編 - インストールしよう - プログラムモグモグ

 

ここまでできないと思うけど。おいおい読む

Vimの生産性を高める12の方法 | 開発手法・プロジェクト管理 | POSTD

6ポートUSB急速充電器が今だけ3割引だぞ!

何かと便利な複数ポートある急速充電器。
iPhoneiPad、さらにはポータブル充電器などいくつも充電しないといけないのに、コンセントは2つ…とか困る事ありますよね。
僕も複数ポートある急速充電器持ってますが、複数台同時に、しかも対応機器によっては通常より早く充電できるので、一度使い始めたら止められません。

そんな急速充電器がアウトレットで今だけ格安(約30%オフ!)で販売されてます!
他社製品より1,000円以上安い…
販売元はスマホ周辺機器に定評のあるマイクロソリューション!

アウトレットと言っても、ケース外装のプリントミスなだけなので性能は正規品と全く変わらず!
なのに約30%オフです!(記事執筆現在)
製品が無くなり次第通常品に戻るそうなのでお早めに!

普段家で使うのも良いですけど、旅先に一つもってくと超便利。
一つのコンセントで皆で充電できるので、コンセントを奪い合う必要なし(笑)
この機会に一つ持ってみては!

詳細はこちら
■ 「特価提供」50W 6ポート USB 自動判別機能搭載・急速充電器 ・(各USBポート出力2.4A / MAX 10A) Color : ホワイト・グレー・ JAN:4560104319867 / PIQ500610WG ケース外装プリントミスによるアウトレット製品無くなり次第通常品に戻ります。

Json.pm+SQL::AbstractでもJSON SQL Injectionは起きるよ

前置き

JSON SQL Injectionが話題になっていますね。

参照)

不正なJSONデータによるSQL Injectionへの対策について (Json.pm+SQLクエリビルダー) — Mobage Developers Blog

Kazuho's Weblog: The JSON SQL Injection Vulnerability
英文にて)

JSON SQL Injection、PHPならJSONなしでもできるよ | 徳丸浩の日記
PHPのお話)

 

今やってる案件ではPerlSQL::Abstractを使っていて、多分同様の事が起こるだろうけど、一応試してみました。

 

環境

$ perl --version
This is perl, v5.8.8 built

$ perl -MSQL::Abstract -e 'print $SQL::Abstract::VERSION . "\n"'
1.60

分かっちゃいるけど古くからの案件だからなあ…

 

結果

やっぱり起きました。

 

確認用コード

はるぷさんの丸パクリだけれども

use strict;
use warnings;

use JSON;
use SQL::Abstract;

#ユーザ入力の取得
my $json      = $ARGV[0] || '';# {"name":"xxxxxx"}のような形式を想定
my $user_name = decode_json($json)->{"name"};

#SQL文の生成
my $builder = SQL::Abstract->new();
my ($sql, @bind) = $builder->select(
    "table_name",
    "*",
    {"name" => $user_name}
);
print "SQL文: ".$sql."\n";
print "変数: ".join(",",@bind)."\n";

で、実行

実行結果
$ perl ./jsonsql_injection.pl '{"name":{"injection" : "hoge"}}'
SQL文: SELECT * FROM table_name WHERE ( name INJECTION ? )
変数: hoge

$ perl ./jsonsql_injection.pl '{"name":["hoge", "fuga"]}'
SQL文: SELECT * FROM table_name WHERE ( ( name = ? OR name = ? ) )
変数: hoge,fuga

ああ…やっぱり。

一般的な1=1とかも簡単にできちゃうよ…。

対策

SQL::Abstractの場合、対策としては、はるぷさんの記事の「対策例2 (型チェック)」か「対策例3 (変換)」になります。

対策例2は省きますが、対策例3を試すと

#実行結果
$ perl ./jsonsql_injection_fix3.pl '{"name":{"injection" : "hoge"}}'
SQL文: SELECT * FROM table_name WHERE ( name = ? )
変数: HASH(0x75fd4e0)

というようになります。

 

まとめ

たとえばですよ、あるプラットフォームが提供している、戻り値がJSONのユーザー情報APIを元に、SQL文を作成、DBから取得した情報を表示しているとします。

ユーザーがWHERE句で使うパラメータに{"injection" : "hoge"}なんてつけてて、それがそのまま渡ってきた日には、それを元にSQL文を作成している所は全滅ですね。

コケるだけならまだしも、他のユーザー情報など本来意図しない情報がごそっと表示されちゃった日には…シャレになりません。

さすがにそのまま{"injection" : "hoge"}なんて形で渡ってくる事はないと信じたいものの、念の為、利用箇所を調査する事をおすすめします。

 

Macのターミナルに彼女を降らせる

ああっ!空から彼女が降ってきた!しかも1,000,000人!

彼女たちは世をはかなみ一斉に空から落ちたのだ。お気に入りの、ニーソックスを履いて…!

某エンジニアの方が彼女降ってこないかなと言ってお仕事頑張っておられたので降らせてみた。

Macのターミナルに彼女を降らせる

demo http://gifzo.net/BCOyp4gQ55R

下記の方が書かれたコードの文字部分いじっただけなんですけどね…

【即買推奨】コンデジの名機!PowerShot S120が9,180円(80%オフ)とありえない値段に!

【追記(2014/4/25 12:00)】

誤表示だったそうです。キャンセルされました。

ただ、発送した段階で契約は成立するとの規約があり、既に発送されていた人は手に入ったそうです。

------------------------------------------------------

【追記(2014/4/18 10:45)】

ブラック・シルバーともに売り切れてました。

ナイトセールだったんですかね。

------------------------------------------------------

 

 

深夜ぼーっとツイッターを見ていたら友人がデジカメを衝動買いしていたのだけど、

Amazonコンデジの名機、PowerShot S120が9,180円(定価5万以上、相場は3万程度)とかありえない値段になってた…

 

f:id:shimx:20140418025707p:plain

え?え?値段間違いじゃないよね?思わず衝動買いした…。

 

これの三世代前のS95を使ってましたがホント優秀で、設定次第で星空なんかも撮れたりする。

 

ウユニ塩原に行った時S95で撮った写真はこんな感じ。

f:id:shimx:20120227155458j:plain

f:id:shimx:20120227180009j:plain

f:id:shimx:20120228044944j:plain

星空も撮れなくはない。

f:id:shimx:20120227214423j:plain

f:id:shimx:20120227230314j:plain

 

いずれにせよ、この値段は破格!売り切れる前に!買うなら今!

 

CentOS 5.8にソースからTokuDB入りMySQLをインストールするよ

何度も諦めそうになりましたよマジで。

 

参照したのは

Bizlog: TokuDB 7.0.1のCommunity EditionをUbuntuでビルド

の後半部分。

ただ、古いバージョンなので今は無いファイルが多かった。

あとは

源码编译安装tokudb的过程 - NoSQL数据库

中国語で死にかけた。

希望大家在安装时别再遇到类似的问题。 

(意訳:インストールで同じような問題が発生した場合、これで解決する事を願うよ!)

に全俺が泣いた!

また、TokuDBの起動確認とかは

CentOS 5.8にコンパイル済みのTokuDB入りMySQLをインストールするよ - shimxmemo

を参照の事。

なぜならこの記事書いてて力尽き(ry

インストール環境

# cat /etc/redhat-release
CentOS release 5.8 (Final)
 
# uname -a
Linux hostname 2.6.18-308.13.1.el5 #1 SMP Tue Aug 21 17:10:18 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux

準備

Documentation, Collateral and White Papers | Tokutek

TokuDB for MySQL 5.5 Users Guide(pdf)

によると必要要件は

Operating Systems: These instructions were tested using CentOS 5.8. They are expected to work with other Linux distributions.

Compiler: These instructions were tested using gcc 4.1.2 and gcc-c++ 4.1.2.

Packages: You will need the following packages installed at the noted revision or later:

•autoconf 2.61

•automake 1.10

•bison 2.3

•ccache 2.4

•cmake 2.6

•libtool 1.5

•ncurses-devel 5.6

readline 5.2

•zlib-devel 1.2

Processor Architecture: TokuDB requires a 64-bit operating system.

とのこと。

あと、mysqlユーザーとか作っておいてね。

参照

CentOS 5.8にcmakeインストール - shimxmemo

valgrindインストール

作業中全然うまくいかなく、色々な事を試したので、もしかしたらいらないかも。

# cd /usr/local/src/
# wget http://valgrind.org/downloads/valgrind-3.9.0.tar.bz2
# tar jxvf valgrind-3.9.0.tar.bz2
# cd valgrind-3.9.0
# ./configure
# make
# sudo make install

インストール手順

ft-engineのダウンロード

# cd /usr/local/src/
# git clone git://github.com/Tokutek/tokudb-engine.git tokudb-engine
# cd tokudb-engine

ちなみに

# scripts/make.mysql.bash usage

で使い方を確認

 

さて、このままだとmake途中でこけるので、ここでインストールスクリプトの修正

第一回スクリプト修正

バックアップ

# cp ./scripts/make.mysql.bash ./scripts/make.mysql.bash.bak
# cp ./scripts/common.sh ./scripts/common.sh.bak
make.mysql.bashの修正
# vi ./scripts/make.mysql.bash

ディレクトリの存在確認ができていない部分を修正

> if [ ! -d $mysql_distro ] ; then
< if [ ! -d $mysql_distro-$mysql_version ] ; then
      github_download Tokutek/$mysql_repo $(git_tree $git_tag $mysql_tree) $mysql_distro-$mysql_version
  fi

ソースを一旦ダウンロードする為にexitを入れる

  if  $mysql_repo =~ mariadb  ||  $mysql_distro =~ ^mariadb  ; then
      github_download Tokutek/jemalloc $(git_tree $git_tag $jemalloc_tree) extra/jemalloc
  elif [ ! -d storage/tokudb/ft-index/third_party/jemalloc ] ; then
      github_download Tokutek/jemalloc $(git_tree $git_tag $jemalloc_tree) storage/tokudb/ft-index/third_party/jemalloc
  fi
< # tmp exit!
< exit;
./scripts/common.shの修正

また、このままだと二回実行するとmkdirでこけるので、存在判定を入れ、ディレクトリが存在しない場合のみmkdirするようにする

vi ./scripts/common.sh
>    mkdir $dest
<    if [ ! -d $dest ] ; then
<        mkdir $dest
<    fi

いよいよインストール作業開始

ソースのダウンロード

パスを通す(今回は/usr/local/gcc-4.7.2/bin/gcc-4.7.2/usr/local/gcc-4.7.2/bin/g++-4.7.2を利用)

# export LD_LIBRARY_PATH=/usr/local/gcc-4.7.2/lib:$LD_LIBRARY_PATH

ソースダウンロード(使うgccの場所を指定する事)

# ./scripts/make.mysql.bash \
--mysqlbuild=mysql-5.5.36-tokudb-7.1.5-linux-x86_64 \
--cc=/usr/local/gcc-4.7.2/bin/gcc-4.7.2 \
--cxx=/usr/local/gcc-4.7.2/bin/g++-4.7.2

第二回スクリプト修正

ダウンロードが正常に完了したら、仕込んでいたexitを消す。

# vi ./scripts/make.mysql.bash
  if  $mysql_repo =~ mariadb  ||  $mysql_distro =~ ^mariadb  ; then
      github_download Tokutek/jemalloc $(git_tree $git_tag $jemalloc_tree) extra/jemalloc
  elif [ ! -d storage/tokudb/ft-index/third_party/jemalloc ] ; then
      github_download Tokutek/jemalloc $(git_tree $git_tag $jemalloc_tree) storage/tokudb/ft-index/third_party/jemalloc
  fi
> # tmp exit!
> exit;

この状態でmakeしてもダメ。今の環境だと、

[ 12%] Completed 'build_jemalloc'
[ 12%] Built target build_jemalloc
make: *** [all] エラー 2

というエラーでこける。

原因としては

  • cmakeコマンドのオプションが足りていない
  • cmakeのテスト内容で使えない引数(-fuse-linker-plugin)がある

という事なので、それぞれ対応していくことに。

cmakeコマンドのオプションが足りていない

function generate_cmake_cmd ()のcmakeコマンド部分を修正する必要がある。

最低限

  • -D WITH_DEBUG=1
  • -D MYSQL_MAINTAINER_MODE:BOOL=OFF

の二つのオプションを追加しないとエラーが出てmakeできない。

また、MySQLインストール時のオプションもここで追加する必要あり。

# vi ./scripts/make.mysql.bash
function generate_cmake_cmd ()
      echo -n CC=$cc CXX=$cxx cmake \
          -D BUILD_CONFIG=mysql_release \
          -D CMAKE_BUILD_TYPE=$cmake_build_type \
          -D CMAKE_TOKUDB_REVISION=$ft_revision \
          -D BUILD_TESTING=OFF \
          -D USE_GTAGS=OFF \
          -D USE_CTAGS=OFF \
          -D USE_ETAGS=OFF \
          -D USE_CSCOPE=OFF

<     # extend for make
<     echo -n " " \
<         -D WITH_DEBUG=1 \
<         -D MYSQL_MAINTAINER_MODE:BOOL=OFF
<
<     # extend mysql(今回最低限必須なオプション)
<     echo -n " " \
<         -D WITH_PLUGINS=all \
<         -D WITH_PARTITION_STORAGE_ENGINE:BOOL=ON
<
<     # extend mysql charaset(移行前のDBがsjisだったので)
<     echo -n " " \
<         -D DEFAULT_CHARSET=sjis \
<         -D DEFAULT_COLLATION=sjis_japanese_ci \
<         -D WITH_EXTRA_CHARSETS=ALL
<
<     # extend mysql dir(インストールするディレクトリやデータディレクトリを変えたい時のみ必要)
<     echo -n " " \
<         -D SYSCONFDIR:PATH=/usr/local/mysqls/mysql_tokudb \
<         -D CMAKE_INSTALL_PREFIX:PATH=/usr/local/mysqls/mysql_tokudb \
<         -D MYSQL_DATADIR:PATH=/usr/local/mysqls/mysql_tokudb/var \
<         -D MYSQL_UNIX_ADDR=/tmp/mysql_tokudb.sock \
<         -D MYSQL_TCP_PORT=30002
cmakeのテスト内容で使えない引数(-fuse-linker-plugin)がある

また、途中のft-indexのコンパイルの際、「-fuse-linker-pluginが無い」と怒られてインストールできないので

# vi /usr/local/src/tokudb-engine/mysql-5.5.36/storage/tokudb/ft-index/cmake_modules/TokuSetupCompiler.cmake
>   set(CMAKE_C_FLAGS_RELEASE "-g -O3 -flto -fuse-linker-plugin ${CMAKE_C_FLAGS_RELEASE} -UNDEBUG")
>   set(CMAKE_CXX_FLAGS_RELEASE "-g -O3 -flto -fuse-linker-plugin ${CMAKE_CXX_FLAGS_RELEASE} -UNDEBUG")
>   set(CMAKE_EXE_LINKER_FLAGS "-g -fuse-linker-plugin ${CMAKE_EXE_LINKER_FLAGS}")
>   set(CMAKE_SHARED_LINKER_FLAGS "-g -fuse-linker-plugin ${CMAKE_SHARED_LINKER_FLAGS}")
< #  set(CMAKE_C_FLAGS_RELEASE "-g -O3 -flto -fuse-linker-plugin ${CMAKE_C_FLAGS_RELEASE} -UNDEBUG")
< #  set(CMAKE_CXX_FLAGS_RELEASE "-g -O3 -flto -fuse-linker-plugin ${CMAKE_CXX_FLAGS_RELEASE} -UNDEBUG")
< #  set(CMAKE_EXE_LINKER_FLAGS "-g -fuse-linker-plugin ${CMAKE_EXE_LINKER_FLAGS}")
< #  set(CMAKE_SHARED_LINKER_FLAGS "-g -fuse-linker-plugin ${CMAKE_SHARED_LINKER_FLAGS}")
<   set(CMAKE_C_FLAGS_RELEASE "-g -O3 -flto ${CMAKE_C_FLAGS_RELEASE} -UNDEBUG")
<   set(CMAKE_CXX_FLAGS_RELEASE "-g -O3 -flto ${CMAKE_CXX_FLAGS_RELEASE} -UNDEBUG")
<   set(CMAKE_EXE_LINKER_FLAGS "-g ${CMAKE_EXE_LINKER_FLAGS}")
<   set(CMAKE_SHARED_LINKER_FLAGS "-g ${CMAKE_SHARED_LINKER_FLAGS}")
# vi /usr/local/src/tokudb-engine/mysql-5.5.36/storage/tokudb/CMakeLists.txt
> SET_PROPERTY(TARGET tokudb APPEND PROPERTY LINK_FLAGS_RELEASE "-flto -fuse-linker-plugin")
< #SET_PROPERTY(TARGET tokudb APPEND PROPERTY LINK_FLAGS_RELEASE "-flto -fuse-linker-plugin")
< SET_PROPERTY(TARGET tokudb APPEND PROPERTY LINK_FLAGS_RELEASE "-flto")

に。

パッケージ作成

再度

# ./scripts/make.mysql.bash \
--mysqlbuild=mysql-5.5.36-tokudb-7.1.5-linux-x86_64 \
--cc=/usr/local/gcc-4.7.2/bin/gcc-4.7.2 \
--cxx=/usr/local/gcc-4.7.2/bin/g++-4.7.2

を実行。

CPack: Create package using TGZ
CPack: Install projects
CPack: - Run preinstall target for: MySQL
CPack: - Install project: MySQL
CPack: Create package
CPack: - package: /usr/local/src/tokudb-engine/mysql-5.5.36/build.RelWithDebInfo/mysql-5.5.36-tokudb-7.1.5-linux-x86_64.tar.gz generated.
/usr/local/src/tokudb-engine/mysql-5.5.36

で成功

/usr/local/src/tokudb-engine/mysql-5.5.36/build.RelWithDebInfo以下にパッケージ化されたものができるので、それを解凍して移動

MySQLセットアップ

デフォルトのディレクトリ(/usr/local/mysql)へセットアップ

解凍と移動

# cd /usr/local/src/tokudb-engine/mysql-5.5.36/build.RelWithDebInfo
# tar zxvf mysql-5.5.36-tokudb-7.1.5-linux-x86_64.tar.gz
# mv ./mysql-5.5.36-tokudb-7.1.5-linux-x86_64 /usr/local/mysql

初期設定と起動

# cd /usr/local/mysql
# cp ./support-files/my-innodb-heavy-4G.cnf ./my.cnf
# vi ./my.cnf
server-idなど必要な記述を

# ./scripts/mysql_install_db \
--user=mysql
# chown -R mysql:mysql .

# ./support-files/mysql.server start
Starting MySQL............ SUCCESS!
デフォルトではないディレクトリ(/usr/local/mysqls/mysql_tokudb)へセットアップ

解凍と移動

# cd /usr/local/src/tokudb-engine/mysql-5.5.36/build.RelWithDebInfo
# tar zxvf mysql-5.5.36-tokudb-7.1.5-linux-x86_64.tar.gz
# mv ./mysql-5.5.36-tokudb-7.1.5-linux-x86_64 /usr/local/mysqls/mysql_tokudb

初期設定と起動

# cd /usr/local/mysqls/mysql_tokudb
# cp ./support-files/my-innodb-heavy-4G.cnf ./my.cnf
# vi ./my.cnf
port番号やserver-idなど必要な記述を

# ./scripts/mysql_install_db \
--basedir=/usr/local/mysqls/mysql_tokudb \
--datadir=/usr/local/mysqls/mysql_tokudb/var \
--user=mysql
# chown -R mysql:mysql .

# ./support-files/mysql.server start
Starting MySQL............ SUCCESS!

デフォルトエンジン変更

# vi ./my.cnf
> default-storage-engine = MYISAM
< default-storage-engine = TokuDB

# ./support-files/mysql.server restart
Shutting down MySQL... SUCCESS!
Starting MySQL... SUCCESS!

確認

# ./bin/mysql
mysql> show variables;
version                                           | 5.5.36-tokudb-7.1.5-debug-log
mysql> show plugins;
| TokuDB                        | ACTIVE   | STORAGE ENGINE     | ha_tokudb.so | GPL     |
| TokuDB_trx                    | ACTIVE   | INFORMATION SCHEMA | ha_tokudb.so | GPL     |
| TokuDB_locks                  | ACTIVE   | INFORMATION SCHEMA | ha_tokudb.so | GPL     |
| TokuDB_lock_waits             | ACTIVE   | INFORMATION SCHEMA | ha_tokudb.so | GPL     |
| TokuDB_file_map               | ACTIVE   | INFORMATION SCHEMA | ha_tokudb.so | GPL     |
| TokuDB_fractal_tree_info      | ACTIVE   | INFORMATION SCHEMA | ha_tokudb.so | GPL     |
| TokuDB_fractal_tree_block_map | ACTIVE   | INFORMATION SCHEMA | ha_tokudb.so | GPL     |

データ作成テスト

mysql> use test;
mysql> CREATE TABLE user ( id int(11) NOT NULL, name varchar(33) NOT NULL );
mysql> SHOW CREATE TABLE user\G;
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `name` varchar(33) NOT NULL
) ENGINE=TokuDB DEFAULT CHARSET=utf8

mysql> insert into user(id, name) values(1,'user1');
mysql> select * from user;
+----+-------+
| id | name  |
+----+-------+
|  1 | user1 |
+----+-------+

という感じ。

途中心折れかけたし、ここまで1週間かかりましたぜ…。

同じような事にはまった人の助けになれば。