バブルソート

<?php

$h = array('2','5','3','1');

for($i=0;$i<count($h);$i++){
   for($j=count($h)-1;$j>$i;$j--){
      if($h[$j]<$h[$j-1]){
        $k = $h[$j];
        $h[$j] = $h[$j-1];
        $h[$j-1] = $k;
      }
   }
}

var_dump($h);

一番簡単なソートのアルゴリズム
値を比較して片方が大きかったら入れ替える。
for文で配列の数だけ比較するので、大きな配列だとすごく時間がかかる。
ソートに限らず、アルゴリズムって全然勉強してないからよくわからない。
数学の知識がないから余計にさっぱり。
普通は組み込みのソート関数を使うから、いざ自分で書いてみるとバブルソートくらいしか書けないんだよね。勉強しなきゃ!

shift-jisだと正規表現でマッチしない

ガラケー用のサイトを作ってて、ユーザーの入力文字とDBのデータを正規表現を使ってマッチするかの判定をしてたんだけど特定の文字だけうまくマッチしない。
入力に伸ばし棒(長音符)が入ってるとだめ。ラーメンとか。
なんでかわからなかったんだけど、どうやらShift_JISでの伸ばし棒のコードとASCIIでのコードがかぶってるようだ。

Shift_JIS 815B
ASCII 5B

5Bのところがかぶってる。
他にもゼ、ゾがASCIIコードの一部と同じらしい。
5BはASCIIコードでは"["を表すので、
あ!検索パターンの文字列に正規表現の構文が入ってる!これはだめだ!ってことでうまく動かない。
回避策はpreg_quoteを使用するかstrposで文字の出現位置をみる

preg_match('/'.preg_quote('ラーメン','/').'/', $str)
strpos($str,'ラーメン')

UTF-8に変換してからマッチするか調べてもいいけど、また出力前にShift_JISに変換しなきゃいけないので上記のどっちかがいいと思う。
といってもShift_JISによるSQLインジェクションの問題があるのでShift_JISで作るのはそもそもよくない。

マルチブログ機能で別ブログの記事を表示する

別ブログの記事を表示したいときはMultiBlogプラグインというのを使う。
MT4からは標準でついてるので、システムメニューからMultiBlogというプラグインが入っているか確認する。有効になっていれば読込先のテンプレートにタグを書くだけ。
MultiBlogタグで囲まれた部分で別ブログの記事を読み込む。
あとは通常のテンプレートと書き方は同じ。

<mt:MultiBlog mode="loop"  include_blogs="9">
<MTEntries lastn="1" category="楽しい写真">
<MTEntryAssets>
<img src="<mt:AssetURL>" alt="<MTEntryTitle>" />
</MTEntryAssets>
<p><$MTEntryMore$></p>
</MTEntries>
</mt:MultiBlog>

modeモディファイアは複数のブログ情報をどう表示するかを設定する。loopはブログ単位で表示、contextは全部まとめて表示する。
include_blogsモディファイアにはブログIDを入力して、どのブログを読み込むかを指定する。
コンマ区切りで複数のブログを指定することも可能。
ブログIDはダッシュボードのURLから確認できる。

mt.cgi?__mode=view&_type=entry&blog_id=4

今回は別ブログの続きを読むの部分を表示してるんだけど、
あまりそんなことしないよね。
でもうまく使うと、Aというブログには本文の部分を投稿、Bというブログには続きを読むの部分を投稿という使い方ができる。

マルチブログ機能が利用できるテンプレートタグ
movabletype 「続きを読む」「追記」
他のブログ記事を表示させるMTMultiBlogプラグイン

ヘテムルにwordpressを移行したときのWarning: Cannot modify header information

wordpressをhetemlに移行途中、テーマのファイルをアップロードしてテーマを変更しようとしたら

Warning: Cannot modify header information -- headers already sent by

とエラーが出た。
header関数より先に何かを出力しているときのエラー。
といってもまだ何もしてないので不思議に思い、調べたらphp.iniの設定が原因だった。
Warning: Cannot modify header information…のエラーを解決してみた。

output_buffering = On

として、headerが実行されるまでデータをバッファリングするように変更。
これでheader関数よりも先に出力されることがなくなる。

cssプロパティのメモ

・box-sizing
ボックスのサイズに関するプロパティ。要素にborder、paddingを指定するとその幅と高さにはborder、paddingの値が追加される。widthが300pxでborderが5pxならwidthは310pxになるという例のあれ。
このプロパティでそれを変更できる。

border-box 幅と高さにborder、paddingを含む
content-box 幅と高さにborder、paddingを含めない

・text-transform
テキストに関するプロパティ。大文字・小文字の表記を指定する。

capitalize 単語の先頭文字を大文字で表示する
lowercase すべてを小文字で表示する
uppercase すべてを大文字で表示する

・max-width/min-width
横幅の最大値、最小値をpxや%で指定する。

webサイトの高速化

webサイト高速化の方法をまとめた。制作者やクライアント側でできることのみに絞って調べたので、サーバ側についてはまた別の機会にまとめる。以下は実際に自分で計測したわけではなくて、確実に早くなると言えるわけではないけど知識として知っておくと役立つかもしれない内容。環境によって効果が出たり出なかったりすると思う。

・画像の数を減らすか使わない
CSS spriteで複数画像をまとめてサーバへのリクエスト回数を減らすか、CSSで装飾する。画像を使うなら圧縮してファイルサイズを減らす。

・ファイルの外部化
CSS、JSはhtml内に直接書くのではなく、別ファイルにして読み込んで使う。外部化されたファイルはブラウザでキャッシュされるので二回目以降はキャッシュされたものが使われる。

・不必要なものを削除
JavaScriptとCSSを圧縮・軽量化するオンラインツール集を使うなどして改行や空白などの不要なものを削除する。でもメンテナンスが難しくなるのでメンテナンス方法を考えないといけない。

・キャッシュ
キャッシュマニフェストファイルでブラウザのキャッシュを制御してどのファイルをキャッシュするかを明示する。どちらかというとモバイル向け?対応していないブラウザもあるけどWebKitブラウザなら大丈夫。キャッシュの問題点は内容が更新されていないけどなんで?と社内外から問い合わせがくること。

・JSファイルの読み込み、実行のタイミング
JSの解析でページの読み込みが止まるのを防ぐために</body>タグの直前で読み込む。もしくは非同期で読み込むライブラリを使う。自分でやるならdocumentの読み込みが完了したら<script>タグを動的に生成して読み込む。

・CDNから読み込む
うまく説明できないけど、データ配信に最適化されたネットワークからデータを読み込むと無駄な通信時間が発生しない。googleが各種ライブラリをホストしてるのでそこから読み込むといいよ。

・ライブラリの性能
同じライブラリでも書き方によっては処理にかかる時間が違う。jQueryの場合だとこうらしい。いろいろ抽象化しすぎて結局はプレーンなJSが一番いい、ということもある。

CSSセレクタの書き方
セレクタは右から左に解析されるらしいので、余計なセレクタは書かずに極力短くする。

いろいろあるけど、高速化はサーバとの通信回数とデータ転送量を減らすことだと思うので、画像の削減やキャッシュは効果的!あとはfacebooktwitterプラグインを読み込むとやっぱり遅くなるからあまりいろいろ置かないほうがいい。

参考:
Web ページを高速化する

ubuntuのショートカット

ubuntuのショートカットで便利なものがあったのでメモ。ちゃんと調べたことがなかったけどすごく便利なのがいっぱいあった。これはいいと思うものをピックアップ。ここに載せてる他にもいろいろあるので調べてみるとおすすめ。SuperはWindowsキーを指すよ!

■Launcher

コマンド 機能
Super(押したまま) ショートカット一覧を表示
Super+T ゴミ箱を開く

■Dash

コマンド 機能
Super(一度押す) Dashホームを開く
Super+A アプリケーション一覧を表示
Super+F ファイルとフォルダの検索
Super+M 音楽ファイルの検索
Super+V 動画ファイルの検索

■切り替え

コマンド 機能
Alt+Tab アプリケーション切り替え

ワークスペース

コマンド 機能
Super+S ワークスペースを並べる
Ctrl+Alt+矢印キー ワークスペース切り替え

■ウインドウ

コマンド 機能
Super+W ワークスペース内のウインドウを並べる
Ctrl+Super+D すべてのウインドウの最小化
Ctrl+Super+↑ 現在のウインドウの最大化
Ctrl+Super+↓ 現在のウインドウの最小化または復元
Alt+F4 現在のウインドウを閉じる
Ctrl+Super+← ウインドウを左に寄せる
Ctrl+Super+→ ウインドウを右に寄せる
Alt+F4 現在のウインドウを閉じる

スクリーンショット

コマンド 機能
Alt+Print Screen アプリケーションのスクリーンショットを撮る
Ctrl+Alt+Print Screen アプリケーションのスクリーンショットクリップボードにコピーする
Ctrl+Print Screen スクリーンショットクリップボードにコピーする
Shift+Print Screen 選択した部分のスクリーンショットを撮る
Ctrl+Shift+Print Screen 選択した部分のスクリーンショットクリップボードにコピーする

■その他

コマンド 機能
Ctrl+Alt+Delete ログアウトする
Ctrl+Alt+T ターミナル起動

参考:
Ubuntu 12.04 LTS で使えるキーボードショートカット一覧