MySQL で容量を確認するSQL

データベース毎の容量

SELECT
    table_schema                                         AS "データベース名"
  , FLOOR(SUM(data_length + index_length) / 1024 / 1024) AS "合計容量(MB)"
FROM information_schema.tables
GROUP BY
    table_schema
ORDER BY
    SUM(data_length + index_length) DESC
;

+-----------------------+------------------+
| データベース名        | 合計容量(MB)     |
+-----------------------+------------------+
| xxxxxxxx_xxxxxxxx     |             1995 |
| information_schema    |                0 |
+-----------------------+------------------+

テーブル毎の容量

use DATABASE_NAMEで確認したいデータベースに切り替えた後に実行。

SELECT
    table_name                                        AS "テーブル名"
  , FLOOR((data_length + index_length) / 1024 / 1024) AS "合計容量(MB)"
  , FLOOR((data_length) / 1024 / 1024)                AS "データ容量(MB)"
  , FLOOR((index_length) / 1024 / 1024)               AS "インデックス容量(MB)"
  , table_rows                                        AS "行数"
  , avg_row_length                                    AS "平均行容量"
  , engine                                            AS "ストレージエンジン"
FROM information_schema.tables
WHERE table_schema = database()
ORDER BY
    (data_length + index_length) DESC
;

+-------------------+------------------+---------------------+------------------------------+----------+-----------------+-----------------------------+
| テーブル名        | 合計容量(MB)     | データ容量(MB)      | インデックス容量(MB)         | 行数     | 平均行容量      | ストレージエンジン          |
+-------------------+------------------+---------------------+------------------------------+----------+-----------------+-----------------------------+
| aaa               |             1781 |                1132 |                          649 | 10340935 |             114 | InnoDB                      |
| bbb               |               99 |                  42 |                           56 |   842684 |              52 | InnoDB                      |
| ccc               |               53 |                  50 |                            3 |    97275 |             545 | InnoDB                      |
| ddd               |               48 |                  34 |                           13 |   614400 |              58 | InnoDB                      |
| eee               |               12 |                   5 |                            6 |    84417 |              68 | InnoDB                      |
| fff               |                1 |                   0 |                            0 |     7083 |              53 | InnoDB                      |
| ggg               |                0 |                   0 |                            0 |     2598 |              63 | InnoDB                      |
| hhh               |                0 |                   0 |                            0 |     1543 |              63 | InnoDB                      |
| iii               |                0 |                   0 |                            0 |      233 |              70 | InnoDB                      |
| jjj               |                0 |                   0 |                            0 |      233 |              70 | InnoDB                      |
| kkk               |                0 |                   0 |                            0 |       69 |             237 | InnoDB                      |
| lll               |                0 |                   0 |                            0 |      265 |              61 | InnoDB                      |
| mmm               |                0 |                   0 |                            0 |        1 |           16384 | InnoDB                      |
+-------------------+------------------+---------------------+------------------------------+----------+-----------------+-----------------------------+


UITableViewでStatic Cellでも高さを動的に変える

Dynamic Prototypes の 場合だと結構情報があるんだけど、Static Cell の場合の情報が見つけにくかったので、メモ

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

Dynamic Prototypes の場合も、UITableView.rowHight に対して UITableViewAutomaticDimension を設定するだけなんだけど、AutoLayoutの設定が競合してたりするとうまくいかないので、うまくいかない場合は、AutoLayoutをやり直すのが手っ取り早いです。

UITableViewAutomaticDimension は、iOS8から。

Source: ios – Static UITableView, make a single cell with dynamic height in Swift – Stack Overflow

Vagrant で 別の仮想マシンが立ち上がった場合の修正方法

vagrant upしたら突如、新規の仮想マシンがインストールされてまっさらな状態になってしまい、仮想マシンを作りなおそうかと思ったのですが、解決方法が有りました。

vagrant up で立ち上がる仮想マシンの確認

idに仮想マシンのidが書いてある。

[VAGRANT_HOME]/.vagrant/machines/default/virtualbox/id

VirtualBoxの仮想マシンの確認

{}で囲まれた部分にidが書いてある。

$ VBoxManage list vms
"aaa_default_1415254938" {d861c386-21d2-4728-881d-293f71d24630}
"bbb_default_1416555723" {fe5a7078-bd38-4138-a48b-6fce2b32cf0c}

立ち上げたい仮想マシンのidを、vagrantのidに上書きして、vagrant upすれば無事、立ち上がりました。

WordPress コメント投稿に hook する filter

コメントの投稿に対して、何かしたい時、preprocess_commentをhookします。

例えば文字コードを変更したい場合

function preprocess_comment_conv( $commentdata ) {

  mb_convert_variables( 'UTF-8' , 'EUC-JP' , $commentdata );

  return $commentdata;
}
add_filter( 'preprocess_comment' , 'preprocess_comment_conv' ); 

$commentdata には、コメントや名前等がセットされてパラメーターとして受け取れます。

Source: Plugin API/Filter Reference/preprocess comment « WordPress Codex

BundleUpdate すると error で Update できない

:BundleUpdate

Unknown function: g:shellesc_cd 
...

Vundle を更新すると治るようなので、

$ cd ~/.vim/bundle/vundle/
$ git pull

vimproc_mac.so も再作成

$ cd ~/.vim/bundle/vimproc/
$ make
$ ls -la ~/.vim/bundle/vimproc/autoload/
total 352
drwxr-xr-x  11 suusuke  staff    374  8 13 17:02 .
drwxr-xr-x  20 suusuke  staff    680  8 13 16:56 ..
-rw-r--r--   1 suusuke  staff   4759 12  2  2012 fakepoll.h
-rw-r--r--   1 suusuke  staff  31621  8 13 16:56 proc.c
-rw-r--r--   1 suusuke  staff  33790  8 13 16:56 proc_w32.c
-rw-r--r--   1 suusuke  staff   3240  8 13 16:56 ptytty.c
-rw-r--r--   1 suusuke  staff    247  8 13 16:56 ptytty.h
drwxr-xr-x   7 suusuke  staff    238  8 13 16:56 vimproc
-rw-r--r--   1 suusuke  staff  47258  8 13 16:56 vimproc.vim
-rwxr-xr-x   1 suusuke  staff  28748  8 13 17:02 vimproc_mac.so
-rw-r--r--   1 suusuke  staff   8269  8 13 16:56 vimstack.c

無事、BundleUpdate できるようになりました。

Vagrant で VirtualBox のメモリ数を指定する

データ量の多いサイトだとパフォーマンスが悪くて、仕方がないので、
メモリ数を増やす。

変更前

デフォルトだと、589M割り当てられている。

[vagrant@vagrant-centos65 ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:           589        545         44          0          5         41
-/+ buffers/cache:        497         91
Swap:         1224          7       1217

Vagrantfileにメモリ数を指定

  config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
     vb.memory = "2048"
  end

変更後

[vagrant@vagrant-centos65 ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1877       1194        682          0          9        547
-/+ buffers/cache:        637       1240
Swap:         1224          0       1224

誤差があるが、あとで調べてみよう。

ついでにMySQLのバッファサイズも増やす

[mysqld]

innodb_buffer_pool_size=1024M
innodb_log_file_size=128M

CocoaPods で pod install ができない

久しぶりに、iOSアプリの開発を始めて見たら、CocoaPodsでライブラリーのインストールができない。

/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:245:in `mkdir': Permission denied - /Library/Ruby/Gems/2.0.0/extensions/universal-darwin-14/2.0.0/xcodeproj-0.16.1 (Errno::EACCES)
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:245:in `fu_mkdir'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:219:in `block (2 levels) in mkdir_p'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:217:in `reverse_each'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:217:in `block in mkdir_p'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/fileutils.rb:203:in `each'
....

パーミッションの問題なのかと思って、rootで実行してみたりしたけど、解決できず。
再インストールしたら、できるようになりました。

$ sudo gem uninstall cocoapods
$ sudo gem uninstall xcodeproj
$ sudo gem install xcodeproj
$ sudo gem install cocoapods

PostgreSQL で配列比較する SQL文

テーブルのテキストフィールドでカンマ区切りで、IDを管理するスキーマがあります。
そのテーブルのデータは履歴管理されていて、直前のデータと最新のデータで、カンマ区切りのフィールドが変わったかどうか、SQLで比較したいという事がありました。

しかも、カンマ区切りの順序はバラバラで一意ではないので、ID順に並べ替えて配列で比較する必要がありました。

具体的な例だと

予約履歴テーブルとオプションテーブルがあり、予約履歴テーブルは更新される毎にデータがinsertされ、
optionというフィールドに、オプションテーブルのIDをカンマ区切りで保持しているというケースです。

string_to_arrayでカンマ区切りを配列にする

まずは、optionフィールドをstring_to_arrayでint[]型に変換します。

string_to_array(option ',')::int[]

array_sort_uniqueでソート&ユニークにする

array_sort_unique という関数を定義して、重複する値を取り除き、ソートします。

CREATE OR REPLACE FUNCTION array_sort_unique (ANYARRAY) RETURNS ANYARRAY
LANGUAGE SQL
AS $body$
  SELECT ARRAY(
    SELECT DISTINCT $1[s.i]
    FROM generate_series(array_lower($1,1), array_upper($1,1)) AS s(i)
    ORDER BY 1
  );
$body$;
↓
SELECT array_sort_unique('{1,2,3,2,1}'::int[]);
 array_sort_unique 
-------------------
 {1,2,3}
(1 row)

COALESCEでnullをからの配列に置き換える

COALESCE(option, '{}'::int[])

全て合わせる

COALESCE(array_sort_unique(string_to_array(a.option, ',')::int[]), '{}'::int[]) = COALESCE(array_sort_unique(string_to_array(b.option, ',')::int[]), '{}'::int[])

そもそも、規則正しくoptionが保存されるという保証があればこのような手間は無かったのですが。。。

PHPで配列の行列を入れ替える

配列をテーブルレイアウト用に変えたりする時に、行列入れ替えたいなという事があります。
array_mapを使うと、foreachでループ処理しなくても、入れ替えることができます。


$before[] = array('0', 'aaa', '090-0000-0000');
$before[] = array('1', 'bbb', '090-1111-1111');
$before[] = array('2', 'ccc', '090-2222-2222');



$after = array_map(null, $before[0], before[1], before[2]);