PHPでエクセルファイルを読み込む / Excel_PeruserとExcel_Reviser
この私のメモ代わりブログですが
断然下記の記事のアクセスが多いわけです。
PHPでエクセルファイルを読み込む / Spreadsheet_Excel_Reader
でもSpreadsheet_Excel_Reader、日本語扱いが弱くないですか?
たとえば「×」とだけセルに入力するとまったく取り込めなかったり
ダブルクォートとか文中に入ってるとひどいことになったり。
はやく変えなくちゃなーと思いながら遅れ遅れで申し訳ない。
Excelの取り込み、訂正記事です。
茶漬けブログさんが開発されたExcel_PeruserおよびExcel_Reviserが断然お勧めです。
日本語の扱いに関しては今のところこれといった問題は発生していません。
マニュアル、チュートリアルもありますので
下記をどうぞ。
Excel_Peruser
Excel_Reviser
断然下記の記事のアクセスが多いわけです。
PHPでエクセルファイルを読み込む / Spreadsheet_Excel_Reader
でもSpreadsheet_Excel_Reader、日本語扱いが弱くないですか?
たとえば「×」とだけセルに入力するとまったく取り込めなかったり
ダブルクォートとか文中に入ってるとひどいことになったり。
はやく変えなくちゃなーと思いながら遅れ遅れで申し訳ない。
Excelの取り込み、訂正記事です。
茶漬けブログさんが開発されたExcel_PeruserおよびExcel_Reviserが断然お勧めです。
日本語の扱いに関しては今のところこれといった問題は発生していません。
マニュアル、チュートリアルもありますので
下記をどうぞ。
Excel_Peruser
Excel_Reviser
問合せ結果をマージする
こんな結果が欲しい時
1.ドリルとアンケートを一遍に任意のキーワードで検索したい
2.検索結果を作成日時の降順で並び替えたい
ドリルはexamテーブルに
アンケートはenqテーブルに
それぞれ情報があるとして、、、
UNIONで問合せ結果をマージします。
UNIONするには発行するSQLにより取得する結果セットがそれぞれ
・カラム数が同じであること
・対応するカラムの型が変換可能であること
が必要です。
また対応するカラム名は意図して同名にしておくべきでしょう。
関連URL
公式マニュアル UNION句
PostgreSQL 編11 - 問い合わせ、集計、平均、最大、最小、重複、集合、複合
1.ドリルとアンケートを一遍に任意のキーワードで検索したい
2.検索結果を作成日時の降順で並び替えたい
ドリルはexamテーブルに
アンケートはenqテーブルに
それぞれ情報があるとして、、、
select * from
(select title,text,create_date ,'e' as type from exam
union all
select title,text,create_date,'eq' as type from enq) as t1
order by t1.create_date desc
(select title,text,create_date ,'e' as type from exam
union all
select title,text,create_date,'eq' as type from enq) as t1
order by t1.create_date desc
UNIONで問合せ結果をマージします。
UNIONするには発行するSQLにより取得する結果セットがそれぞれ
・カラム数が同じであること
・対応するカラムの型が変換可能であること
が必要です。
また対応するカラム名は意図して同名にしておくべきでしょう。
関連URL
公式マニュアル UNION句
PostgreSQL 編11 - 問い合わせ、集計、平均、最大、最小、重複、集合、複合
GDで透過GIFを扱う(リサイズとか)
PHPからGDを利用し画像のリサイズやファイルタイプ変換を行っています。
が、透過GIFだけ背景が黒くなってしまうという事象が。
Google先生に聞いて調べてみると以下のサイトが引っかかりました。
透過gifだけ背景が黒くなってしまいます。
要するにリサンプル前に
1.透過GIFの情報を取得
2.色を指定
3.パレットを塗りつぶす
とすれば良いようです。
以下が作成した透過GIFリサイズ用のソース
まずは透過GIFの情報を取得します。
専用class関数を作りました
/**
* setTPinfo
* 透過GIFか否か?および透過GIF情報セット
*
* 透過GIFである場合
* プロパティ$tpに透過GIF情報がセットされる
*
* $tp["red"] = 赤コンポーネントの値
* $tp["green"] = 緑コンポーネントの値
* $tp["blue"] = 青コンポーネントの値
* $tp["alpha"] = 透過度(0から127/0は完全に不透明な状態/127は完全に透明な状態)
*
* @access private
* @param resource $src 画像リソース
* @param int $w 対象画像幅(px)
* @param int $h 対象画像高(px)
* @return boolean
*/
private function setTPinfo($src,$w,$h){
for($sx=0; $sx<$w; $sx++) {
for($sy=0; $sy<$h; $sy++) {
$rgb = imagecolorat($src, $sx, $sy);
$idx = imagecolorsforindex($src, $rgb);
if($idx["alpha"] !== 0){
$tp = $idx;
break;
}
}
if(!isset($tp) || $tp!== null)break;
}
// 透過GIF
if(isset($tp) && is_array($tp)){
$this->tp = $tp;
return true;
}
// 透過GIFではない
return false;
}
* setTPinfo
* 透過GIFか否か?および透過GIF情報セット
*
* 透過GIFである場合
* プロパティ$tpに透過GIF情報がセットされる
*
* $tp["red"] = 赤コンポーネントの値
* $tp["green"] = 緑コンポーネントの値
* $tp["blue"] = 青コンポーネントの値
* $tp["alpha"] = 透過度(0から127/0は完全に不透明な状態/127は完全に透明な状態)
*
* @access private
* @param resource $src 画像リソース
* @param int $w 対象画像幅(px)
* @param int $h 対象画像高(px)
* @return boolean
*/
private function setTPinfo($src,$w,$h){
for($sx=0; $sx<$w; $sx++) {
for($sy=0; $sy<$h; $sy++) {
$rgb = imagecolorat($src, $sx, $sy);
$idx = imagecolorsforindex($src, $rgb);
if($idx["alpha"] !== 0){
$tp = $idx;
break;
}
}
if(!isset($tp) || $tp!== null)break;
}
// 透過GIF
if(isset($tp) && is_array($tp)){
$this->tp = $tp;
return true;
}
// 透過GIFではない
return false;
}
で、透過GIF情報をプロパティ$tpにセットした後、
以下のようなロジックを走らします。
$w; // 元画像幅
$h; // 元画像高さ
// TrueColor イメージ新規作成
$resource = imagecreatetruecolor($w,$h);
// 画像で使用する色を透過度を指定して作成
$bgcolor = imagecolorallocatealpha($resource,
$this->tp["red"],
$this->tp["green"],
$this->tp["blue"],
$this->tp["alpha"]);
// 塗り潰す
imagefill($resource, 0, 0, $bgcolor);
// 透明色を定義
imagecolortransparent($resource,$bgcolor);
// リサンプル
imagecopyresampled($resource,
$src,0,0,0,0,新しい幅,新しい高さ,$w,$h);
// ブラウザまたはファイルへGIF画像出力
imagegif($resource,保存先パス);
$h; // 元画像高さ
// TrueColor イメージ新規作成
$resource = imagecreatetruecolor($w,$h);
// 画像で使用する色を透過度を指定して作成
$bgcolor = imagecolorallocatealpha($resource,
$this->tp["red"],
$this->tp["green"],
$this->tp["blue"],
$this->tp["alpha"]);
// 塗り潰す
imagefill($resource, 0, 0, $bgcolor);
// 透明色を定義
imagecolortransparent($resource,$bgcolor);
// リサンプル
imagecopyresampled($resource,
$src,0,0,0,0,新しい幅,新しい高さ,$w,$h);
// ブラウザまたはファイルへGIF画像出力
imagegif($resource,保存先パス);
IRQ / 割り込み要求
IRQとは割込み要求のこと。
Inter ReQuestの略です。
実行中のプログラムを一時中断し
別プログラムの新しい処理要求を実行します。
この「割り込み要求」は0〜15までの識別番号で管理されます。
デバイスが利用しているIRQ情報は
/proc/interrupts
に記述管理されています。
シリアルポートはIRQ番号3,4が割り当てられます。
シリアルポートとは周辺機器とのデータ通信を行うIFです。
一本の信号線で1bitずつデータ伝送します。
IRQ番号割り当て例
なお/proc/ioportsはI/Oポートアドレスが記述されてます。
I/Oポートアドレスはデバイスとのデータ送受信に使用されます。
/proc/dmaは、デバイスが利用しているDMAチャネル情報。
DMAとはDirect Memory Accessの略で
その名の通りCPUを介さずにメモリとデバイスが
直接データをやりとりするためのものです。
Inter ReQuestの略です。
実行中のプログラムを一時中断し
別プログラムの新しい処理要求を実行します。
この「割り込み要求」は0〜15までの識別番号で管理されます。
デバイスが利用しているIRQ情報は
/proc/interrupts
に記述管理されています。
[prompt] # less /proc/interrupts
CPU0
0: 1902540 XT-PIC timer
1: 14 XT-PIC i8042
2: 0 XT-PIC cascade
5: 0 XT-PIC ehci_hcd:usb1
6: 5 XT-PIC floppy
7: 0 XT-PIC parport0
8: 1 XT-PIC rtc
9: 0 XT-PIC acpi, uhci_hcd:usb2, Ensoniq AudioPCI
10: 2387 XT-PIC eth0
12: 835 XT-PIC i8042
14: 11843 XT-PIC ide0
15: 6615 XT-PIC ide1
NMI: 0
LOC: 0
ERR: 0
MIS: 0
/proc/interrupts (END)
一番左がIRQの識別番号です。 CPU0
0: 1902540 XT-PIC timer
1: 14 XT-PIC i8042
2: 0 XT-PIC cascade
5: 0 XT-PIC ehci_hcd:usb1
6: 5 XT-PIC floppy
7: 0 XT-PIC parport0
8: 1 XT-PIC rtc
9: 0 XT-PIC acpi, uhci_hcd:usb2, Ensoniq AudioPCI
10: 2387 XT-PIC eth0
12: 835 XT-PIC i8042
14: 11843 XT-PIC ide0
15: 6615 XT-PIC ide1
NMI: 0
LOC: 0
ERR: 0
MIS: 0
/proc/interrupts (END)
シリアルポートはIRQ番号3,4が割り当てられます。
シリアルポートとは周辺機器とのデータ通信を行うIFです。
一本の信号線で1bitずつデータ伝送します。
IRQ番号割り当て例
| IRQ番号 | デバイス |
| 0 | システムタイマー |
| 1 | キーボード |
| 2 | IRQ9とのカスケード接続 |
| 3 | シリアルポート2 |
| 4 | シリアルポート1 |
| 5 | パラレルポート2かサウンドカード |
| 6 | フロッピーディスクコントローラ |
| 7 | パラレルポート1 |
| 8 | リアルタイムクロック |
| 9 | IRQ2へのリダイレクト |
| 10 | 空き |
| 11 | 空き |
| 12 | PS/2マウス |
| 13 | 数値演算コンプレッサ |
| 14 | IDEハードディスクコントローラ(プライマリ) |
| 15 | IDEハードディスクコントローラ(セカンダリ) |
なお/proc/ioportsはI/Oポートアドレスが記述されてます。
I/Oポートアドレスはデバイスとのデータ送受信に使用されます。
[prompt]# less /proc/ioports
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-006f : keyboard
0070-0077 : rtc
0080-008f : dma page reg
00a0-00a1 : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : ide1
01f0-01f7 : ide0
02f8-02ff : serial
0376-0376 : ide1
0378-037a : parport0
03c0-03df : vga+
03f2-03f5 : floppy
03f6-03f6 : ide0
03f7-03f7 : floppy DIR
03f8-03ff : serial
0cf8-0cff : PCI conf1
1000-103f : 0000:00:07.3
1000-103f : motherboard
1000-1003 : ACPI PM1a_EVT_BLK
1004-1005 : ACPI PM1a_CNT_BLK
1008-100b : ACPI PM_TMR
100c-100f : ACPI GPE0_BLK
1010-1015 : ACPI CPU throttle
1040-104f : 0000:00:07.3
1040-104f : motherboard
1050-105f : 0000:00:07.1
1050-1057 : ide0
1058-105f : ide1
1060-107f : 0000:00:07.2
1060-107f : uhci_hcd
1080-109f : 0000:00:10.0
10a0-10af : 0000:00:0f.0
2000-2fff : PCI Bus #02
2000-207f : 0000:02:00.0
2000-201f : pcnet32_probe_pci
2080-20bf : 0000:02:01.0
2080-20bf : Ensoniq AudioPCI
/proc/ioports (END)
サウンドカードはI/Oポートの200,220,300,388番などを使用します。 0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-006f : keyboard
0070-0077 : rtc
0080-008f : dma page reg
00a0-00a1 : pic2
00c0-00df : dma2
00f0-00ff : fpu
0170-0177 : ide1
01f0-01f7 : ide0
02f8-02ff : serial
0376-0376 : ide1
0378-037a : parport0
03c0-03df : vga+
03f2-03f5 : floppy
03f6-03f6 : ide0
03f7-03f7 : floppy DIR
03f8-03ff : serial
0cf8-0cff : PCI conf1
1000-103f : 0000:00:07.3
1000-103f : motherboard
1000-1003 : ACPI PM1a_EVT_BLK
1004-1005 : ACPI PM1a_CNT_BLK
1008-100b : ACPI PM_TMR
100c-100f : ACPI GPE0_BLK
1010-1015 : ACPI CPU throttle
1040-104f : 0000:00:07.3
1040-104f : motherboard
1050-105f : 0000:00:07.1
1050-1057 : ide0
1058-105f : ide1
1060-107f : 0000:00:07.2
1060-107f : uhci_hcd
1080-109f : 0000:00:10.0
10a0-10af : 0000:00:0f.0
2000-2fff : PCI Bus #02
2000-207f : 0000:02:00.0
2000-201f : pcnet32_probe_pci
2080-20bf : 0000:02:01.0
2080-20bf : Ensoniq AudioPCI
/proc/ioports (END)
/proc/dmaは、デバイスが利用しているDMAチャネル情報。
DMAとはDirect Memory Accessの略で
その名の通りCPUを介さずにメモリとデバイスが
直接データをやりとりするためのものです。
[promt]# less /proc/dma
2: floppy
4: cascade
/proc/dma (END)
2: floppy
4: cascade
/proc/dma (END)