Home > 技術

技術 Archive

Safariのズーム機能でposition:absolute;したボックスの中身がズレる

Mac版のSafari、多分Chromeも同様だと思うんですが
position:absoute;でtopとかleftとかで位置指定をする事もありますよね。

普通に指定して普通に見ている分には問題無いのですが、
ブラウザのズーム機能を使うとおかしな事が……

ズレる……ズレるんです。
これはまいった。em指定にしても変わらず…

今回はそんなときの対策。

全文を読む

wordpressのウィジェット複数指定をする時に使える良い感じの書き方

以前、Wordpressのウィジェットを複数にしたテーマ作成について(の正しい情報)というエントリを書いたわけだが、似たようなことをまた仕事でやっていて気づいたことなどをメモ。
簡単に言うと、PHPには配列…というよりハッシュの加算を使うと、同じキーに対する値が…上書き…されない。という仕様がある。
これを使って、共通の部分は別の配列に書いておいて、それと足し合わせることで記述を減らせるって訳です。
ややよろしくない仕様のような気がするけど、まぁソース見てくださいな。

全文を読む

SimplePieにjugemのフィードを入れるとバグる事への対策

PHPでFeedをいじる時に便利なSimplePieというライブラリがあります。
商用OKなライセンスなので仕事で扱うときに重宝しているんですが、ちょっと困ったことがありました。
jugemのブログ…結構使ってる人多いですよね。これをパースさせると、上手く行かないんです。
なんでかなーと色々調べていくうちに、どうやらURLのノーマライズをするメソッドでjugemサーバー的に都合の悪い変換をしてしまう様でした。

今回の案件では、このノーマライズをすっ飛ばすことで解決しました。
具体的には
9362行目

function normalize_url($url){

の直下に

return $url;

を入れるだけです。

需要あんのかなぁこの記事。。。と思いつつメモ

Mac OSX 上のrubygemでインストールしたライブラリがrequireできない

最近rubyをいじってみたりしているんですが、ちょっと困ったことが発生し、対策できたのでメモ。

sudo gem install narray

みたいな感じでインストール…

require 'narray'

……あれ、動かない。
何か

NN63.rb:1:in `require': no such file to load -- narray (LoadError) from NN63.rb:1

って言われる…
irbで試すと……上手く行く………

結局、rubyファイル先頭に

require 'rubygems'

と書くと解決するみたいです。

PHPのforeachが Invalid argument supplied for foreach() 出しまくりの対策

今、SimplePieとかを使ったWordpressプラグインを書いているんだけど…

何か意味不明なエラーが発生。

Invalid argument supplied for foreach()

って出るんだけど
print_rするとちゃんと配列になってる。
で、良くわかんないし良くわかんないし良くわかんないので
別の変数に対象の配列を代入(というかPHPの場合コピー)してみると、上手く行った。

全文を読む

MySQLで先頭の文字を切り出す方法

PHPでいう(mb_)strlenをMySQLで行う方法を見つけたのでメモ。

CAST()という型変換関数を用います。

SELECT CAST(NAME AS CHAR(10) ) FROM MEMBERS

こんなかんじ。

工シス無線LANに楽に入れるブックマークレットを書いた

<pre>javascript:(function(){document.getElementsByName("userid").item(0).value="YOURUSERNAME";document.getElementsByName("password").item(0).value=String.fromCharCode(YOURPASSWORD_CHAR_CODE);document.getElementsByTagName("form").item(0).submit();}())</pre>

こんなかんじ。ユーザ名とパスワードは自分で、パスワードは平文だと流石にアレなので、CharCodeでやると良いんじゃないかと。

AdiumからISO-2022-JPなIRCサーバーと通信する方法

タイトルのまんまです。

Adiumのベータ版がIRCに対応していて結構優秀なのですが、文字コードの辺りが残念な感じです。ISO-2022-JPサーバに繋ぐと発言は出来るのですが、受信が文字化けします。

ところでIRCには中間サーバー(プロキシサーバー)が色々ありまして、
デーモンがIRCにつなぎ、クライアントはデーモンをIRCサーバーに見立てて繋ぐ、という事ができるみたいです。

と言うわけで今回はその中間サーバーであるところのTiarraを使ってAdiumからISO-2022-JPなサーバーに繋いでみました。

ま、基本的にはIRC Proxy Tiarraの使い方というページを見れば良いのですが…ちょっと引っかかった点を列挙しておきます。

  • 文字コードの設定文字列は”iso-2022-jp”と”utf8″、ハイフンの有無がややこしい
  • name:で設定した文字を覚えておいて下さい(ex:2ch
  • separater文字列(標準では@)は適当に変更、僕は<s.e.p>と書きました
  • Adiumからチャンネルに繋ぐときは#チャンネル名セパレータnameです。”#Channel<s.e.p>2ch”みたいな感じ
  • パスワード(cryptedなので生パスじゃないけど)が最初設定されててrejectされるので、忘れずに変更しておきましょう

まーこんなもんです。コメント頂けたらもう少しまともな記事にするかも知れません。

IRCははじめたばっかりでよく分からないので、何かオススメとかあったら教えて下さい。

SimplePieでEUC-JPのフィードを読み込むと化ける

たくさんのRSS/ATOMを解析ーなんてのは、PHPでWebアプリとか作ってると良くある事なのですが、そんなときに便利なのがBSDライセンスで商用利用もOKなFeedパーサ「SimplePie」

大変便利なのですが、なぜかEUC-JPだと文字化けしてしまいました。

どうやらEUC-JPをLatin-1だと思い込んでご丁寧に内部エンコードに変換してくださっているようです。せめてそのままなら扱いやすいのに…これだとmb_detect_encodingしてもUTF-8だと誤解される模様。

試行錯誤の末得た結論は、utf8→Latin1変換の後、文字コード判別の後EUC-JP(等)→utf8変換を行う、というもの。全く持って酷い方法ですが……上手くは行きました。

ソースはこんな感じ。

function mb_convert_utf8($input){
	if(is_array($input)){
		foreach($input as $key=>$value){
			$output[$key] = mb_convert_utf8($value);
		}
		return $output;
	}else{
		if(mb_detect_encoding(utf8_decode($input))=='ASCII'){
			return $input;
		}else{
			return mb_convert_encoding(utf8_decode($input) ,"UTF-8", "ASCII,JIS,EUC-JP,SJIS");
		}
	}
}

※ 僕の書いていたプログラムの都合上、再帰で配列に対応しました。オブジェクトとか渡すとバグると思います。こだわる人は書き足せば良いんじゃないかな。
※ ライセンス?このソースに関しては好きな様にお使いください。権利を行使とかは特にしませんので。

Wordpressのウィジェットを複数にしたテーマ作成について(の正しい情報)

あちこちのブログで間違った事ばかり書いているので混乱させられましたが、結局こうすれば良いと言うのが分かったのでメモ。

トラバ先で大体合ってるんだけど、register_sidebars関数の第一引数についての説明が誤っています。「widget番号」ではなく「widgetの個数」です。なので管理画面に一個多く出てきてしまうんですよね。

・functions.php

if ( function_exists('register_sidebars') ) {
	register_sidebars(2,array(
		'before_widget' => '<div class="widget">',
		'after_widget' => '</div>',
		'before_title' => '<h2 class="header">',
		'after_title' => '</h2>',
	));
}

・sidebar.php(index.phpでも良い)

<?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar(1) ) : ?>
<?php endif; ?>

および

<?php if ( !function_exists('dynamic_sidebar') || !dynamic_sidebar(2) ) : ?>
<?php endif; ?>
if (
function_exists('register_sidebars') ) {
register_sidebars(2,array(
'before_widget' => '<div>',
'after_widget' => '</div>',
'before_title' => '<h2>',
'after_title' => '</h2>',
));

こんな感じです。register_sidebars(2)だとかregister_sidebars関数を二回呼び出してるのとかありますが、違います。
ただし、2つのサイドバーで別々の体裁にしたい場合や名前をきちんとつけたい場合は、register_sidebars関数の第一引数を1にしたのを2回呼ぶのが適当です。その場合のソースはこんな感じ。

if ( function_exists('register_sidebars') ) {
	register_sidebars(1,array(
		'name' => '左サイドバー' ,
		'before_widget' => '<div class="widget1">',
		'after_widget' => '</div>',
		'before_title' => '<h2 class="header">',
		'after_title' => '</h2>',
	));
	register_sidebars(1,array(
		'name' => '右サイドバー' ,
		'before_widget' => '<div class="widget2">',
		'after_widget' => '</div>',
		'before_title' => '<h2 class="header">',
		'after_title' => '</h2>',
	));
}

名前がきちんと出ない時は、functions.phpの文字コードとか確認してみると良いです。

また、3つとか4つとか使う時はregister_sidebars関数の第一引数の数字の合計が使えるウィジェットの数を合わせます。全部同じHTMLで、そのテーマを自分で使うならregister_sidebars(4,…..)と呼び出せば良いですし、配布目的など名前をきちんとつけたいならregister_sidebars(1,array(’name’=>’HOGE’……..))を4回呼び出せば良いでしょう。

http://codex.wordpress.org/WordPress_Widgets_Api/register_sidebars にリファレンスもあるので見ると良いと思います。

ホーム > 技術

Search
Feeds
Meta

Return to page top