ZARU(ざる)のWeb系ブログですー。プログラミング&デザイン関係のTipsとか色々と。

指定した文字列がないファイルを一括検索する方法

◯◯を含まないテキストファイルをリストアップしたい!

というわけで、例えば「info@example.com」というメールアドレスが記述されていないファイルを見つけたい…ってな場合に、どうすれば簡単にできるかーを調べて模索してみたら、findをgrepを使えば簡単にできることがわかった。

find . -name '*.html' | xargs grep -L 'info@example.com'

これで大丈夫。

grepのオプション「L」は、指定した文字列を含まないファイル名をリストアップしてくれる。findと組み合わせているのは、サブディスプレイ全てを検索対象にするため。findを使わないと、カレントディレクトリのファイルのみが対象になる。

覚えて良かったCSSテクニック

ここ最近、覚えてよかったなーと思ったCSSテクニックをまとめてみる

CSSテクニックは時代とともに変わっていくけれど、ここ1年ほどスタメンレベルで使うCSSテクニックが絞られてきたので、ここらでちょっと個人的にもまとめておこうかと。 Continue Reading..

苗字で占う毎日

占いは色々とあるけれど…苗字でも占いたい!

そんなみなさん、お待たせしました。日本の数ある苗字で占いしてランキングをつける微妙な占いサービス作ったよ。メジャーな苗字はカバーしているけれど、珍しい苗字はないかも…。言ってもらえれば追加しますんで。

あぁ、またしても意味不明なものを作ってしまった…。

PHPでHTMLをパースする

XMLじゃなくて、HTMLを解析したい…。しかもPHPで。

XMLだと、simplexml_load_file()っていう便利な関数がPHP5からあるけれど、HTMLはタグを取り除くぐらいしかない…というわけで、探してみたらHTMLをパースするライブラリがあった。

その名もまんまな、PHP Simple HTML DOM Parser。

使い方

include('simplehtmldom/simple_html_dom.php');
$html = <<<EOM
<ul>
    <li>aaa</li>
    <li>bbb</li>
    <li>ccc</li>
</ul>
EOM;
$data = str_get_html($html);
foreach($data->find('li') as $element){
    echo $element->plaintext;
}
#=>aaabbbccc

//URLやフィある名を指定して取得することも出来。
//その際は、 str_get_html() ではなく file_get_html() 。
$html = file_get_html('http://www.yahoo.co.jp/');

簡単な使い方は上記の通り。サイトにも書いてある通り、jQueryチックな使い方ができるので、以下のようなこともできる。

include('simplehtmldom/simple_html_dom.php');
$html = <<<EOM
<ul>
    <li>aaa</li>
    <li id="hoge">bbb</li>
    <li>ccc<strong>ddd</strong></li>
</ul>
EOM;
$data = str_get_html($html);
foreach($data->find('#hoge') as $element){
    echo $element->plaintext;
}
#=>bbb
foreach($data->find('li strong') as $element){
    echo $element->plaintext;
}
#=>ddd
echo $data->find('li',1)->id;
#=>hoge

データを抜き出すだけではなく、HTMLを書き換えることもできる。

    $html = <<<EOM
<ul>
    <li>aaa</li>
    <li>bbb</li>
    <li>ccc</li>
</ul>
EOM;

    $data = str_get_html($html);
    $data->find('ul',0)->class = 'hoge';
    $data->find('li',2)->innertext = 'piyo';
    echo $data;
#=><ul class="hoge">
#=> <li>aaa</li>
#=> <li>bbb</li>
#=> <li>piyo</li>
#=></ul>

非常に便利なので、色々と使い道がありそう。

PHPで複数の一括置換 str_replace

PHPで複数の一括置換がしたい…

こんなお悩み、普通のPHPerなら悩む必要ないよね。あーあ、なんで今まで気がつかなかったんだろう。アホすぎる。普通にstr_replace() で実現可能じゃないか。置換対象に配列指定可能。

$str = 'iPad欲しい。Xperia欲しい。お金欲しい。';
$search = array('iPad','Xperia','お金');
echo str_replace($search,'彼女',$str);
#=> 彼女欲しい。彼女欲しい。彼女欲しい。
$str = 'iPad欲しい。Xperia欲しい。お金欲しい。';
$search = array('iPad','Xperia','お金');
$replace = array('あれも','これも','もっともっと');
echo str_replace($search,$replace,$str);
#=> あれも欲しい。これも欲しい。もっともっと欲しい。

置換する順序

配列で複数指定した場合の置換する順序は、配列の一番上から。つまり左から右へ。

$str = 'a';
$search = array('a','b','c');
$replace = array('b','c','d');
echo str_replace($search,$replace,$str);
#=> d

買った本:数学ガール/ハイパフォーマンスWebサイト

今日は池袋のジュンク堂へ。

Webアプリケーション関連のテストについての本を買おうと思ったのだけど、なかなか良いのがなくて、結局別のものを買ってしまった。

数学ガール

高校生の数学レベルかな?たぶん。もう昔のこと過ぎて全然追いつけなくて笑える。いや、笑えないけど。数学をもう一度勉強してみようかなーって思っていたので、読みやすくて興味がでてきやすいので、良かった。

ハイパフォーマンス Webサイト

まだ、ぱらぱらっとしか目を通していないけど、サイトを表示する際のパフォーマンスをどのように上げるか、もしくは何がボトルネックになりやすいのかが分かりやすく書かれている。

よくはてブでホットエントリーになっていたりするネタが集まっている感じ。これ、調べてみたら続編も出ているらしい。そっちはジュンク堂のくせに置いていなかったので、中身は分からないけど、気になるなぁ。

CakePHPをPHP5.3で使うとエラーになる時の対処法

PHP5.3だとエラーが色々と…

PHP5.1からPHP5.3へアップデートをすると、CakePHP1.2においてエラーが出てしまったので、その場合の対処法。

Deprecatedエラーが出る

Deprecated: Assigning the return value of new by reference is deprecated in云々なエラー。

  • cake/libs/configure.php (295行目付近)
if (isset($config['debug'])) {
	if ($_this->debug) {
		error_reporting(E_ALL);
		//下記追加
		if (error_reporting() > 6143) {
			error_reporting(E_ALL & ~E_DEPRECATED);
		}
		//ここまで

strtotime()でタイムゾーンのエラーが出る

Warning: strtotime() [http://php.net/function.strtotime]: It is not safe to rely on the system’s timezone settings.というエラー。

  • /etc/php.ini
[Date]
; Defines the default timezone used by the date functions
;date.timezone =
date.timezone =Asia/Tokyo

と、タイムゾーンを設定してやれば大丈夫。

CentOS4.5にPHP5.3をyumを使ってインストールする

古いCentOSに新しいPHPをインストールするには…?

CentOS4.5という微妙に古いバージョンを使っているので、yumでアプリケーションを管理していると最新のものからは程遠いバージョンを使うことが多い。けど、PHPは5.3が使いたい!でもソースからインストールすると面倒くさい。というわけで、yumリポジトリを追加してインストールしよう。

EPEL : yumリポジトリ追加

EPELというRHEL, Centos 向けの拡張パッケージリポジトリがあるので、こいつを追加する。

wget http://download.fedora.redhat.com/pub/epel/4/i386/epel-release-4-9.noarch.rpm
wget http://rpms.famillecollet.com/el4.i386/remi-release-4-5.el4.remi.noarch.rpm
rpm -Uvh remi-release-4*.rpm epel-release-4*.rpm
cd /etc/yum.repos.d
wget http://rpms.famillecollet.com/remi-enterprise.repo
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi

PHPのバージョンをチェック

先ほど追加したリポジトリを有効にしてリストをチェックする

yum --enablerepo=remi list php

php.i386 5.3.2-1.el4.remi

というわけで、無事に5.3が見つかる。

yum --enablerepo=remi update php

これで無事完了。ただし、PHP5.3にアップデートすることで、既存のアプリケーションがエラーになって動かないことがあるので要注意。

WindowsのApache+OpenSSLで、CSRを作成する時に

WindowsのApache+OpenSSLで、CSRを作成しようの回

ちょっとした案件で、Windows2000Serverで稼働しているApache+OpenSSLなサーバでSSLの更新作業をする必要があり、まずはCSRを作らねば、ということでOpenSSLのある場所までコマンドプロンプトで移動。

C:¥>openssl.exe req -new > server.csr

とかやると、なぜか

Unable to load config info from /usr/local/ssl/openssl.cnf

とエラーで怒られる。Windowsなのに、そのパス指示はなんだよ!と思いつつ、仕方がないのでコマンドのヘルプを見たら、openssl.cnfのファイル場所を指定できるらししい。

C:¥>openssl.exe req -new -config openssl.cnf > server.csr

余談

んじゃ、openssl.cnfはどこにあるんだろう?と思って検索してみたら…あれ?なんか出てこない…。なんでなんで?と思って調べていたら、どうやらWindowsでは拡張子「cnf」は短縮ダイヤルのアイコンで表示されるらしい。な、なんだってー?!知らなかったよ。MySQLの設定ファイル「my.cnf」も同様に表示されるっぽい。

しかし、拡張子をすべて表示するっていう設定に指定たんだけどなぁ。エクスプローラ上では「openssl」ってファイル名になっているんだよね。秀丸で開くと「openssl.cnf」ってファイル名だけど。まぁ、いいや。

Ruby プログラミング練習問題3「素数判定」

第3回目のRubyプログラミング練習問題。今回は素数かどうかを調べる。

プログラミング練習問題3「素数判定」

与えられた数が素数かどうか調べる
あるいは与えられた数までの素数を列挙する
処理にかかった時間を計測しておくと、自分の技術向上に伴って処理時間が短くなっていくのがよくわかる

素数とは

素数自体について調べる余地はないと思っていたけど、念のためWikipediaさまを参照してみると1とその数自身以外に正の約数がない(つまり1とその数以外のどんな自然数によっても割り切れない)、1 より大きな自然数のこと。ということだそうで。

とりあえずの回答

じゃあ、指定した数字が素数かどうかを調べるのを書いてみることにする。ぱっと思いついたのはやはり、2から指定した数まで全て列挙して割り算をしていくという力業。というかこれしか思いつかない。ならば簡単…ということで。

#!/usr/bin/ruby

num = ARGV[0]
flag = 0
2.upto(num.to_i - 1) do |i|
    over = num.to_i % i
    puts num + ' / ' + i.to_s + 'の余りは' + over.to_s + "\n"
    if over == 0
        flag = 1
    end
end

if flag == 0
    puts num + 'は素数です'
else
    puts num + 'は素数ではありません'
end

実行結果
$./3_1.rb 5
5 / 2の余りは1
5 / 3の余りは2
5 / 4の余りは1
5は素数です

そもそも素数の判定方法がきちんと考えられていない…気もする。うーん。

まとめサイトに掲載されていた解答例

#!/usr/bin/ruby

require 'mathn.rb'

class PrimePredicater
  def initialize
    @prime = Prime.new
    @cache = []
  end

  def prime?(x)
    extend_cache x if @cache.empty? || x > @cache.last
    @cache.include? x
  end

private
  def extend_cache(lim)
    @prime.each do |x|
      break if x > lim
      @cache.push x
    end
  end
end

#使用例
ppred = PrimePredicater.new
[1, 10, 2, 5, 7].each do |x|
  p ppred.prime?(x)
end

う、うーん?
先生。まったく意味がわかりません。構文自体が謎…。ここら辺はちょっと構文調べてこよう。とりあえずまた次回。