2009年4月

 

PDFTKのGUIフロントエンドを探したのですが、好みのものが見つからなかったので作ってみました。

GUI for PDFTK 0.9.0.0 ダウンロード

(同梱のヘルプは古いかもしれません。)

 

スクリーンショット

WS000042

 

インターフェイスが日本語なだけで、pdftk.exeを日本語対応にしたわけではありません。

よって保存ファイルのパス名に日本語が含まれていると失敗します。(入力ファイルとしては可能)

おおざっぱに言うと、デスクトップなどには保存できないということです。

 

インストール

インストーラを実行してください。

.NET Framework 3.5 以上が必要です。(2.0でも動くかも)

 

アンインストール

コントロールパネルの「プログラムの追加と削除」からアンインストールしてください。

レジストリは使用していません。

 

これはなに?

pdftkをマウス操作で実行するためのフロントエンドです。

pdftkはPDFファイルの結合や分割を行う素晴らしいソフトですが、コマンドラインから使用するため、不慣れな人には敷居の高いものとなっています。

GUI for PDFTK を使うことで、ドラッグ&ドロップによる入力ファイルの指定、名前を付けて保存ダイアログボックスの使用などが可能になり、一般的なWindows アプリケーションであるかのようにpdftkが使えるようになります。

 

できること

GUI for PDFTK にできることは、すなわちpdftkにできることにほかなりません。

しかしながら作者の力量不足により、本来pdftkにできることができなかったりするかもしれません。

特に、結合などの操作と暗号化の併用は未実装の部分が残っています。

暗号化を要する場合は、暗号化のみ行うようにしてください。

(「分割しながら暗号化」だけは(後が面倒すぎるので、取りあえず)実装済みです。)

 

できないこと

pdftkにできないことはGUI for PDFTK を使ってもできません。

たとえば、PDFを閲覧しながら不要なページを削除する、などは別のソフトをあたってください。

 

基本的な使い方

複数ファイルを結合して1つのPDFにする場合、

1.左パネルにPDFファイルをドロップします。

2.右上のボタンを押して、保存するPDFの名前を決めます。

3.右下の「保存」ボタンを押せばできあがり。

 merge_WS000042

 

ページの削除

a.pdfの13ページを取り除く場合、

a.pdfの1~12ページと、a.pdfの14~endページを結合します。

(ページ番号にendを指定すると最終ページを表します。)

 

1ページずつ別々のファイルに分ける

複数のページからなるa.pdfを1ページずつ別々のファイルに分割する場合、

左パネルにPDFファイルを1つ登録した状態で「分割」ボタンを押します。

出力ファイル名はpg_%04d.pdfなどと指定します。

この場合、pg_0001.pdf、pg_0002.pdf、...が作成されます。

printfのフォーマット指定子と同じ書式が使えます。

 

PDFにファイルを添付する/添付されたファイルを取り出す

e-メールにファイルを添付するように、PDFにもファイルを添付することができます。

左パネルの1番上が添付されるPDFファイル、2行目以下が添付するファイルです。

添付はドキュメント全体に対して行われますが、特定のページに対して添付することもできます。

その場合は1行目のPDFファイルのページ設定を、添付したいページにします。

開始ページと終了ページに同じ数を入力すると、そのページにファイルが添付されます。

添付されたファイルは「取出」ボタンで分離できます。

この場合、保存先として指定したパスのファイル名部分は無効になり、フォルダ以下に添付ファイルがばらまかれます。

 

ページの回転

特定のページだけを回転させたい場合は、ページの削除の時のように、行を分けて記述します。

たとえばa.pdfの3ページ目だけを90度回転させたい場合は、

a.pdfの1~2ページ、

a.pdfの3ページを90度回転、

a.pdfの4~endページ

の順に登録して結合します。

 

保存先

保存ファイル名を指定しないとoutput.pdfが指定されたものとして動作します。

入力ファイル名と同じ名前で保存することはできません(入力ファイルの上書き不可)。

 

暗号化/復号化

パスワードには権限パスワードとユーザーパスワードがあります。

ユーザーパスワードは、ファイルを開くときに入力するパスワードです。

ユーザーパスワードを知らないと、ファイルを開くことができません。

 

PDFファイルにパーミッションが設定されている場合、PDFを開いたユーザーは、許可された操作しか行うことができません。

たとえば、低解像度の印刷は許可されているが、高解像度の印刷はできない、などです。

 

権限パスワードは、これらのパーミッションを変更するときに使うパスワードです。

よって権限パスワードとユーザーパスワードが同一だと、ユーザーパスワードは意味を為さなくなります。

(ファイルを開くときにパスワードを求められるものの、そのパスワードで権限も取得できてしまうので)

 

権限パスワードがなく、ユーザーパスワードだけが設定されていた場合の動作は、PDFビューアーによって異なるようです。

Adobe Reader 9 では権限パスワードがない=すべての権限にアクセスできる、となり、パーミッションの設定は無効になります。

他のPDFビューアーの中には、権限パスワードがない=有効なパーミッションがない=すべて許可しない、となるものがあります。

PDFの仕様としてどちらが正しいのかは知りませんが、Adobe Reader 9 で無効になることを考えると、(パーミッションの設定が必要なら)権限パスワードも設定したほうが良いようです。

 

背景/スタンプ

1つのPDFに、他のPDFを背景として埋め込むことができます。

背景として使われるのは1ページ目だけで、2ページ目以降は無視されます。

1行目に背景を埋め込むPDF、2行目に背景となるPDFを登録します。

1行目のPDFのすべてのページに、2行目のPDFの1ページ目が背景として重なります。

スタンプは、背景と似ていますが、前面に重ねられる点が異なります。

 

ページの順番を逆にする

逆順にするにはend-1とページ指定します。

同様に3-1とすれば、3,2,1ページの順に出力します。

 

 

注意点

登録されたファイルが正しくPDFであるかのチェックは行いません。

そのため、操作を実行した段階でエラーが出力されることがあります。

これはpdftkの出すエラーなので、PDFファイルの指定が間違っていないか確認してください。

 

よくある間違い

3つのページを含むPDFファイルに対して、「1~4ページ」のような有り得ない数を指定した。

左パネルの1行目はPDFでなければならないが、PDFではないファイルが登録されていた。

 

Vistaの注意点

GUI for PDFTK は、出力ファイル名が指定されなかった場合、GUI fot PDFTK がインストールされたフォルダにoutput.pdfという名前で出力します。

しかし Windows Vista では デフォルトのインストール先(C:\Program Files以下)にユーザーが直接ファイルを書き込むことはできず、C:\Users\(ユーザー名)\AppData\Local\VirtualStore\Program Files以下に保存されます。

作成したはずのファイルが見当たらない場合は、C:\Users\(ユーザー名)\AppData\Local\VirtualStore以下を探してみてください。

詳しくは「Virtual Store」で調べてみてください。

 

要望など

致命的なバグを見つけた、あの画面構成はおかしい、こんな機能が欲しい、などの要望は

http://more-pc.net/

までお願いします。

 

配布条件など

一切自由です。好きに使ってください。

落ち着いたらソースも公開したいと思っています。

ただしpdftkについては向こうの配布条件に従ってください。

http://www.pdfhacks.com/pdftk/

(もし~だったら)このメソッド(ファンクション)を終了する、をC#では何と書くのだったか、3秒ほど失念。

 

if(~)
{
    return;
}

 

に決まってるじゃん。

使わないと馬鹿になる~~

サイト内をうろついても登録解除に関する記述が見当たらなかったので、嫌な予感を覚えつつサポートに問い合わせてみました。

 

以下、顛末です。

 

 

問い合わせ1

登録情報を削除してください。

 

返答1

http://www.onamae.com/download/pdf/id_haishi.pdf

上記URLよりお名前ID廃止申請書をプリントアウトしていただき、
お名前.com会員情報のご名義にて必要事項のご記入及び、ご捺印
の上、弊社お客様センターまでご返送ください。

なお、まことに恐縮ではございますが、FAXでの受付は行っており
ませんので、何とぞご了承ください。

 

PDFをダウンロードして見てみると、住所氏名等のほかに
お名前IDを記入する欄がありました。

 

登録したのは大昔のことなので、「IDを忘れた方はこちら」をクリックしました。

WS000040

当時のドメインはすでに私の管理下になく(というか、誰も取得していない気がする)
入力してもエラー扱いです。

WS000041

 

というわけで、再度サポートフォームから問い合わせ。

 

問い合わせ2

ドメイン廃止済みのためか、問い合わせフォームからお名前IDを取得できません。

 

返答2

お名前IDおよびパスワードにつきましては、お名前.com会員情報
にご登録いただいておりますメールアドレスにて受信が可能な場
合、下記のお名前.comサイト内より自動再発行を受けることが可
能でございます。

https://dom.onamae.com/onamae/reminder.do?act=id

上記にてお受け取りができない場合には、ご登録されているお名
前.com会員情報宛への郵送 またはFAX送信が可能でございますの
で、ご希望の際は、お手数おかけいたしますが下記の情報をお書
き添えのうえ、再度ご連絡をいただけますようお願いいたします。

■ドメイン名

■ご希望の方法(FAXもしくは郵送)

■ご登録のFAX番号もしくはご住所

 

 

…案内されたページは、さっきエラー扱いされた問い合わせフォームのURLなんですけどー。

「フォームからIDを確認できない」って言っているのに、何でまたそのフォームを案内するの?××(自主規制)なの?

応対マニュアルをコピペしただけなんだろうなぁ…

 

というわけで、

問い合わせ3

■ドメイン名 不明

■ご希望の方法(FAXもしくは郵送) 郵送

■ご登録のFAX番号もしくはご住所 (略)

 

(追記)

返答3

この度は何度もお手数をおかけいたしまして大変申し訳ございません。
弊社からのご案内に不十分な点があり、お客様にはご迷惑をおかけい
たしました。

すでに弊社にてドメインの管理を行われていないとのことですので、
ドメインニュースなどの配信につきましては停止を行わせていただき
ました。

また、ご記載いただきましたご住所が会員情報と一致いたしました
ため、お名前ID/パスワードの郵送手配を行わせていただきます。
ご到着まで今しばらくお待ちください。

お手数お掛けしたことをお詫びしたくお電話にてご連絡させていただ
くことも可能でございます。
その際はまことに恐縮ですが下記事項をご記入いただきご返信くださ
いますようお願い申しあげます。

ご希望日時:
お電話番号:
-----------------------------------------------------------

この度はお手数をおかけいたしまして大変申し訳ございません。

ご不明点などございましたらお気軽にお問い合わせください。

今後ともお名前.comをよろしくお願いいたします。

 

 

 

ここにきて、やっと本題に入れそうです。

IDが郵送されてきたら、その内容を廃止申込書に転記して、ハンコを押して郵送、と。

先は長い…

時流に乗っかってみます(笑)

 

某アイドルグループの一人が公然わいせつ罪で逮捕されたらしいが、それを伝えるワイドショー等で

草Nぎ「メンバー」とかいう珍妙な呼び方をするところは、Jニーズの機嫌を損ねたくない魂胆が見え見えである。

 

本来なら「容疑者」と呼ぶはずなのだけれど、そういう報道をすると他の所属者を出演させてくれなくなる恐れがある。

でもネタとして取り上げたいから、苦し紛れの策に出た結果がこれ。

稲Gきのときも「稲垣メンバー」とか呼んでたなぁ。(あ、伏字にするの忘れたw

説明するより例をたくさん出したほうが分かりやすいと思うので、manのサンプルを意訳してみます。

 

複数のPDFを結合して新しいドキュメントを作る

1.pdf、2.pdf、3.pdfの順に結合してnew.pdfを作る例
    pdftk 1.pdf 2.pdf 3.pdf cat output new.pdf


ハンドルを使って1.pdfと2.pdfを結合し、new.pdfを作る例
    pdftk A=1.pdf B=2.pdf cat A B output new.pdf


ワイルドカードを使ってカレントディレクトリのすべてのPDFをnew.pdfに結合する例
    pdftk *.pdf cat output new.pdf

 

ドキュメントから特定のページだけ削除する/抽出する

in1.pdfから13ページ目を削除してout1.pdfとして保存する例
    pdftk in.pdf cat 1-12 14-end output out1.pdf


ハンドルを使った例
    pdftk A=in1.pdf cat A1-12 A14-end output out1.pdf

 

複数のPDFからページを抽出して新しいドキュメントを作る
one.pdfの1~7ページ、two.pdfの1~5ページ、one.pdfの8ページ、の順に結合してcombined.pdfに保存する例(ハンドルを使用)
    pdftk A=one.pdf B=two.pdf cat A1-7 B1-5 A8 output combined.pdf

 

ページを回転させる

in.pdfの1ページ目だけを時計回りに90度回転させる
    pdftk in.pdf cat 1E 2-end output out.pdf

 

in.pdfのすべてのページを180度回転させてout.pdfに保存する
    pdftk in.pdf cat 1-endS output out.pdf

 

ページと回転の指定

1-6even 1から6までの偶数。つまり2,4,6ページ。
6-1even 6から1までの偶数。つまり6,4,2ページ。
奇数はevenのかわりにodd。

回転は文字で指定。

N:0 E:90 S:180 W:270 L:-90 R:+90 D:+180

B1-end は B を指定したのと同じこと。

 

128ビットの暗号化を施す

権限はすべて許可(デフォルト)。mydoc.pdfを暗号化してmydoc.128.pdfにする例。パスワードはfoo。
    pdftk mydoc.pdf output mydoc.128.pdf owner_pw foo

上と同じで、ドキュメントを開くときにパスワードを求めるようにする例
    pdftk mydoc.pdf output mydoc.128.pdf owner_pw foo user_pw baz

上と同じで、ドキュメントを印刷するとき(当然開いたあとなわけだが)にパスワードを求める例
    pdftk mydoc.pdf output mydoc.128.pdf owner_pw foo user_pw baz allow printing


復号化
    pdftk secured.pdf input_pw foopass output unsecured.pdf

 

暗号化されたPDFが混ざっているときの結合方法(結合後のドキュメントは暗号化されていません)
    pdftk A=secured.pdf mydoc.pdf input_pw A=foopass cat output combined.pdf

 

その他

テキストエディタでPDFコードを編集するためにPDFページストリームを解凍する

mydoc.pdfを解凍してmydoc.clear.pdfに保存する例
    pdftk mydoc.pdf output mydoc.clear.pdf uncompress

 

XREFテーブルとストリーム長が壊れたPDFを(可能なら)修復する
    pdftk broken.pdf output fixed.pdf

 

1ページずつばらす。
    pdftk mydoc.pdf burst

 

PDFのメタデータ、ブックマーク、しおりを出力する。
    pdftk mydoc.pdf dump_data output report.txt

「常にオフライン」のチェックを外したフォルダが、同期センターに表示されたままになるのを解消する方法を探し当てたのでメモ。

 

すべてのオフライン ファイルのキャッシュが消えるので、同期を済ませてから行います。

 

コントロールパネル – オフライン ファイル を開いたら、オフライン ファイルを無効にします。

Vistaを再起動したら、管理者権限でコマンド プロンプトを開いて、以下を実行。

 

takeown /r /f C:\Windows\CSC

rd /s C:\Windows\CSC

 

※C:\Windows\CSCはオフライン ファイルのキャッシュが保存されているフォルダです。

実行しますか?と聞かれたらYを押して続行します。

 

消えるのはキャッシュだけなので、必要なら再度オフライン ファイルの設定を行えばOK。

例)雑記カテゴリのみ非表示にする


例)雑記カテゴリのみ表示にする

例)雑記とリンクカテゴリを非表示にする


例はいずれも、条件にマッチしたエントリから最新の5件を表示する。

参考:公式リファレンス
http://www.movabletype.jp/documentation/appendices/tags/entries.html

ディスクトップ、って言うの、いい加減やめてほしい

ヘルプディスクとは言わないでしょ

Google ドキュメントが開けない。

Error

We're sorry...
... but your query looks similar to automated requests from a computer virus or spyware application. To protect our users, we can't process your request right now.

We'll restore your access as quickly as possible, so try again soon. In the meantime, if you suspect that your computer or network has been infected, you might want to run a virus checker or spyware remover to make sure that your systems are free of viruses and other spurious software.

We apologize for the inconvenience, and hope we'll see you again on Google.


以下、意訳。


エラー

申し訳ございません。

要求された接続はウィルスかスパイウェアによる自動接続と思われます。
お客様方を保護するため、この接続をすぐ処理することはできません。

できるだけ早く復旧しますので、もう一度お試しください。
もしPCやネットワークが感染していると思われる場合には、差し当たってこちらに無料のソフトがありますので、ウィルスチェックやスパイウェア駆除を行ってください。

ご迷惑をおかけして申し訳ありませんが、再度のアクセスをお願いいたします。

複数の拠点から試行しても同様なので、クライアントの問題ではないはず。
というわけでGoogle系サービスは切ることにしました。
# 惜しいのはGmailの別名機能ぐらいかな・・・

 

マルウェアの区別つかず:ネットセキュリティに自信の無い日本人、エフセキュア調べ - ITmedia エンタープライズ

 

記事の趣旨としては、

  • 日本人インターネットユーザーは、他国のそれと比べてオンラインでクレジット情報をやりとりすることに不安を感じている。
  • 「ワーム」「フィッシャー」「トロイの木馬」「ボット」「スパルタン」のうち、どれがマルウェアか?という質問に答えられなかったのは日本人が多い。

など。

 

だけど、これがネットセキュリティに自信がないというタイトルになるのは理解不能。

 

オンラインで信用情報/個人情報を送受信することに不安を感じるほうがセキュリティ意識は高いと思うし、
スパルタンを知っているからといってマルウェアに引っかからないわけじゃない。

ネットセキュリティに自信がないのではなく、

ネットを信用していない

ネットにそこまで深く関る必要がない(IT系の記事を書く仕事してるわけじゃないんだから…)

だけでは?

 

例1)

  1. 油性ボールペン
  2. ゲルボールペン
  3. 水性ボールペン
  4. ネームペン
  5. シャープペンシル

のうち、一番長く書けるのはどれでしょう?

 

例2)次のうち、マルウェアはどれでしょう?

  1. インターネット上で役立つフリーソフトを見つけたので、ダウンロードしてインストールした。
  2. 無料のソフトを入れたら、ソフトとは関係のない妙なツールバーがブラウザに勝手に追加されていた。
  3. 無料のソフトを入れたら広告が表示されるようになり、広告を消したらソフトも使えなくなった。
  4. 無料のソフトを入れたら広告が表示されるようになり、ソフトをアンインストールしたが広告は削除されなかった。

例2で2,3,4を選べなかったというなら「マルウェアの区別がつかない」と表現してもいいと思いますが、
例1のような、知っていたから何? 程度の質問で知識不足だと批判するのは間違っていると思います。

 

ちなみにエフセキュアのほうでは比較的マトモな調査結果を発表しています。

http://www.f-secure.co.jp/news/200904131/

  • アンチウィルスソフトの導入率が高いが、それだけで安全だとは思っていない。
  • 安全なサイトを見抜き、自分の責任で使う(ISPやアンチウィルスベンダー任せにしない)
  • アップデートの重要性はわかっているが実施できていない(社内サイトが対応できないから最新版にしないでくれ、とか言われるしね…)
  • フィッシングを見抜ける自信がない(むしろ良いことでは?私は騙されない!と思っている人ほど詐欺の被害に遭うと、振り込め詐欺で学びましたから)
  • 子供がインターネットを使うのは危険だと思っている(当然思うでしょう。思わないほうがセキュリティ意識低いよ)

まあ「比較的」ましなだけですが。

  • データを失った経験がある人が30%いるにもかかわらず、毎日バックアップしていると答えた人はわずか4%でした。

データを失った経験があるからこそ、本当に必要なデータは大して多くないと気づいた=データが変わったときだけバックアップすればいいや

ストレージの容量は増えても、失っちゃまずいデータってのはそんなに増えないでしょう。

メールとアドレス帳ぐらい?

仕事の書類なんか消えてもどうにかなるさ。また作ればいいだけ。

けど昔の恋人の電話番号は消えたら取り返せないからね:-)

php.iniにDSNを定義する

pdo.dsn.sqlserver=”mssql:host=localhost; dbname=db”
pdo.dsn.sybase=”sybase:host=localhost; dbname-db”
pdo.dsn.firebird=”firebird:User=foo;Password=baa;Database=DB.GDE;DataSource=localhost;Port=3050”
pdo.dsn.mysql=”mysql:host=localhost;dbname=db;charset=utf8”
pdo.dsn.oracle=”oci:db”
pdo.dsn.oracle=”oci:dbname=//localhost:1521/db”
pdo.dsn.odbc=”odbc:DSN=DB;UID=foo;PWD=baa”
pdo.dsn.postgresql=”pgsql:host=localhost port=5432 dbname=db user=foo password=baa”
pdo.dsn.sqlite3xonfile=”sqlite:/var/www/html/hoge/db.sqlite”
pdo.dsn.sqlite3xonemory=”sqlite::memory::”
pdo.dsn.sqlite2xonfile=”sqlite2:/var/www/html/hoge/db.sqlite”
pdo.dsn.sqlite2xonmemory=”sqlite2::memory::”

 

データベースに接続する

try {
$db = new PDO(‘sqlserver’,username,password);
//$db = new PDO(‘odbc’); //DSNにユーザー・パスワードを登録しているので不要
//$db = new PDO(‘sqlite’);  //SQLiteはユーザー・パスワードの概念がないので不要
} catch (PDOException $e) {
die (‘データベースに接続できませんでした:’.$e->getMessage());
}

 

SQLを発行する

exec()メソッド、またはquery()メソッドによる。

exec()メソッドは操作したレコード数を返す。

query()メソッドは結果セットを返す。

 

INSERT、UPDATE、DELETE、CREATE TABLE等はexec()メソッドを使う
try {
$db = new PDO(‘sqlite’);
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //データベース操作のエラーをPDOException例外とする
$db->exec(‘CREATE TABLE master(id INTEGER AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50),email VARCHAR(100))’);
} catch (PDOExeption $e) {
die(‘テーブルを作成できませんでした:’.e->getMessage());
}

 

SELECT文はレコードセットを返してくるのでquery()メソッドを使う

PDO::query(string sql_statement)

 

ユーザー入力から動的にSQLクエリを生成する

quote()メソッドでエスケープする

string PDO::quote(string hoge [,int parameter_type])

 

プレイスホルダで置き換える

例1)

$db  = new PDO(‘sqlite’);
$object = $db->prepare(‘INSERT INTO master(name,email) VALUES(?,?)’);
$object->execute(array($_POST[‘name’],$_POST[‘email’]));

?の部分にパラメータが埋め込まれる。

 

例2)

?の代わりに:<name>形式で明示的に指定。

ついでにbindParamでパラメータと値を事前に対応付けてから実行。

$db  = new PDO(‘sqlite’);
$object = $db->prepare(‘INSERT INTO master(name,email) VALUES(:name,:email)’);
$object->bindParam(‘:name’,$_POST[‘name’],PDO::PARAM_STR,50);
$object->bindParam(‘:email’,$_POST[‘email’],PDO::PARAM_STR,100);
$object->execute();

 

SELECTした結果を順に処理する

$db = new PDO(‘sqlite’);
$rset = $db->query(‘SELECT * FROM master’);
while ( $row=$rset->fetch(PDO::FETCH_ASSOC)) {
print ($row[‘name’]);
print ($row[‘email’]);
}

※実際にはHTMLに組み込むと思うので<table>やら<td>やらで適当に括って使う。

 

トランザクション

トランザクションの開始

exec(‘BEGIN’)

コミット

exec(‘COMMIT’)

ロールバック

exec(‘ROLLBACK’)

php.iniにDSNを定義する

pdo.dsn.sqlserver=”mssql:host=localhost; dbname=db”
pdo.dsn.sybase=”sybase:host=localhost; dbname-db”
pdo.dsn.firebird=”firebird:User=foo;Password=baa;Database=DB.GDE;DataSource=localhost;Port=3050”
pdo.dsn.mysql=”mysql:host=localhost;dbname=db;charset=utf8”
pdo.dsn.oracle=”oci:db”
pdo.dsn.oracle=”oci:dbname=//localhost:1521/db”
pdo.dsn.odbc=”odbc:DSN=DB;UID=foo;PWD=baa”
pdo.dsn.postgresql=”pgsql:host=localhost port=5432 dbname=db user=foo password=baa”
pdo.dsn.sqlite3xonfile=”sqlite:/var/www/html/hoge/db.sqlite”
pdo.dsn.sqlite3xonemory=”sqlite::memory::”
pdo.dsn.sqlite2xonfile=”sqlite2:/var/www/html/hoge/db.sqlite”
pdo.dsn.sqlite2xonmemory=”sqlite2::memory::”

 

データベースに接続する

try {
$db = new PDO(‘sqlserver’,username,password);
//$db = new PDO(‘odbc’); //DSNにユーザー・パスワードを登録しているので不要
//$db = new PDO(‘sqlite’);  //SQLiteはユーザー・パスワードの概念がないので不要
} catch (PDOException $e) {
die (‘データベースに接続できませんでした:’.$e->getMessage());
}

 

SQLを発行する

exec()メソッド、またはquery()メソッドによる。

exec()メソッドは操作したレコード数を返す。

query()メソッドは結果セットを返す。

 

INSERT、UPDATE、DELETE、CREATE TABLE等はexec()メソッドを使う
try {
$db = new PDO(‘sqlite’);
$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //データベース操作のエラーをPDOException例外とする
$db->exec(‘CREATE TABLE master(id INTEGER AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50),email VARCHAR(100))’);
} catch (PDOExeption $e) {
die(‘テーブルを作成できませんでした:’.e->getMessage());
}

 

SELECT文はレコードセットを返してくるのでquery()メソッドを使う

PDO::query(string sql_statement)

 

ユーザー入力から動的にSQLクエリを生成する

quote()メソッドでエスケープする

string PDO::quote(string hoge [,int parameter_type])

 

プレイスホルダで置き換える

例1)

$db  = new PDO(‘sqlite’);
$object = $db->prepare(‘INSERT INTO master(name,email) VALUES(?,?)’);
$object->execute(array($_POST[‘name’],$_POST[‘email’]));

?の部分にパラメータが埋め込まれる。

 

例2)

?の代わりに:<name>形式で明示的に指定。

ついでにbindParamでパラメータと値を事前に対応付けてから実行。

$db  = new PDO(‘sqlite’);
$object = $db->prepare(‘INSERT INTO master(name,email) VALUES(:name,:email)’);
$object->bindParam(‘:name’,$_POST[‘name’],PDO::PARAM_STR,50);
$object->bindParam(‘:email’,$_POST[‘email’],PDO::PARAM_STR,100);
$object->execute();

 

SELECTした結果を順に処理する

$db = new PDO(‘sqlite’);
$rset = $db->query(‘SELECT * FROM master’);
while ( $row=$rset->fetch(PDO::FETCH_ASSOC)) {
print ($row[‘name’]);
print ($row[‘email’]);
}

※実際にはHTMLに組み込むと思うので<table>やら<td>やらで適当に括って使う。

 

トランザクション

トランザクションの開始

exec(‘BEGIN’)

コミット

exec(‘COMMIT’)

ロールバック

exec(‘ROLLBACK’)

必要なクラスファイルを自動でインクルードする

前提1

クラス名.class.php で、1クラス1ファイルにしておく。

前提2

autoload.phpを作る。

<?php
function __autoload($name) {
require_once($name.’class.php’);
}
?>

使い方

require_once(‘autoload.php’);
$object = new MyClass();

new MyClass() すると MyClass.class.php が自動的にインクルードされる。

 

未定義のメソッドを呼んだらどうなるか?

答:__call メソッドが実行される。

ちなみに__callメソッドは、メソッド名と引数値の配列を受け取る。

 

未定義のプロパティを取得/設定しようとしたらどうなるか?

答:__getメソッド、__setメソッドが実行される。

 

オーバーロード?

通常の意味のオーバーロード

public void getAbs(int i ) { return iの絶対値; }
public void getAbs(float f) { return fの絶対値; }
public void getAbs(double d) { return dの絶対値; }
のように、同名のメソッドを引数の内容(シグネチャ)によって切り替えること。
似た機能に少しずつ異なる名前を付ける不便を解消する。

PHPで言うところのオーバーロード

上で出た、未定義のメソッドを呼ぶと__callが実行されること。意味不明。

※PHPでは変数のデータ型を意識しないので、とりあえず受け取って、メソッド内で仮引数のデータ型をチェックして振り分ければよいのか?

function hoge() {
$args=func_get_args(); //引数を配列$argsにセット
if (is_numeric($args[0])) {
//最初の引数が整数だったときの処理
}
}

クラス

定義

class クラス名{
const 定数名=値; //クラス内定数
public $a; //メンバ変数(どこからでもアクセス可能。デフォルト)
protected $b; //メンバ変数(現在のクラスとサブクラスからのみアクセス可能)
private $i ; //メンバ変数(現在のクラスからのみアクセス可能)
public function __construct() { //コンストラクタ
文;
}
public function __destruct() { //デストラクタ
文;
}
public function get_i() { return $this->i ; } //メンバ関数(ゲッタメソッド)
public function set_i( $i ) {$this->i = $i ; } //メンバ関数(セッタメソッド)
public final function get_a() { return $this->a ; } //オーバーライドできないメソッド
}

 

静的メソッド

public static function メソッド名([引数1,引数2,…]) { 文; }

インスタンス化しなくても クラス名::メソッド名() で呼び出せる。

 

クラスの継承

class サブクラス名 extends スーパークラス名 {}

サブクラスからスーパークラスのメソッドを呼び出すには parent::メソッド名() とする。

 

ポリモーフィズム

抽象メソッドの定義

abstract class クラス名 {
protected abstract function getA(); //抽象メソッド
}

抽象メソッドを含むクラスは抽象クラスであり、クラス名の前に abstract を付ける必要がある。

 

インターフェイスの定義

interface インターフェイス名 {
pubic function メソッド名() ; //抽象メソッド
}

インターフェイスは特別なクラスであり、配下のメソッドがすべて抽象メソッドである。

通常ならクラスは多重継承できないが、インターフェイスなら多重継承が可能になる。

 

インターフェイスの実装

class クラス名 implements インターフェイス名[,インターフェイス名,…] {}

インターフェイスの内部はすべて抽象メソッドであるので、クラスで実装する(実装クラス)。

 

例外処理

try {
//例外が発生する可能性がある処理
} catch ( 例外の種類 $e ) {
//例外発生時の処理
}

基礎の基礎

<?php~php>で括った中身がphpとして解釈される。

これを(ASPやJavaScriptのように)HTMLの中に埋め込む。

式の終わりには;をつける。

命令文は大文字/小文字を区別しない。が、変数は大文字/小文字を区別する。

コメントは<!--~-->、//、#、/*~*/が使える。<!--~-->は(PHPではなくHTMLのコメントなので)クライアントに送信される。

elements 

 

変数

変数名は$で始まる。$の次は英字かアンダースコア。それ以降は英数字かアンダースコア。

変数は宣言せずいきなり使える。

データ型を指定する必要はないが、明示的に指定するには(int)$hogeのようにキャストして使う。

PHPにおけるデータ型は

  • string
  • integer 10進数、16進数(0xで始める)、8進数(0で始める)が使える。
  • float
  • boolean 0や空文字列はFALSE。他はすべて(負数も含め)TRUE扱い。
  • array
  • object
  • null

 

配列

$array=array(要素1,要素2,…); //通常配列

$array2=array(キー1=>要素1,キー2=>要素2,…); //連想配列

$array[0]=”foo”; //配列arrayの最初の要素に文字列fooを代入

$array[]="baa"; //配列arrayに文字列baaをpush(つまり配列の末尾に要素を追加)

 

可変変数

変数名が変数である。

すなわち

$x="title";

であるとき、

$$x

は$titleを表す。

 

スーパーグローバル変数

特殊変数。

$_POST HTMLのPOSTメソッドから渡された内容が連想配列で格納されている。

$_GET HETMLのGETメソッドから渡された内容が連想配列で格納されている。

$_FILES アップロードされたファイルに関する情報が二次元配列で格納されている。

<input type=”file” name=”file” /> だった場合

$_FILES['file']['name'] ファイル名

$_FILES['file'][‘tmp_name’] サーバー上での一時ファイルとしてのファイル名

$_FILES['file'][‘size’] ファイルサイズ

$_FILES['file'][‘type’] ファイルのMIMEタイプ

$FILES['file'][‘error’] エラーコード

$_SERVER リクエストヘッダの連想配列。

$_ENV サーバーの環境変数の連想配列。

$_COOKIE COOKIE情報の連想配列。

$_SESSION セッション情報の連想配列。

$_REQUEST $_GET、$_POST、$_COOKIE、$_FILESの値をまとめて管理

 

定数

define(定数名,値);

定義済み定数

__FILE__ 実行中のファイル名

__LINE__ 実行中の行番号

__FUNCTION__ 実行中の関数名

__CLASS__ 実行中のクラス名

__METHOD__ 実行中のメソッド名

DIRECTORY_SEPARATOR ファイルシステムの区切り文字。/や¥。

PATH_SEPARATOR 環境変数PATHの区切り文字。:や;。

PHP_VERSION PHPのバージョン

NULL 未定義

TRUE 真

FALSE 偽

 

 

エスケープシーケンスや演算子は多言語と同じなので省略。

ちなみに文字列連結は .

また、@を行頭につけると、その行のエラーメッセージを非表示にする(エラー制御演算子)。

 

 

条件分岐

if (条件式 ) { 文; } elseif(条件文) { 文; } else { 文; }

switch (式) {
case 値:
文;
break;
case 値:
文;
break;
default :
文;
break;
}

for ( 初期化式 ; 継続条件 ; 増減式 ) { 文; }

while ( 条件式 ) { 文; }

do { 文; } while ( 条件式 );

foreach ( $data as $key=>$value ) { 文; } //配列$dataのすべての要素にアクセス

continue … Perlの next にあたる

break … Perlの last 相当

loop

 

関数

定義

function 関数名([仮引数1,仮引数2,…]) {
文;
[return 戻り値;]
}

呼び出し

関数名([引数1,引数2,…]); //戻り値がない場合

変数 = 関数名([引数1,引数2,…]); //戻り値を変数に代入する場合

 

外部ファイルのインクルード

include_once(外部ファイル); //ファイルが存在しないと警告(続行)

require_once(外部ファイル); //ファイルが存在しないとエラー(停止)

※循環が発生したら後の呼び出しがキャンセルされる。

Form2にボタンを追加します。

WS000027

WS000028

ボタンをダブルクリック。

WS000029 

次のコードを記述します。

this.Close();

WS000030

 

デバッグ。

WS000031

Form1のButton2をクリックしてForm2を表示。

close2

Form2のButton1をクリック。

close

Form2が閉じられる。

close2

プロジェクト名を右クリックして、[追加]メニューの[Windows フォーム]をクリック。

WS000017

フォームの名前を適当に決める。今回はそのままForm2。

WS000018

Form2のデザイン画面になるけれど、Form1[デザイナ]に戻る。

WS000019

ボタンを1つ追加して、追加したボタンをダブルクリック。

WS000020

コードエディタが開く。

WS000021

カーソルのある位置に、以下を入力。

Form2 f = new Form2();
f.ShowDialog(this);
f.Dispose();

WS000025

デバッグ。

WS000023

 

追加したほうのボタンをクリックすると、Form2が表示される。

F2

Form2が表示されている間はForm1は操作不可。

Form2をXボタンで閉じてからForm1もXボタンで閉じる。

 

Form2が表示されている間もForm1を操作する場合は、以下のように変更する。

Form2 f = new Form2();
f.Show();

WS000026

こうするとForm2の表示中もForm1を操作可

mod

 

。※Form1を閉じるとForm2も閉じる。

Visual C# 2008 Express Edition を起動。

[ファイル]メニュー→新しいプロジェクト

新しいプロジェクト

Windows フォーム アプリケーションを選択。名前は適当に。

Windows フォーム アプリケーション 

 

初期状態でフォームが1つ作成されるので、これをそのまま実行してみる。

デバッグ

F5キーを押すか、[デバッグ]メニューの[デバッグ開始]で実行される。

Form1

右上のXボタンで閉じる。

 

ツールボックスから、Buttonをフォーム上にドラッグ&ドロップする。

Form1にButton1を配置

配置されたButton1をダブルクリックする。

Button1をダブルクリックでイベント登録

 

コードエディタが開く。

コードエディタ

開いた時にカーソルのある位置にコードを書く。

ここに書いたコードが、ボタンをクリックした時に実行される。

例として以下を入力してみる。

MessageBox.Show(“メッセージ”,”タイトル”);

 

入力中に候補が表示されるので、↑↓キーで選択してTabキーを押す。

MessageBox

.を入力すると、続きの候補が表示されるのでShowを選択する。

MessageBox.Show();

メッセージボックスのタイトルとメッセージを入力。

メッセージボックスのタイトルと本文入力

F5キーを押す。

デバッグ

 

フォームにボタンが追加されている。

Form1とButton1

ボタンを押すとメッセージボックスが表示される。

メッセージボックスが表示される

OKボタンでメッセージボックスを閉じる。

フォームの右上のXボタンで閉じて終了する。

 

ここまで出来たらとりあえずプロジェクトを保存しておく。

オンラインストレージのSkyDriveは大容量で便利だけれど、使いにくい点もあります。

  • 削除はフォルダごとかファイル単位
  • 複数のファイルをまとめてダウンロードできない
  • アップロードしたファイルを別フォルダに移動するのが面倒

そこで、SkyDriveをネットワークドライブとして使うためのGladinet Cloud Desktopの出番です。

ところがベータ版なので動作が不安定。アップロードや削除に失敗することが多いので、いい利用法を考えてみました。

 

  • アップロードは今までどおりブラウザへのドラッグ&ドロップで行う。
  • 複数ファイルのダウンロードはGladinet Cloud Desktopでマウントしたネットワークドライブから。
  • フォルダごと削除はブラウザで。
  • フォルダ内の一部のファイルを削除するときはGladinet。ただし大量のファイル削除は失敗しやすいので、何回かやり直すことになるかも。
    共有フォルダじゃないなら、必要なファイルだけをGladinetでダウンロード→フォルダ削除→フォルダ再作成→ブラウザでアップロードし直し、が早い。
  • 「移動」はブラウザでもGladinetでも行わない。必要なら「Gladinetでダウンロード→ブラウザで移動先にアップロード」で対応。

いまのところ、このやりかたが一番(というか妥協点?)っぽいと思います。

 

Firefoxに拡張機能で…という方法もあるけれど、フォルダの中にファイルが多いと辛いので却下。

オンラインストレージなのでWebブラウザからアクセスできるけれど、クライアントをPCにインストールしたほうが使いやすいようなので導入してみました。

入手先

ダウンロード&実行し、最後に I’m new to Dropbox を選ぶとアカウントが作成されます。

チュートリアルはスキップ。感覚で使えるはずさ。

 

マイドキュメントに「My Dropbox」というフォルダが出来ていて、その中がDropboxのストレージ。

ここにファイルなりフォルダなりを保存すると、Dropboxにアップロードされます。

他の場所から変更を加えると、このフォルダの中が更新されます。

 

無料アカウントは容量2GBで、一定期間ログインしないとアカウントが削除されるのだとか。

そんなに長期間PCを起動しない事態(*)があればまずいけれど、普通に生活している限りは毎日PC使うから大丈夫かな。

*事故に遭って意識不明のまま数か月、とか、死んだ、とか捕まった、とか…

 

肝は、ローカルとオンラインストレージの「同期」だということ。

つまりDropboxに2GB分のファイルが置いてあるなら、PCのHDDも2GB消費されます。

 

うっかり有料プランにして50GBに増やしたりすると、ノートPCの空き容量では足りないことも^^;


インストール

問題

/etc/postinstall/gnuplot.sh

/etc/postinstall/post-texmf.sh
でインストールが止まり、先に進まない。

解決法

1.
インストールが停止したら、一旦setup.exeを終了する。
キャンセルボタンからキャンセルできれば良し、出来なければタスクマネージャからkill。

2.
停止した*.shをエクスプローラで探して別の場所へ移動。
上の例ならC:\cygwin\etc\postinstall\gnuplot.shを、デスクトップあたりに移動する。

3.
setup.exeを再度実行する。

1~3を繰り返していけばインストールが完了する。
移動したファイルが気になるなら、cygwinインストール後に元の場所に戻し、
cygwin上で

$ sh /etc/postinstall/gnuplot.sh

のように実行する。(なぜ止まっていたのかも分かる。)

 

起動

問題

起動しても、以下のメッセージが表示されてホームディレクトリに移動できない(ログインできない)

Copying skeleton files.
These files are for the user to personalise
their cygwin experience.
These will never be overwritten.
`./.bashrc' -> `/home/user//.bashrc'
`./.bash_profile' -> `/home/user//.bash_profile'
`./.inputrc' -> `/home/user//.inputrc'
Your group is currently "mkgroup". This indicates that
the /etc/group (and possibly /etc/passwd) files should be rebuilt.
See the man pages for mkpasswd and mkgroup then, for example, run
mkpasswd -l [-d] > /etc/passwd
mkgroup -l [-d] > /etc/group
Note that the -d switch is necessary for domain users.

bash3.2/$

解決法

表示のメッセージに従ってコマンドを実行する。

bash3.2/$ mkpasswd -l > /etc/passwd
bash3.2/$ mkgroup -l  > /etc/group

ドメインユーザーの場合は

bash3.2/$ mkpasswd –l –d > /etc/passwd
bash3.2/$ mkgroup –l -d > /etc/group

 

X

問題

Xを起動するとCPU使用率が100%になる。

解決法

エクスプローラから C:\cygwin\bin\ash.exe を起動し、以下のコマンドを実行する。

$ /bin/rebaseall

 

dllがコンフリクト(衝突)する

問題

Resource temporarily unavailableというエラーが起こる。

解決法

エクスプローラから C:\cygwin\bin\ash.exe を起動し、以下のコマンドを実行する。

$ /bin/rebaseall

 

 

携帯動画変換君が使えなくなる

問題

cygwin1.dllのエラーで変換ができなくなる。

解決法

cygwinのcygwin1.dllと携帯動画変換君のcygwin1.dllが異なることで起きるので、cygwin1.dllをコピーする。

copy /Y C:\cygwin\bin\cygwin1.dll <携帯動画変換君の cygwin1.dll のあるパス>

 

emacsが起動しない

問題

rebaseallを実行したあと、emacsが起動しなくなる。

解決法

setup.exeからLibsグループのlibncurses7を再インストールする。

 

どうにかインストールが終わったものの、起動したら別のエラーが出ました。

 

Copying skeleton files.
These files are for the user to personalise
their cygwin experience.
These will never be overwritten.
`./.bashrc' -> `/home/user//.bashrc'
`./.bash_profile' -> `/home/user//.bash_profile'
`./.inputrc' -> `/home/user//.inputrc'
Your group is currently "mkgroup". This indicates that
the /etc/group (and possibly /etc/passwd) files should be rebuilt.
See the man pages for mkpasswd and mkgroup then, for example, run
mkpasswd -l [-d] > /etc/passwd
mkgroup -l [-d] > /etc/group
Note that the -d switch is necessary for domain users.

bash3.2/$

 

言われるまま、

bash3.2/$ mkpasswd -l > /etc/passwd
bash3.2/$ mkgroup -l  > /etc/group

と実行して再度立ち上げたところ、

$ pwd
/home/user

無事ログインできました。

並べ替え

・辞書順
@hoge = sort @hoge;
あるいは
@hoge = sort {$a cmp $b} @hoge;

・辞書順(逆順)
@hoge = reverse sort @hoge;
あるいは
@hoge = sort {$b cmp $a} @hoge;

・数値
@hoge = sort {$a <=> $b} @hoge;

・数値(逆順)
@hoge = sort {$b <=> $a} @hoge;

 

ユニークな要素を抽出

%tmp;
@uniqlist = grep(  !$tmp{$_}++, @original );

 

2つの配列から重複していない要素を抽出
@difference;
%count = ();
foreach $element (@array1, @array2) { $count{$element}++ }
foreach $element (keys %count) {
    unless ( $count{$element} > 1 ) {
        push @difference , $element
    }
}

 

2つの配列から共通の要素を抽出
@intersection;
%count = ();
foreach $element (@array1, @array2) { $count{$element}++ }
foreach $element (keys %count) {
    if ( $count{$element} > 1 ) {
        push @intersection , $element
    }
}

書籍感想

ほしのあきサイバークローン

無料サンプル、ブログライター、ブログで口コミプロモーションならレビューブログ

フルみっく
伝染歌プレーヤー

急上昇キーワード

ゲーマータグ

Powered by Movable Type 4.25