2013-12-25

【PHP】マニュアルのShift_JIS変換と整形・容量削減について

PHPの関数・言語マニュアルはWindows用のCHMファイル形式でも配布されていますが、このファイルがまったくの役立たずです。
ダウンロードしただけでは、中のヘルプHTML内容を見ることすらできないものなのです。

そこで、HTML Help Workshopというソフトで一度CHMファイルをバラして修正する必要があります。
2つのファイル名を変更するくらいならば手でも簡単にできますが、すべてのファイル(2013-12現在1万3千ファイル程度あります)の文字コードとメタタグ変更を手でやるのは時間の無駄なので、これを一気に行えるプログラムを作ってみました。
ただ、自分の環境ではうまくいっただけなので、注意して使ってくださいね。


 define( 'DEST_PATH', 'HTML Help WorkshopでデコンパイルしたHTMLファイルのディレクトリパス' );
 
 $d = dir( DEST_PATH );
 
 $i = 0;
 while( false != ($entry = $d->read()) ) {
  
  if( substr_count( $entry, '.html' ) > 0 ) {
   
   $get_file_path = DEST_PATH . $entry;
   
   $contents = file_get_contents( $get_file_path );
   print( '[' . $get_file_path . "] has input. \r\n" );
   
   $contents = mb_convert_encoding( $contents, 'sjis-win', 'UTF-8' );
   $contents = preg_replace( '/utf\-8/i', 'Shift_JIS', $contents );
   $contents = preg_replace( '/\"+/i', '"', $contents );
   $contents = preg_replace( '/\s+/i', ' ', $contents );
   
   file_put_contents( $get_file_path, $contents );
   print( '[' . $get_file_path . "] has output. \r\n" );
   
   $i += 1;
  }
 }
 $d->close();
 
 exit();



以上です。

2013-10-21

【テキスト】正規表現パターン作成代行サービス開始!

久しぶりに何かお客様から依頼されてモノを作りたくなったので、ちっちゃいところからやり直そうと言うことで正規表現を作成代行してみようと思います。
あまりにも複雑な正規表現パターン(たとえば、規約どおりのメールアドレスのパターンとか)じゃ無ければ作りますので、良かったらオーダーしてみてください。

→依頼ページ:正規表現についての簡単なものを作成します!

□依頼時の注意点
・料金は一つの依頼につき500円です。
・処理対象テキストデータを送ってもらいます。
 たとえばHTML、Aタグのhref属性を取得したいなら具体的なAタグのテキストを複数ください。
・処理内容の具体的な内容
 たとえば、XMLデータならどのタグの要素が欲しい、とか書いてください。

□依頼してからパターンが納品される日数
・簡単なものなら1日、比較的複雑なもので2~3日程度で納品します。
・パターン個数は基本的に1つの依頼で1つにしようと思っています。

以上です。それでは。

2013-10-05

【青空文庫】青空文庫のXMLをパースしてみた

【青空文庫】青空文庫のXMLをパースしてみた 自分の読書用に青空文庫に掲載してあるXMLをパースしてみたよ。
青空文庫のXMLは仕様通りにキッチリ書いてあるものと、そうでないものがあり、ちょっと苦労した。

以下のクラスは基本的に「大見出し」と「中見出し」で区切って配列にして返すものだけど、面倒な処理は正規表現やexplodeでばっさり切り分けたりしてます。

---
このクラスを使って小説を転載したものは、以下のサイトで読めます。
 ・多賀城[たがのき]小説投稿サイト
良かったら見てくださいませ。
---

/*
*   青空文庫XMLパーサ
*     2013/10/01
*/
class Aozora
{
  const         FROM_ENCODING = 'sjis-win';
  const         TO_ENCODING   = 'UTF-8';
  
  public        $filename;
  public        $title;
  public        $author;
  /*
    本文の階層構造
    
    大見出しがある場合
    bodies = array(
      '大見出し_01' => array( '中見出し_01' => '本文', '中見出し_02' => '本文', ... '中見出し_nn' => '本文' ),
      '大見出し_02' => array( '中見出し_01' => '本文', '中見出し_02' => '本文', ... '中見出し_nn' => '本文' ),
      '大見出し_03' => array( '中見出し_01' => '本文', '中見出し_02' => '本文', ... '中見出し_nn' => '本文' ),
              ...
      '大見出し_nn' => array( '中見出し_01' => '本文', '中見出し_02' => '本文', ... '中見出し_nn' => '本文' ) );
      
    大見出しが無い場合
    bodies = array( '中見出し_01' => '本文', '中見出し_02' => '本文', ... '中見出し_nn' => '本文' );
  */
  public        $bodies;
  public        $infomation;          // 小説情報
  public        $notes;               // 注
  public        $is_omidasi;
  public        $is_tyumidasi;
  
  private       $raw_text;
  private       $main_text;
  private       $biblio;
  
  public function __construct( $filename )
  {
    $this->filename = $filename;
    $this->raw_text = file_get_contents( $this->filename );
    $this->raw_text = mb_convert_encoding( $this->raw_text, self::TO_ENCODING, self::FROM_ENCODING );
    $this->bodies = array();
  }
  
  public function get_title()
  {
    return sprintf( '%s (作者:%s)', $this->title, $this->author );
  }
  
  public function get_bodies()
  {
    return $this->bodies;
  }
  
  /**
    XMLパース本体
  */
  public function parse()
  {
    // 改行を全て消す
    $this->raw_text = preg_replace( '#[\n\r]+#i', '', $this->raw_text );
    $this->raw_text = preg_replace( '#[\s]+#i', ' ', $this->raw_text );
    
    // タイトルと著者を取得する
    $ret = preg_match( '#

(.*?)

#i', $this->raw_text, $temp_text ); $this->title = $this->replace_imgtag( $temp_text[ 1 ] ); $this->title = trim( $this->title ); $ret = preg_match( '#

(.*?)

#i', $this->raw_text, $temp_text ); $this->author = $this->replace_imgtag( $temp_text[ 1 ] ); $this->author = trim( $this->author ); // 付加情報を取得する $ret = preg_match( '#
(.*?)
#i', $this->raw_text, $temp_text ); $this->infomation = $this->remove_htmltag( $temp_text[ 1 ] ); $this->infomation = $this->add_return( $this->infomation ); $this->infomation = trim( $this->infomation ); // 本文を全て取得する $ret = preg_match( '#
(.*)
#i', $this->raw_text, $temp_text ); $this->main_text = trim( $temp_text[ 1 ] ); // 大見出しから切り出し $this->parse_omidasi(); } /* 大見出しがある場合の本文切り出し */ private function parse_omidasi() { if( $this->is_omidasi( $this->main_text ) ) { // 大見出しがある場合 $temp_text = explode( '

', $this->main_text ); foreach( $temp_text AS $temp ) { if( trim( $temp ) == "" ) { continue; } if( !$this->is_omidasi( $temp ) ) { continue; } $ret = preg_match( '#(.*?)

(.*)$#', $temp, $temp_omidasi ); $omidasi = $this->remove_htmltag( $temp_omidasi[ 1 ] ); $omidasi = $this->replace_imgtag( $omidasi ); $omidasi = trim( $omidasi ); $this->bodies[ $omidasi ] = $this->parse_tyumidasi( $temp_omidasi[ 2 ] ); } } else { // 大見出しがない場合 $this->bodies[] = $this->parse_tyumidasi( $this->main_text ); } } /* 中見出しから本文切り出し @param $html 大見出し1つ分のテキスト または 本文全体のテキスト */ private function parse_tyumidasi( $html ) { $tyumidasi_array = array(); if( $this->is_tyumidasi( $html ) ) { $temp_text = explode( '

', $html ); foreach( $temp_text AS $idx => $temp ) { if( trim( $temp ) == "" ) { continue; } if( !$this->is_tyumidasi( $temp ) ) { continue; } $ret = preg_match( '#(.*?)

(.*)$#', $temp, $temp_tyumidasi ); $tyumidasi = $this->remove_htmltag( $temp_tyumidasi[ 1 ] ); $tyumidasi = $this->replace_imgtag( $tyumidasi ); $tyumidasi = trim( $tyumidasi ); $tyumidasi_array[ $tyumidasi ] = $this->remove_htmltag( $temp_tyumidasi[ 2 ] ); $tyumidasi_array[ $tyumidasi ] = $this->replace_imgtag( $tyumidasi_array[ $tyumidasi ] ); $tyumidasi_array[ $tyumidasi ] = $this->add_return( $tyumidasi_array[ $tyumidasi ] ); } } else { $tyumidasi_array[ 1 ] = $this->remove_htmltag( $html ); $tyumidasi_array[ 1 ] = $this->replace_imgtag( $tyumidasi_array[ 1 ] ); $tyumidasi_array[ 1 ] = $this->add_return( $tyumidasi_array[ 1 ] ); } return $tyumidasi_array; } /* 大見出しがあるかどうか */ private function is_omidasi( $html ) { $ret = substr_count( $html, '' ); if( $ret > 0 ) { $this->is_omidasi = true; } else { $this->is_omidasi = false; } return $this->is_omidasi; } /* 中見出しがあるかどうか */ private function is_tyumidasi( $html ) { $ret = substr_count( $html, '' ); if( $ret > 0 ) { $this->is_tyumidasi = true; } else { $this->is_tyumidasi = false; } return $this->is_tyumidasi; } /* 余分なHTMLタグを除去する */ private function remove_htmltag( $text ) { return preg_replace( '#<(?:|/)(?:em|div|span|a|h3|h4|hr)[^>]*>#', '', $text ); } /* 画像タグを置き換える */ private function replace_imgtag( $text ) { return preg_replace( '#]+>#', "$1", $text ); } /* * 改行を元に戻す */ private function add_return( $text ) { return preg_replace( '#]+>#', "\r\n", $text ); } }


以上です。

2013-09-17

【銀の匙視聴記念】帯広市のこと


管理人が小学生の頃、親の転勤により帯広市に4年間ほど住んでました。
帯広市が舞台になっている農業アニメ「銀の匙」を見たので、記念に自分が気に入っている帯広市のことを少し紹介してみます。

※ただ、自分が帯広市に住んでいたのは20年以上前のことなので今と状況が大分違うことをご了承ください。

・Wikiの帯広市

デカイ公園:緑ヶ丘公園
帯広市の中心部近くに広さ50ヘクタール以上の大きさの「緑ヶ丘公園」っていう公園?があります。
とんでもなくでかいので、公園の中の林などにリスが住んでいたりします
自分がすきなのは8ヘクタールほどの面積の何も無い空間である「グリーンパーク」という原っぱですね。400メートルのつながったベンチがあります。
公園の中には動物園と遊園地を合体させたような施設があり、「おびひろ動物園」と呼ばれています。小学生のとき動物の名付け親になったこともありますw
緑ヶ丘公園:http://www.city.obihiro.hokkaido.jp/toshikensetsubu/midorinoka/a_01midorigaoka.html
グリーンパーク:http://www.obihiromap.com/advance.php?code=110260

スピードスケート
帯広市には国際大会が開かれるようなスピードスケートリンクがあったりするので、市全体でスピードスケートが盛んです。
十勝平野にあるので、地面が平らで基本土地が余っているために学校の校庭もデカイ(管理人が通っていた小学校の校庭は1ヘクタールあった)。よって、冬にはスキーじゃなくスピードスケートが体育の授業です。
雪が降ったら、地元のPTAの方やボランティアの方たちが毎日雪の上に放水して手作りのスピードスケートリンクを作ってくれます
児童生徒たちはmyスケート靴を毎日学校にもって行き、体育では習熟度別クラスでのスケート授業、放課後はスケートで遊び足の感覚を無くして帰ってくるという毎日です。

お菓子
帯広市にはお菓子屋さんがいっぱいあって、「六花亭(マルセイバターサンド)」「柳月(三方六:バウムクーヘン)」「クランベリー(スイートポテト)」が有名。
六花亭の喫茶室にはそこでしか食べられないお菓子が売られています。自分は「ひとつ鍋」という求肥が入った最中が好きです。
ちなみにマルセイバターサンドの「マルセイ」とは、帯広の開拓民である依田勉三が結成した会社「晩成社」で作られていたバターのラベルに記されている記章からきています。
六花亭:六花亭
柳月:柳月
クランベリー:クランベリー

帯広農業高校/帯広畜産大学
この二つの学校は道路を挟んで並んで存在しています。
そのどちらも敷地面積がデカく、校舎から実習農場まで行くのに授業に遅刻するレベル。すごいね。
昔、親御さんに連れられて鉢植えを買いに行ったことがあります。

とりあえず以上です。

2013-09-16

【PHPで画像処理】ガンマ補正を行うクラス

自分で撮った写真や画像の明るさを偏向するのに便利なのがガンマ補正なのですが、映像からキャプチャした連続画像などを手で補正するのがダルいわけです。 そこで、ちょこっとPHPで組んでみました。

ちなみにガンマ補正とは、画像の「暗すぎ」とか「明るすぎ」というものを補正するのが目的の画像処理のことです。 Windows用のディスプレイはガンマ補正値が「2.2」となっているそうです。

/*
* ガンマ補正用クラス
*/
class Gamma
{
  private   $image;       // 入力画像リソース
  private   $new_image;   // 出力画像リソース
  private   $size_x;
  private   $size_y;
  
  /**
    コンストラクタ
    @param $image 入力画像のリソース
  */
  public function __construct( $image )
  {
    $this->image      = $image;
    $this->size_x     = imagesx( $this->image );
    $this->size_y     = imagesy( $this->image );
    $this->new_image  = imagecreatetruecolor( $this->size_x, $this->size_y );
  }
  
  /**
    デストラクタ
  */
  public function __destruct()
  {
    imagedestroy( $this->image );
  }

  /**
    変更後の画像リソース取得
    @return 画像リソース
  */
  public function get_image()
  {
    return $this->new_image;
  }
  
  /**
    出力用画像リソースを新しく作成する
  */
  public function renew_image()
  {
    unset( $this->new_image );
    $this->new_image  = imagecreatetruecolor( $this->size_x, $this->size_y );
  }
  
  /**
    ガンマ補正
    @param $gamma ガンマ補正値 ※ 0 < $gamma <= 5
    @return 成功:true 失敗:false
  */
  public function gamma( $gamma )
  {
    if( $gamma < 0 ) {
      return false;
    }
    
    if( $gamma > 5 ) {
      return false;
    }
    
    for( $x = 0 ; $x < $this->size_x ; $x += 1 ) {
      for( $y = 0 ; $y < $this->size_y ; $y += 1 ) {
        $this->culc_gamma( $x, $y, $gamma );
      }
    }
    
    return true;
  }
  
  /*
    ガンマ補正用計算
  */
  private function culc_gamma( $x, $y, $gamma )
  {
    $rgb = imagecolorat( $this->image, $x, $y );
    $r = ($rgb >> 16) & 0xFF;
    $g = ($rgb >> 8) & 0xFF;
    $b = $rgb & 0xFF;
    
    $temp_gamma = 1 / $gamma;
    $r_base     = $r / 255;
    $g_base     = $g / 255;
    $b_base     = $b / 255;
    $nr = (int)floor( 255 * pow( $r_base, $temp_gamma ) );
    $ng = (int)floor( 255 * pow( $g_base, $temp_gamma ) );
    $nb = (int)floor( 255 * pow( $b_base, $temp_gamma ) );
    
    $nrgb = imagecolorexact( $this->image, $nr, $ng, $nb );
    imagesetpixel( $this->new_image, $x, $y, $nrgb );
  }
}


ちなみに、以下にプログラムを使って編集した画像を載せてみます。
1枚目が元画像、2枚目が補正値0.5のもの(暗くしたもの)、3枚目が補正値2.0のもの(明るくしたもの)です。




2013-05-17

【周期表】化学で使う周期表暗記用シート作ってみた


とりあえず、水素からクリプトンまでの36個の元素を書込めるようにした暗記用シートを作ってみたよ。
いまさら「すいへいりーべ」とか唱えても仕方が無いので、このシートを1日1回やるだけで1週間か2週間で全部暗記できるはず。というか自分は出来ましたw

シートは3種類で、
 1)元素記号を記入するもの
 2)元素名を記入するもの
 3)元素記号&元素名を記入するもの
となっています。

「元素記号&元素名を記入するもの」は他の2枚が完璧になった時点でやってもOKです。
下のリンクからダウンロードしてくださいね。

周期表暗記用シート(PDF)


それでは。

2013-03-24

【起業】「低費用個人事業開業マニュアル完全版」サイト完成!


6年くらい個人事業で生計を立てているのですが、今回それらをまとめなおすことでこれから起業やショップ開店を行おうとしている方の役に立てればいいと思い、ちょっとサイト作ってみました。

低費用個人事業開業マニュアル完全版

内容はネットショップを開店するに当たって必要なことを順を追って説明しています。
具体的には

1)商品の開発
2)個人事業開業に必要な手続き
3)ネットショップの基本的知識
4)ネットショップの作成
5)ネットショップの運営

という構成になっています。

ショップ立ち上げにお金をかけてしまうとその後が続かなくなってしまうので、なるべく安価に開店までこぎつけられるように利用するサービスの価格を考えて掲載しています。

このサイトに載っているサービスは基本的にサービス1つ当たり5千円以下で、多くとも3つ程度のサービスを使えばネットショップを開店できるようになっています。
ですので、合計1万5千円程度が初年度の固定費になります。仕入などにどの程度お金が掛かるかは売る商品によって変わりますからなんともいえませんが。

でも、本物のお店を開くことは下手をすると数千万円掛かることを考えると、商売の初心者でも手を出していきやすく、しかも失敗してもお小遣いの範囲内くらいの損害しか出ないところがミソですね。

それでは。

ZenBack

WebMoney ぷちカンパ