dotfiles修正、Neovimとdein.vim導入
備忘録。
dotfilesの構成とか
Neovim、dein.vimについて
neovimが実用段階になったようなのでvimを置き換えてみた話 - 5.1さらうどん
dein.vimによるプラグイン管理のマイベストプラクティス - Qiita
GitHub - kawaz/dotfiles: いつもの設定
vim plugin
Vim pluginへの入門[NeoBundle.vim] - Qiita
lightline.vim
作者が教える! lightline.vimの導入・設定方法! 〜 初級編 - インストールしよう - プログラムモグモグ
ここまでできないと思うけど。おいおい読む
MacのターミナルにPerlで彼女を降らせる2015
6ポートUSB急速充電器が今だけ3割引だぞ!
何かと便利な複数ポートある急速充電器。
iPhoneとiPad、さらにはポータブル充電器などいくつも充電しないといけないのに、コンセントは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のお話)
今やってる案件ではPerlでSQL::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人!
彼女たちは世をはかなみ一斉に空から落ちたのだ。お気に入りの、ニーソックスを履いて…!
某エンジニアの方が彼女降ってこないかなと言ってお仕事頑張っておられたので降らせてみた。
demo http://gifzo.net/BCOyp4gQ55R
下記の方が書かれたコードの文字部分いじっただけなんですけどね…
Macのターミナルに寿司を降らせる | https://t.co/yA2KL9vfQX
— Kazuhito Hokamura (@hokaccha) 2014, 4月 30
【即買推奨】コンデジの名機!PowerShot S120が9,180円(80%オフ)とありえない値段に!
【追記(2014/4/25 12:00)】
誤表示だったそうです。キャンセルされました。
ただ、発送した段階で契約は成立するとの規約があり、既に発送されていた人は手に入ったそうです。
------------------------------------------------------
【追記(2014/4/18 10:45)】
ブラック・シルバーともに売り切れてました。
ナイトセールだったんですかね。
------------------------------------------------------
深夜ぼーっとツイッターを見ていたら友人がデジカメを衝動買いしていたのだけど、
Amazonでコンデジの名機、PowerShot S120が9,180円(定価5万以上、相場は3万程度)とかありえない値段になってた…
え?え?値段間違いじゃないよね?思わず衝動買いした…。
これの三世代前のS95を使ってましたがホント優秀で、設定次第で星空なんかも撮れたりする。
昔ウユニ塩原に行った時S95で撮った写真はこんな感じ。
星空も撮れなくはない。
いずれにせよ、この値段は破格!売り切れる前に!買うなら今!
CentOS 5.8にソースからTokuDB入りMySQLをインストールするよ
何度も諦めそうになりましたよマジで。
参照したのは
Bizlog: TokuDB 7.0.1のCommunity EditionをUbuntuでビルド
の後半部分。
ただ、古いバージョンなので今は無いファイルが多かった。
あとは
中国語で死にかけた。
希望大家在安装时别再遇到类似的问题。
(意訳:インストールで同じような問題が発生した場合、これで解決する事を願うよ!)
に全俺が泣いた!
また、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週間かかりましたぜ…。
同じような事にはまった人の助けになれば。