俺FAQは、「上様」という人間がよく尋ねる質問について「上様」という人間が調べ、その結果をまとめたページです。俺が良く聞く質問(とその答え)ってわけ。
記載されている情報は、「上様」が「つまり、こういうのなのでは!」と思っているだけであり、信頼性についてははなはだ疑問です。鵜呑みにしないようにしてください。
古いやつ。
explorer.exeの起動状態はコマンドラインオプションで制御することが可能です。
例: e:\work をデフォルトにして起動させる。
EXPLORER.EXE /e,/root,e:\work
この項はhttp://www.nifty.ne.jp/forum/fgateway/gwfaq2/soft/w95/s130908.htmlを参照したというか、ほとんどコピペしました。
OS起動時に、勝手にIPアドレス 239.255.255.250 に情報が送信されることがあります。はじめて気づいたときは「をを!俺、変なもん拾ってインストールしちゃったか?」とか思いましたが、ぜんぜんそんなんじゃありませんでした。
詳しくはwinFAQの「Windows Me/XP 起動時に 239.255.255.250 へのパケットが送信されます」を参照してくれればよいんですが、まあ「ユニバーサルプラグ&プレイ」機能が対応機器を探すために送信してるということのようです。
ビビらすなよ。
mpeg4-v3 を Windows Media Player 8 (WMP8)で再生すると、音声だけ再生されて映像が再生されません。これはどう頑張っても無理みたいです。WMP6 で再生できるのでそっちを使いましょう。WMP6 は C:\Program Files\Windows Media Player\mplayer2.exe にあります。この際 .avi ファイルは全てこの WMP6 に関連付けしておいてもよいかと。
この項はhttp://missinglink.systems.ne.jp/018.htmlを参照しました。
DivX5のインストーラを用いてインストールしようとすると「Serching for Installed...」というダイアログメッセージが出た後、しばらくしてインストーラが終了してしまうことがあります。このダイアログはキャンセルして構いません。実際、キャンセルしてもインストールできます。
また、インストール先の指定などを行なった後、実際にインストール作業が開始されますが、ここでもインストーラが終了してしまうことがあります。これは旧バージョンのDivXがインストールされているためです。旧バージョンをアンインストールした後、再度DivX5をインストールしてみてください。。旧バージョンをアンインストールすることが出来ない(スタートメニューにアンインストールの項目がない、プログラムの追加と削除に項目がない等)場合は、旧バージョンをインストールし直してみるとよいでしょう。多分それで旧バージョンをアンインストールできるようになります。
ボリュームコントロールで音量を変えても、いつのまにか変える前の音量にもどってしまうことがあります。これはサウンドを扱うソフトウェアが独自に音量設定を持っていることが原因かも知れません。
たとえばMP3プレイヤー「Wyvern」は独自のWAVE音量を持っており、ボリュームコントロールでWAVEの音量を変えたとしても、次の曲を再生するとWyvern独自のWAVE音量に戻ってしまいます。この場合、Wyvern側でWAVE音量を設定しておくしかないです。
「デスクトップ」「スタートメニュー」「(右クリックメニュー)送る」などの特殊フォルダは、通常 C:\Documents and Settings\(ユーザー名) などにおかれていますが、これは変更することが出来ます。本来、レジストリをいじって設定するものですが、Microsoftにより配布されているTweakUIというソフトを用いれば、GUI上で設定することが出来ます。
特殊フォルダのターゲット変更以外にもいろいろ出来るんで、入れといて損はないでしょう。
環境変数などの基本的なシステムデータを、コマンドプロンプト上で以下のようにすることでテキストファイルに書き出すことが出来ます。
perlにおいて、配列 @ARGV には実行時の引数が格納されており、スクリプトが処理対象とするファイルを指定するなどの使い方ができます。そこで、エクスプローラ上で処置対象ファイルをperlスクリプトファイルにドラッグ&ドロップすることで、引数指定と起動を同時に行いたくなります(perlスクリプトファイルを実行ファイルと同じように扱いたい)。
ところが、perlスクリプトファイルに他のファイルをドラッグ&ドロップすることはできません(perlスクリプトファイルの拡張子とperlコンパイラが関連付けされていても同様です)。だからといって、いちいち、実行時引数をキーボードから入力するのはめんどくさい! ドラッグ&ドロップで何とかしたい!
Drop on Scriptというソフトを使えばできるようになりそうです。けど、「共用パソコンなのでシステム周りいじりたくないなぁ」というような場合は、妥協案として、バッチファイルを作ってそれにドロップするという方法があります。
バッチファイル内では、バッチファイルを起動したときの引数を変数「%1,%2...%9」に格納しています。そしてバッチファイルに対してはドラッグ&ドロップによる引数指定と起動が可能です。なので、
また、ちょっと違った方法として、バッチファイルにperlスクリプトを埋め込む方法もあります。
@echo off perl -x %0 %1 goto endofperl #!perl # #ここにperlスクリプト書く # __END__ :endofperl
「-x」はperlの起動オプションで、与えられたスクリプトのうち、「#!」で始まり[perl」で終わる行までを読み飛ばします。この場合「#!perl」の行まで読み飛ばします。また perl は「__END__」の行でスクリプト実行を終了します。
「%0」はバッチファイルで使えるパラメータで、バッチファイルそのもののファイルパスを表します。
「%1」はバッチファイルで使えるパラメータで、バッチファイル起動時に与えられた1つ目のパラメータを表します。
「goto」はバッチファイルで使えるコマンドで、あとにラベル名(この場合「endofperl」)を指定すると、当該ラベル行(この場合、先頭にコロンのついた「:endofperl」の行)にジャンプします。
というわけでこのバッチファイルは、まずこのバッチファイル自体(%0)を perl インタプリタに渡して起動します。perlインタプリタは「#!perl」から「__END__」までを perlスクリプトとみなして実行します。perl の実行が終了すると、バッチファイルは「goto」によりperlスクリプト部分を読み飛ばして、終了します。
バッチファイルにドロップされたファイルは、「%1」としてperlに渡されます。perl内からは「@ARGV[0]」で参照できます。
Rubyにも「-x」オプションがあるので同じことができます。こんなことできるように設計したやつ、スゲーな。
ALT+「カタカナ・ひらがな・ローマ字」を押すたびに切り替えることができます。
DOSの START コマンドはファイルの関連付け起動や、プロセスの優先度指定、起動時のウインドウサイズ指定などができる、便利なコマンドです。
windows上では、起動するプログラムのパスにスペースを含む場合、通常はパス全体を2重引用符で囲みますが、START コマンドでそれをやると、もう一枚DOS窓が開くだけで、何も起こりません。なんだこりゃ。
START コマンドは、第一引数が2重引用符で囲まれていると、それを「タイトル」とみなすようです。(コマンドプロンプトが立ち上がる場合のタイトルになる。) なので、ダミーで空のタイトルを入れてやるとよいです。
InternetExplorer で表示したファイル(インターネット一時ファイル)は、C:\Documents and Settings\(user_name)\Local Settings\Temporary Internet Files フォルダに保存されていて(変更可能)、Explorer で見てもちゃんとそこにあるように表示されます。しかし、スクリプトなどでそのインターネット一時ファイルにアクセスすると、そんなファイルは無いと言われます。えー、あるじゃねぇかよう! でも、右クリックのメニューが通常と違うような・・・?
インターネット一時ファイルの実体は別のところにあるのですが、ゲイツさんが気を利かせて「Explorer では、こういう風に見えたほうが便利だろ?」ということで、そこにあるように見えているだけです。実体は Temporary Internet Files フォルダ内に Content.IE5 フォルダがあり、さらにその中の英数字羅列のフォルダの中にファイルはあります。Content.IE5 フォルダを Explorer で見る事はできません(?)がアドレスバーに C:\Documents and Settings\(user_name)\Local Settings\Temporary Internet Files\Content.IE5 などと入力すると中を見ることができます。またスクリプトでも同様のパスを指定すると、確かに存在を確認できます。
エクスプローラーの ツール > ファイルオプション で見られる「ファイルの種類」に、「ファイルフォルダ」と「フォルダ」というのがあるんだけれど、どう違うのだろう?
「ファイルフォルダ」は、いわゆるフォルダのことです。
一方「フォルダ」は、「ファイルフォルダ」の他に、ドライブ、コントロールパネル、ごみ箱などを含んでいます。
なので、「ファイルフォルダ」の関連付けを設定した場合は、いわゆるフォルダにしか適用されませんが、「フォルダ」に関連付けを設定した場合は、いわゆるフォルダだけでなく、ドライブやコントロールパネル、ごみ箱などにも適用されます。
http://nobumasa-web.hp.infoseek.co.jp/faq/windows/relate/folder/folder.htmlを参照。
ドライブのプロパティーで確認できる使用領域のサイズが、ドライブ内の全ファイルのサイズを足した値より大きいぞ?なぜだろう。
ファイル以外でドライブの領域が使用されています。以下の用途で使用されている可能性があります。
通常、キーボードショートカット Win+E はエクスプローラの起動が割り当てられていますが、いつの間にかエクスプローラが起動せず「パラメータが間違っています。」というダイアログが表示されるようになってしまいました。
原因は、 フォルダの右クリックメニュー「エクスプローラ」を消してしまったからのようで、戻すとキーボードショートカットが効くようになりました。
Contexterというソフトは 右クリックメニューの編集を行えるソフトで、項目を「削除」すると本当に元に戻せませんが、「表示」のチェックボックスを外すだけなら、あとでチェックしなおすことで元に戻せます。
一応、消してしまったキミのために、今回元に戻した項目を書いておこう。
拡張子 : Folder ファイルの種類 : フォルダ 表示するテキスト: エクスプローラ(&X) 実行するプログラム : C:\WINDOWS\Explorer.exe コマンドライン引数 : /e,/idlist,%I,%L
Windows Media Playerをインストールしていると、音声、動画ファイルの右クリックメニューに「再生待ちに追加」などが表示されて、ウザイです。そんなの使いません。
表示しないようにするには、レジストリエディタを開いて、キー「{F1B9284F-E9DC-4E68-9D7E-42362A59F0FD}」の右クリックメニュー「名前の変更」で、キーの名前の先頭に セミコロンを追加してコメントアウトします。その後、メニュー > 表示 > 最新の情報に更新 を実行して、反映させます。これで「再生待ちに追加」が非表示になります。
その他の項目についてはマイコミジャーナルの記事を参照
ファイルをごみ箱に捨てるだけなのに、なんか数十秒もハードディスクにアクセスするようになってしまいました。
この現象は、デフラグをやればましになりました。デフラグのやり方は以下のとおり。
タイトルバーの「閉じる」「最大化」「最小化」って、なんか小さくて押しにくい。クラシックスタイルだと、特に。画面のプロパティーで大きさ変えられるけど、縦横両方換わっちゃうんだよね。横幅だけ変えられないものかね。
レジストリ内に、そういう設定があります。「HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics」のエントリ「CaptionWidth」が通常 -270 に設定されていますがこれを -360位にすると約1.5倍の幅になります。縦も変えたい場合はエントリ「CaptionHeight」の値をいじればいい。
,NET Framework 3.5 SP1 のインストールがうまくいきませんでした。ぐぐってみると、3.5のBeta版が入ってるとダメなので事前にアンインストールせよ、というような内容がありましたが、そもそも入っていませんでした。それでもとりあえず 3.5 をアンインストールしてみるかとやってみたのですが、アンインストールも失敗します。
なんやかんや調べてみると、どうも Windows インストーラ サービスとやらがぶっ壊れていたらしい。なので、Windows インストーラを利用したソフトのインストールが失敗していたようです。
直し方は、Windows XP または Windows Server 2003 を実行しているコンピューターでプログラムを追加または削除すると、エラー メッセージ "Windows インストーラー サービスにアクセスできませんでした" が表示されるを参照。「方法 1: Windows インストーラーを登録する」を実行すると ,NET Framework 3.5 SP1 をインストールできるようになりました。
バッチファイルを作成して、タスクに登録して自動実行させようとすると、バッチファイルの起動に失敗しました。タスクからではなく、エクスプローラ上でバッチファイルをダブルクリックすると起動できるのに。
ファイル名としては使用できるが、コマンドプロンプト上では特別な意味を持つ文字というのがあります。
バッチファイルを指定するフルパス内にこれらの文字が入っている場合、そのままフルパスを指定しても正しく解釈されません。「^ (ハット)」をこれら文字の前においてエスケープすればいいです。タスクについても、プロパティを開いて、実行するファイル名欄で上記文字をエスケープすればいいです。
エクスプローラはたいてい詳細表示で使うんですけど、mp3の入ったフォルダ開くと勝手に「タイトル」とか「時間」とかの項目が出てきてウザイ。変わらないようにしたい。
つWindows Vistaのエクスプローラにおける自動フォルダ・タイプ設定を無効にする
Microsoft Office 2007 以降をインストールした場合、エクスプローラの右クリックメニュー>新規作成で作成できる Office 文書は、Office 2007 以降の新形式となります。Office 97-2003 の旧形式ファイルを作成できるようにしたいです。
以下は、Excel ファイルのやり方。
同様に Word は、ファイル名が「winword8.doc」、レジストリのキーが「HKEY_CLASSES_ROOT\.doc\Word.Document.8\ShellNew」です。
PowerPoint は、ファイル名が「pwrpnt11.ppt」、レジストリのキーが「HKEY_CLASSES_ROOT\.ppt\PowerPoint.Show.8\ShellNew」です。
Office 2007でエクスプローラから97-2003形式の新規ファイルを作成できるようにする − @ITを参照しました。
title コマンドでタイトルを変更できる。
最近の Windows のファイル名の文字コードは UTF-8 とのことなので、Shift-JISで使えなかった文字が使えるようになっている。UTF-8 ファイル名のファイルをバッチファイルで扱うために、バッチファイルを UTF-8 で保存して実行したのだが、これはうまく動きません。バッチファイルは Shift-JIS が前提なのだそうです。何とかならんのか。
UTF-8 のバッチファイルの先頭に、以下を追加すればよいらしいです。
chcp 65001
「chcp」は文字コードを設定するコマンドで、「65001」は UTF-8 を意味するらしい。
UTF-8のバッチファイルが文字化けする時の対処3選 - なゆたり を参照しました。
以下は、PATHに「C:\Ruby27-x64\bin」を追加したコマンドプロンプトを開くバッチファイル。追加したPATHはこのコマンドプロンプトや、ここから起動されたプログラムに対してのみ有効。
((cmd_temp.bat)) set PATH=%PATH%;C:\Ruby27-x64\bin cmd
[コントロールパネル] > [管理ツール] > [コンピュータの管理]を起動して、ツリー内の[システムツール] > [イベントビューア] > [アプリケーション]を展開。右のリスト内のソースがwinlogonとなっている項目がログです。chkdscを実行した時間で分かれていますので、見たい項目をダブルクリックで開いて下さい。
ちなみにwinXPにスキャンディスクはなく、同等の機能を持つものがchkdscです。
windowsXPでは標準でzip形式アーカイブを扱えるようになってますが、はっきりいってzip形式だけ扱えたところで邪魔なだけです。無効化してしまいましょう。方法は、スタートメニューの「ファイル名を指定して実行」に「regsvr32 /u %windir%\system32\zipfldr.dll」と入力して実行すればよいです。逆に再度利用する場合は「regsvr32 %windir%\system32\zipfldr.dll」とすればよいです。
この項はhttp://www.zdnet.co.jp/help/tips/windows/w0439.htmlを参考にしました。
メモ帳に関連付けられたファイルを任意のテキストエディタで開くのに便利な「メモ帳トラッパー」(IE6使用の場合は「メモ帳トラッパー」をIE6対応に」を追加)ですが、普通にインストールしてテキストエディタを設定しても、IEの「ソースの表示」ではメモ帳が起動してしまうことがあります。
原因はよくわかりませんが、メモ帳トラッパーをセーフモードでインストールするとうまくいくようです。
デジタルカメラやスキャナといったイメージングデバイスから画像を簡単に取り込むための機能である「Windows Image Acquisition(WIA)」を停止することで、Explorerを高速化することができます。
OSが起動してデスクトップが表示された後、ハードディスクへのアクセスがしばらく続くことがあります。というか、毎回そーなんですけど。原因は不明なんですか、スタートアップ時に「Workstationサービス」が起動されるのを無効にしてやるとマシになりました。
ただし、ネットワーク関連のサービスなので、無効にすることで他に出来なくなることがあるかもしれません。「Workstationサービス」の依存関係なんかを気にしてみてください。
各サービスの内容は、各項目のプロパティーダイアログ上の「全般」タブ > 説明 欄に記載されています。
エクスプローラの左に表示されている「ナビゲーションウィンドウ」には、通常「お気に入り」「ライブラリ」「ホームグループ」「コンピュータ」「ネットワーク」の項目が並んでいます。上の三つは使わないので消したい。
ちょイカス エクスプローラーというのを使えばできるそうですが、自力で、レジストリを編集して実現してみます。
「お気に入り」を消すには、まず以下の以下のキーをさがします。無ければ作成してください。
HKEY_CURRENT_USER └ Software └ Classes └ CLSID └ {323CA680-C24D-4099-B94D-446DD2D7249E} └ ShellFolder
ここに「DWORD値」を追加、名前を「Attributes」、値を「a9400100」とします。この後 Windows を再起動すれば、設定が反映されているはずです。元に戻すには「Attributes」の名前の項目を削除すればよいです。
「ライブラリ」を消すには、同様に以下のキーをまず探す or 作成してください。
HKEY_CURRENT_USER └ Software └ Classes └ CLSID └ {031E4825-7B94-4dc3-B131-E946B44C8DD5} └ ShellFolder
ここに「DWORD値」を追加、名前を「Attributes」、値を「b090010d」とします。
「ホームグループ」を消すには、以下のキーをまず探す or 作成してください。
HKEY_CURRENT_USER └ Software └ Classes └ CLSID └ {B4FB3F98-C1EA-428d-A78A-D1F5659CBA93} └ ShellFolder
ここに「DWORD値」を追加、名前を「Attributes」、値を「b094010d」とします。
Windows7のエクスプローラーをカスタマイズしてみた:ことしつを参照しました。
Windows7 では、ファイル拡張子とアプリケーションの関連付けが厄介になりました。「assoc」「ftype」というコマンドが用意されているので、それを使います。
例として、「.rb」ファイルをRubyインタプリタに関連付け、「.rb」への引数もRubyインタプリタに渡すようにします。
まず、コマンドプロンプトを管理者として実行します。
つぎに「assoc」コマンドにて、ファイル拡張子にファイルタイプを設定します。コマンドプロンプト上で以下のコマンドを実行。「RubyScriptFile」の部分は自分の好みで構いません。
> assoc .rb=RubyScriptFile
次に「ftype」コマンドにて、ファイルタイプとアプリケーションの関連付けをします。コマンドプロンプト上で以下のコマンドを実行。
> ftype RubyScriptFile=c:\ruby\bin\ruby.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
実際の「.rb」ファイル実行時には、%1 に「.rb」ファイル、%2 以降に「.rb」ファイルへの引数が渡されて実行されるようになります。
【ハウツー】レッツ! Windows 7 - トラブルシューティング編(3) (2) 特定拡張子のアプリケーション関連付けを追加する | パソコン | マイナビニュース:を参照しました。
Android端末に音楽ファイルを保存したが、各種音楽プレイヤー上で音楽ファイルが表示されないことがあります。たとえばBitTorrent Sync(for Android 1.2.14)で同期されたファイルが、SH-07E標準のミュージックアプリでは表示されません。
音楽プレイヤーがリストアップしているファイルは、音楽プレイヤーが直接ストレージをスキャンして探したものではないそうです。Androidのメディアストレージというプロセスがスキャンしておいた結果を利用していて、音楽ファイル保存後にこのスキャン結果が更新されていないので、音楽プレイヤーは新しいファイルを検知できないということのようです。
対処方法は2つ。
mrwk update: Androidのメディアストレージによるキャッシュを更新するを参照しました。
GMailなどのデータを自動的に同期させるためには、設定にてアカウント、サービスごとに ON / OFF すればよいのですが、チェックボックスが表示されないことがありました。これは、データの自動同期機能全体がOFFになっているためです。データの自動同期を ON にするには、設定 > データ使用 でメニューを開き、データの自動同期のチェックボックスを ON にすればよいです。
ところで、このチェックボックスが勝手に外れることがあるようなんだけど、なんでや。
Selenium というものを使うと、自作プログラムからブラウザを操作して、情報を得たりできます。以前はプログラミング言語別の Selenium ライブラリだけではなく、ドライバやブラウザを用意する必要がありましたが、Selenium 4.11 以降ではそれらを自動で準備してくれるので、Ruby 実行環境をインストール後、以下で動くはずなんですが、Raspberry Pi 上では動いてくれません。
$ gem install selenium-webdriver
require 'selenium-webdriver'
session = Selenium::WebDriver.for :chrome
session.navigate.to "https://www.google.co.jp/"
sleep(5)
query=session.find_elements(:class, 'gLFyf')[0]
query.send_keys('Raspberry Pi')
query.send_keys(:enter)
sleep(5)
session.quit
やっぱりドライバが必要なんかな、ブラウザは chromium が入ってるし大丈夫やろ、と以下でドライバをインストールしたうえで上のプログラムを動かしても、やっぱり駄目です。
$ sudo apt install chromium-chromedriver
詳しいことはわかりませんが、Selenium がドライバやブラウザを準備してくれるというのは、Raspberry Pi 上では機能していないため、ドライバを自前で準備したうえで、ドライバの場所をプログラム上で教えてやる必要があるようです。というわけで、Raspberry Pi 上で動くプログラムは以下です。
require 'selenium-webdriver'
service=Selenium::WebDriver::Service.chrome
service.executable_path='/usr/bin/chromedriver' #これが重要
session = Selenium::WebDriver.for :chrome, service: service
session.navigate.to "https://www.google.co.jp/"
sleep(5)
query=session.find_elements(:class, 'gLFyf')[0]
query.send_keys('Raspberry Pi')
query.send_keys(:enter)
sleep(5)
session.quit
なお、ドライバの場所は標準では /usr/bin/chromedriver ですが、以下のコマンドで確認できます。
$ which chromium-chromedriver
以下のサイト参照しました。
以下のシェルスクリプトは、今日が祝日なら終了ステータス 0 を返し、祝日でないなら終了ステータス 1 を返します。国民の祝日APIを利用しています。ファイルのパーミッション 所有者のみ実行 が必要です。
#!/bin/bash
today=$(date +%Y-%m-%d)
url="http://api.national-holidays.jp/$today"
if curl -s $url | grep -q "$today"; then
# 祝日なら 0 を返す
exit 0
else
# 祝日でないなら 1 を返す
exit 1
fi
これを today_is_holiday.sh などというファイル名で保存しておくと、以下のようにして今日が 祝日なら / 祝日でないなら コマンド実行というようなことができます。cron で便利なんじゃないですかね?
$ ./today_is_holiday.sh && echo '今日が祝日であれば表示される'
$ ./today_is_holiday.sh || echo '今日が祝日でなければ表示される'
Apache をインストールすると、設定として Raspberry Pi OS 起動時に Apache も起動するようになっているのですが、気づいたら Apache 起動に失敗するようになっていました。具体的には、status を確認すると以下のような内容が表示されます。
$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Mon 2024-11-25 20:30:32 JST; 2min 24s ago
(中略)
11月 25 20:30:32 raspberrypi apachectl[564]: (99)Cannot assign requested address: AH00072: make_sock: could not bind to address 192.168.0.2:80
(後略)
ターミナルにて、以下のコマンドを実行すると正常に起動するので、Apache の設定に何か問題があるわけではないようです。
$ sudo systemctl restart apache2
どうやら、ネットワーク関連が起動し終わる前に Apache が起動してしまい、ネットワーク関連がおかしいので起動できないでいるようなのです。
解決するには、OSの起動から時間がたってから、Apache が起動するようにすればよいです。具体的には、まず以下のコマンドで自動起動をOFFにします。
$ sudo systemctl disable apache2.service
次に、cron に OS起動から1分遅れて Apache をリスタートするように設定します。
$ crontab -e
# 設定ファイルに以下の一行を追加
@reboot sleep 1m; sudo systemctl restart apache2
これで、OS起動から十分時間が経って、ネットワーク関連も起動し終わったタイミングで Apache が起動します。
なお、もともと設定されていた OS 起動時の Apache 起動を復活させるには以下のコマンドです。
$ sudo systemctl enable apache2.service
起動時にメインフォームを表示しないようにするには、メインフォームの visible プロパティの値を false にするだけではダメです。プロジェクトファイル(.dpr)中で、Application.Run よりも前に Application の ShowMainForm プロパティーの値を false にしておく必要があります。
Delphi6 ヘルプ「TApplication.ShowMainForm」の項を参照してください
このエラーの意味するところは「オブジェクトの内容の変更が禁止されている(フリーズしている)ので、変更できません。」です。
いや、俺、変更しようなんてしてねぇよ!と思うかもしれませんが、ちゃんとコードを眺めてみましょう。たとえば以下のコードは一見よさげですが・・・
i=ARGV[0] i[0]='y' #=> can't modify frozen string (TypeError)
スクリプトに引数が与えられた場合、2行目で上記エラーが発生します。ARGV[0]が定数だからです。2行目で ARGV[0] を直接変更しようとはしていないように見えますが、そうではありません。変数 i はARGV[0]のコピーではなく、ARGV[0]そのものだからです。
まだこの例では簡単ですが、別の変数に変数 i が代入されて、さらに別の変数にそれが代入されて・・・となっていると、分かりづらいものです。
エラーが出ないようにするには dup メソッドで値を複製すればよいです。
i=ARGV[0].dup # ARGV[0]の内容のみを複製して、i に代入する i[0]='y'
WAVE音量を変えるには以下のようにします。(参考:windows-pr、MSDNライブラリ)
require 'Win32API' left=0xffff #左チャネル 0x0000(無音)から0xffff(最大)まで right=0xffff #右チャネル 0x0000(無音)から0xffff(最大)まで api=Win32API.new('winmm','waveOutSetVolume','PL','I') api.call(-1,left*(16**4)+right)
ただ、俺が変えたいの、「ボリュームコントロール」なんだよなぁ。これはデバイスに依存していて、変えるの大変らしい。他言語で書かれたサンプル見てもよく分からん。
とりあえず、nircmd の sysvolume 系コマンドをつかうこととする。
eRubyスクリプトを処理するクラス ERB のインスタンスメソッド #run、#result には、引数として binding というものが指定できますが、これって何? 具体的に何を渡せばいいの?
Binding というクラスがあって、それのインスタンスを渡せばよいそうです。
この引数は、eRubyスクリプトをコード中のどこで実行したことにするのか、ということを指定するために存在します。引数にどんな binding を渡すかによってeRubyスクリプトの挙動が変わります。例えば、eRubyスクリプト中で同じ変数名であっても、トップレベルの binding と ブロック内の binding では、変数のスコープが異なるので、結果が異なるかもしれません。たいていの場合、#run なり #result なりを行う場所での binding で処理することになると思いますので、その場合は組み込み関数 binding を指定すればいいと思います。
組み込み関数 eval の説明なんかも参照すればよいかも。
なんに使うのか全く良くわからないということにしておきますが、以下のような正規表現リテラルがあるとします。
エスケープする必要のない文字までエスケースしているをの抜きにしても、後で見返すとさっぱり分かりませんよね。というわけで、次にように分割して記述しておくと、ちょっとは見やすいのではないかと。
ようは、区切れるところで区切って、個別に文字列として名前をつけて、あとで連結して正規表現オブジェクトを作ってるだけです。
いや、まあ、それにしても分からないわけですが。セガのアーケードゲーム「WCCF」のカードリストのページから、カードのパラメータを取得するために作った正規表現だ、なんて全く分からないですよね。
メソッド定義などで、引数のクラスに応じて動作を変えたいということが割とあります。そんなわけで以下のコードを書いてみましたが、これは目的の動作をしてくれません。
def my_class(arg) case arg.class when String puts('My class is String.') else puts('My class is ...?') end end my_class('test') # => My class is ...?
メソッド my_class に与えた引数のクラスは String ですから、My class is String. と表示して欲しかったのですが、そうはなりません。
なぜこんなことになるのだろうか? case文は === メソッドを使って比較を行います。つまり、when String の行では、String==='test'.class が評価されています。('test'.class===Stringではありません。レファレンスマニュアルの制御構造 case の項参照) で、Class#===(arg) は arg.kind_of?(Class) と定義されています。(実際は Class クラスのスーパークラスである Module にて定義されています。)なので、先ほどの String==='test'.class は、'test'.class.kind_of?(String) と同じです。ちょっと評価を進めると、String.kind_of?(String) となり、「クラス String」 が 「クラス Stringのインスタンス」かどうかということになります。これは 偽 です。
じゃあ、どうすればいいのかといいますと、単純に以下のようにすればよいです。
def my_class(arg) case arg when String puts('My class is String.') else puts('My class is ...?') end end my_class('test') # => My class is String.
こうすれば when String の行は String==='test'、つまり 'test'.kind_of?(String),であり、「'test'」が「クラス String のインスタンス」かどうかを評価していることになり、期待通りの動作をします。
以下は、新たにExcelを立ち上げ、C列の1行目から20行目に数式と条件付き書式を設定するスクリプトです。(定数をロードするのに数秒かかります。)
require 'win32ole' module ExcelConst end xl=WIN32OLE.new('Excel.Application') xl.Visible=true WIN32OLE.const_load(xl, ExcelConst) book=xl.Workbooks.add sheet=book.Worksheets.add range=sheet.Range('C1','C20') range.each do |cell| cell.Formula='=D1' cell.FormatConditions.Delete cell.FormatConditions.Add({ 'type' => ExcelConst::XlCellValue, 'operator' => ExcelConst::XlEqual, 'formula1' => '=D1'}) end
・・・なんですけど、作成されたシートはちょっと変です。セルに設定された数式は期待した通りなんですが、条件付き書式の参照セルの場所が違っています。例えばセル C20 には数式 「=D1」が設定されていますが、条件付き書式には「=F20」が設定されています。どちらも同じ値「=D1」を設定しているはずなのに。
どうやら、条件付き書式に値が書き込まれるとき、その値はまずセル A1 を基準にした参照セルとして解釈されてから、解釈後の値が書き込まれているようです。例えば、例えばセル C20 の条件付き書式に値が書き込まれるとき、設定する値「D1」はセル A1 から見た位置 右3下0 と解釈され、セル C20から 右3下0 のセル F20 が書き込まれるという具合です。
なぜ条件付き書式のほうだけそんなことになるのか不明です。とりあえずは、参照セルの指定を絶対参照にすればよいです。(「$D$1」のように値の前にドル記号をつける。)相対参照にしたいときはどうすればいいんだろうな。
Windows Scripting Host の WScript.Shell オブジェクト を利用して、任意のタイトルを持つウインドウをアクティブにすることができます。下記は、タイトルに「WWWC」を含むウインドウをアクティブにするスクリプトです。
「該当するウインドウが複数ある場合は、どれが選択されるか決まっていない」という点に注意が必要です。タイトルの代わりに ProcessID を与えることで回避できますが、ProcessID が取得できない場合は、なるべく一意に決まるように指定するしかないです。
また、「失敗しても終了する」点にも注意が必要です。これは、AppActivate メソッドが、成功すれば true を、失敗すれば false を返すことを利用して、下記のように成功するまで繰り返せばよいです。
以下は InternetExplorer を新たに起動して、Google Japan にアクセスし、タイトルを改ざんするスクリプトです。
これはうまくいくんですが、複数のスペースが連続した文字列、例えば「G oogle」をタイトルに指定した場合、連続スペースが1つのスペースに変換されてしまいます。
何でだろうな(投げっぱなし)
Windows XP であれば、Win32OLE の UserAccounts.CommonDialog オブジェクトを利用して表示することが可能です。
require 'win32ole' objDialog = WIN32OLE.new("UserAccounts.CommonDialog") objDialog.Filter = "全てのファイル (*.*)|*.*|テキストファイル (*.txt)|*.txt" objDialog.InitialDir = "C:\\" if objDialog.ShowOpen then puts objDialog.FileName else puts 'canceled' end
ただし、Windows XP 未満では UserAccounts.CommonDialog オブジェクトは用意されていないので、この方法は使えません。代替案として、InternetExplorer を利用する方法があります。初期ディレクトリの設定とか、拡張子によるフィルタリングとかできませんけど。
require 'win32ole' ie=WIN32OLE.new("InternetExplorer.Application") ie.Navigate("about:blank") ie.Document.GetElementsByTagName('BODY').Item(0).InnerHTML = '<INPUT type="file" id="FileOpen">' ie.Document.GetElementById("FileOpen").Click puts ie.Document.GetElementById("FileOpen").Value ie.Quit
あと、Ruby標準添付ではないですが、VisualuRuby の SWin::CommonDialog モジュールの openFilename メソッドを使えば、たぶんWindowsのバージョンによらず実現できます。ActiveScriptRuby には VisualuRuby が添付されています。
require 'swin' fname=SWin::CommonDialog.openFilename(nil,[["all(*.*)","*.*"]],0x1000,'select file') puts fname
SWin::CommonDialog モジュールについては配布サイトのリファレンスを参照。リファレンス中の第3引数 flag についてはたぶんここらへんを参考にすれば良いのでは?とりあえず 0x1000 を指定すると、存在しないファイルが入力されたとき警告が表示されます。
というか、たぶん Windows API を直接いじればできるんだろうなぁ。そんな科学力持ってないけど。
require 'open-uri' src='http://www.yahoo.co.jp/' dst='C:\yahoo_top.html' File.open(dst, 'wb'){|f| f.write(open(src).read) }
バイナリファイルでもいけまっせ。
Rubyの配列のインデックスは 0 から始まりますが、MSOfficeのコレクションオブジェクトのインデックスは 1 から始まります。
以下のコードは、配列 sheet_name にしたがって、順番にシートの名前を変更しようとしています。 が、コレクションオブジェクト Worksheets の 0 番目を参照しようとしたときにエラーとなります。
require 'win32ole' app=WIN32OLE.new('Excel.Application') app.visible=true book=app.Workbooks.Add sheet_name=['first','second','third'] sheet_name.each_with_index{|name,idx| book.Worksheets(idx).Name=name #=> idx=0 のとき WIN32OLERuntimeError }
Marshal.dump で出力したデータをファイルに書き出した後、ファイルからデータを読み込んで Marshal.load でオブジェクトを復元しようとしたとき、復元ができずエラーとなることがあります。
もしかして、ファイルをテキストモードで開いてませんか? マーシャルデータはバイナリデータなので、ファイルへ読み書きする場合は、ファイルをバイナリモードで開く必要があります。
ary=[1,2,3,4] data=Marshal.dump(ary) File.open('c:\test.dat','wb'){|f| f.write(data)} data2=File.read('c:\test.dat') ary2=Marshal.load(data2) p ary2
以下は、Excelを開き、新たなブック、シートを作成し、そのシートの「横256列、縦n(=10000)行」の領域に「1」を書き込むコードです。が、書き込まないまま終了してしまいます。
require 'win32ole' app=WIN32OLE.new('Excel.Application') app.Visible=true sheet=app.Workbooks.Add.Worksheets.Add n=10000 ary=Array.new(n,Array.new(256,1)) start_cell=sheet.Cells(1,1) end_cell=sheet.Cells(ary.size,256) sheet.Range(start_cell,end_cell).Value=ary
環境によって違うかもしれませんが、ウチの環境では n=2330 以下ではOK、n=2331 以上では書き込めませんでした。Ruby がエラーを出しているわけではなく、Windows のエラーのようです(エラーコード:-1073741819?)。
エラーの内容は分かりませんが、回避するには一度に書き込まず、分割して書き込むようにすれば良いです。以下では step=1000行ずつ書き出しています。チョット時間がかかりますが書き込むことができました。
require 'win32ole' app=WIN32OLE.new('Excel.Application') app.Visible=true sheet=app.Workbooks.Add.Worksheets.Add n=10000 ary=Array.new(n,Array.new(256,1)) step=1000 0.step(ary.size-1,step){|i| ary_t=ary[i,step] start_cell=sheet.Cells(i+1,1) end_cell=sheet.Cells(i+1+ary_t.size-1,256) sheet.range(start_cell,end_cell).Value=ary_t }
また、Exerb で 実行ファイルに変換して実行すると、step=1000行ずつでも書き出せず、step=50行ずつにしてようやく書き出せるようになりました。
Excelから大量の値を取得したり、書き込んだりしようとすると、結構時間がかかります。何とかして高速化する方法を以下に示します。といっても、スーパーハカーではないので、「いかにして作成するwin32oleオブジェクトの数を減らすか」という方法だけですけど。
以下は、セルから値を繰り返し取得するコードです。
# 準備 require 'win32ole' xl=WIN32OLE.new('Excel.Application') xl.Visible=true xl.Workbooks.Add.Worksheets.Add.Cells.Item(1,1).Value=1 n=1000 # 例1-1:毎回、Excel アプリケーションオブジェクトからセルまで辿っていく start=Time.now n.times{ a=xl.Workbooks(1).Worksheets(1).Cells.Item(1,1).Value } p Time.now-start #=>14.062 # 例1-2:ワークシートまで辿った結果を変数 sheet に格納しておいて、使いまわす start=Time.now sheet=xl.Workbooks(1).Worksheets(1) n.times{ a=sheet.Cells.Item(1,1).Value } p Time.now-start #=>9.375
毎回、Excelアプリケーション -> ワークブック -> ワークシート と辿っていくのは無駄なので、ワークシートを変数に格納しておいて、使いまわすようにすることで高速化できます
以下は、セルから値を繰り返し取得するコードです。
# 準備 require 'win32ole' xl=WIN32OLE.new('Excel.Application') xl.Visible=true sheet=xl.Workbooks.Add.Worksheets.Add sheet.Cells.Item(1,1).Value=1 n=1000 # 例2-1:コレクションオブジェクトから Item メソッドを使って要素を取り出す start=Time.now n.times{ a=sheet.Cells.Item(1,1).Value } p Time.now-start #=>9.375 # 例2-2:コレクションオブジェクトに引数を与えて直接要素を取り出す start=Time.now n.times{ a=sheet.Cells(1,1).Value } p Time.now-start #=>6.907
cells は複数のセルを集めたコレクションオブジェクトです。コレクションオブジェクトから要素(セル)を取り出すために、Item というメソッドが用意されていますが、これを使わずに Cells に直接引数を与えて要素を取り出したほうが速いです。
以下は、縦100x横10セルの範囲に値を書き込むコードです。
# Excel の準備 require 'win32ole' xl=WIN32OLE.new('Excel.Application') xl.Visible=true sheet=xl.Workbooks.Add.Worksheets.Add # 書き込む値(配列)の準備 row_num=100 col_num=10 ary1=Array.new(row_num,Array.new(col_num,1)) ary2=Array.new(row_num,Array.new(col_num,2)) # 例3-1:セルごとに値を設定する start=Time.now ary1.each_with_index{|item_a,idx_a| item_a.each_with_index{|item_b,idx_b| sheet.cells(idx_a+1,idx_b+1).Value=item_b } } p Time.now-start #=>6.953 # 例3-2:配列をそのまま Excel に渡す start=Time.now r=sheet.range(sheet.cells(1,1),sheet.cells(row_num,col_num)) r.value=ary2 p Time.now-start #=>0.032
セルごとに値を書き込もうとすると、そのたびごとにwin32oleオブジェクトを作成しなければならないので遅いです。値を配列(配列の配列)で用意し、同じ大きさの range オブジェクトの Value プロパティに渡してやると一気に書き込めます。
ただし、あまり多くの値を一度に書き込むことはできないようです。[Ruby] Excelに大量のデータを一度に書き込めないを参照してください。
以下は、複数の非隣接セルの背景色を設定するコードです。
#準備 require 'win32ole' xl=WIN32OLE.new('Excel.Application') xl.Visible=true sheet=xl.Workbooks.Add.Worksheets.Add cells=['A1','B2','C3','D4','E5','F6','G7','H8','I9'] # 例4-1:一つずつ設定する start=Time.now cells.each{|cell| sheet.Range(cell).Interior.ColorIndex=3 } p Time.now-start #=>0.109 # 例4-2:まとめて設定する start=Time.now sheet.Range(cells.join(',')).Interior.ColorIndex=4 p Time.now-start #=>0.016
Rangeメソッドには、セルの名前をコンマで区切って複数列挙した文字列を渡すことができます。これを利用すれば、上記のように隣接していない複数のセルに、一括して同じプロパティを設定することができます。
ただし、Rangeメソッドに渡せる文字列のサイズは最大256文字(?)です。なので、セルの数がやたらと多い場合は、何個かずつに分けて処理するようにしましょう。
VBAで、同じオブジェクトに繰り返しアクセスするときに with ステートメント っていうのが使えるのですが、Ruby で似たようなことできないですかね?
' VBA withステートメントの例'
Sub test()
With Range("a1")
.Value = 45585
.NumberFormatLocal = "yyyy/mm/dd"
.Font.Size = 30
.Font.Color = RGB(255, 255, 0)
.Interior.Color = RGB(255, 0, 0)
End With
End Sub
instance_exec メソッドというのが使えます。VBAみたいに ピリオドで書き始めることはできないですが、self でレシーバを参照できます。
また、tap メソッドというのもあります。ブロック引数を置く必要はありますが、ブロックローカルなので他への影響がないです。
# (準備) Excelを新規に開く
require 'win32ole'
excel=WIN32OLE.new('Excel.Application')
excel.Visible=true
book=excel.WorkBooks.Add
sheet=book.WorkSheets.Add
# instance_execメソッドを使う例
# ブロック内ではレシーバを self で参照できるので、新たに変数を置く必要がない
sheet.Range('a1').instance_exec{
self.Value=45585 #セルの値
self.NumberFormatLocal='yyyy/mm/dd' #セルの表示形式
self.Font.Size=30 #セルのフォントサイズ
self.Font.Color=255 + 255*256 + 0*65536 #セルのフォント色 黄色
self.Interior.Color=255 + 0*256 + 0*65536 #セルの背景色 赤色
}
# tapメソッドを使う例
# ブロック変数を置く必要があるが、ブロックローカルなので、他への影響がない
# なお、ブロック変数を省略して、代わりに ruby2.7以降では 番号指定パラメータ「_1」、
# ruby3.4以降ではデフォルトブロックパラメータ「it」が使えるらしい
sheet.Range('a2').tap{ |range|
range.Value=45586
range.NumberFormatLocal='yyyy/mm/dd'
range.Font.Size=30 #セルのフォントサイズ
range.Font.Color=255 + 255*256 + 0*65536
range.Interior.Color=255 + 0*256 + 0*65536
}
# instance_exec、tap を使わない例 その1
# いちいちrangeオブジェクトを呼び出す
sheet.Range('a3').Value=45587
sheet.Range('a3').NumberFormatLocal='yyyy/mm/dd'
sheet.Range('a3').Font.Size=30
sheet.Range('a3').Font.Color=255 + 255*256 + 0*65536
sheet.Range('a3').Interior.Color=255 + 0*256 + 0*65536
# instance_exec、tap を使わない例 その2
# 新たに変数 range を置く
range=sheet.Range('a4')
range.Value=45588
range.NumberFormatLocal='yyyy/mm/dd'
range.Font.Size=30
range.Font.Color=255 + 255*256 + 0*65536
range.Interior.Color=255 + 0*256 + 0*65536
セル(の集合)をあらわす range オブジェクトの Value プロパティは、セルの値を返します。でもセルの値が無いときは何を返すの?
require 'win32ole' app=WIN32OLE.new('Excel.Application') app.Visible=true book=app.Workbooks.Add sheet=book.Worksheets.Add cell=sheet.range('a1') #値がない場合 p cell.Value #=> nil #Rubyから空文字列を書き込んだ場合 cell.Value='' p cell.Value #=> nil #セルの数式に空文字を設定した場合 cell.Formula='=""' p cell.Value #=> "" (空文字列)
というわけで、Excel上で何も書いて無いように見えていても、nil が返ってきたり、空文字列が返ってきたりします。
ちなみに上記ではRubyのwin32oleを通して Value や Formula を設定しましたが、Excel マクロで同じように設定したセルに対してRubyから値をとっても結果は同じでした。
以下のスクリプトは、WIN32OLE を用いて Excel を開き、閉じるスクリプトです。
require 'win32ole' app=WIN32OLE.new('Excel.Application') app.Visible=true book=app.Workbooks.Add sheet=book.Worksheets(1) book.Close app.Quit p WIN32OLE.connect('Excel.Application')
最後の行の WIN32OLE.connect では、Excel オブジェクトが存在すればその WIN32OLE オブジェクトを返しますが、ここでは既に Excel オブジェクトは閉じている(app.Quit)ので、エラーを返すことが期待されます。が、実際には閉じたはずのExcel オブジェクトを返します。
タスクマネージャーを見ると、スクリプトが終了した後にはExcel オブジェクトは残ってないようです。なので、気にしないでも良いのですが、GUIアプリなどしばらくスクリプトが生きているような状態の場合、閉じたはずの Excel が残っているため、別途Excelを手動で開いたりすると、Excelの枠だけ表示されて中身が表示されない事態になります。
なるべく早く Excel オブジェクトを閉じたい場合には以下の方法があります。
require 'win32ole' app=WIN32OLE.new('Excel.Application') app.Visible=true book=app.Workbooks.Add sheet=book.Worksheets(1) book.Close app.Quit app.ole_free sheet=nil book=nil app=nil GC.start p WIN32OLE.connect('Excel.Application')
ただし、 WIN32OLE#ole_free はデバッグ用らしく、使用はあまり推奨されないようです。何でも、閉じたオブジェクトに再度アクセスしたとき、どうなるか分からないとか。んー。とりあえず、[ruby-list:35403] win32ole で excel が終了しない、[ruby-talk:253090]How to completely terminate a WIN32OLE Excel object?を参照。
# test.rb require 'vr/winconst' require 'vr/winconst'
# test.exy general: startup: test.rb core: cui kcode: sjis file: test.rb: vr/winconst: file: c:/ruby/lib/ruby/site_ruby/1.8/vr/winconst.rb
上記スクリプト test.rb は、そのままインタプリタに渡して実行すると、特に何事も無く終了します。しかし、上記レシピファイル test.exy を使って exerb で実行ファイルを作り実行すると、以下のように定数を再定義しているという警告が表示されます。
vr/winconst:16: warning: already initialized constant WM_NULL vr/winconst:17: warning: already initialized constant WM_CREATE (・・・もっといっぱい続く)
何で exerb で作った実行ファイルでだけこんな警告が出るのだろう?
直すべきところをまず言うと、レシピファイルの「vr/winconst:」キーの部分を「vr/winconst.rb:」にすればよいです
# 修正後のtest.exy general: startup: test.rb core: cui kcode: sjis file: test.rb: vr/winconst.rb: file: c:/ruby/lib/ruby/site_ruby/1.8/vr/winconst.rb
recuire は同じライブラリがまだロードされていない時だけロードします。なので、同じライブラリ vr/winconst を2回 require しても、実際にロードされるのは1回目の require の時だけで、2回目の require ではロードされません。
ところが、レシピファイルで「vr/winconst:」として作った実行ファイルでは、キーが「vr/winconst:」なのに対し、実際のファイル名は「vr/winconst.rb」であるため、 ロードされたかどうかの判定に齟齬が出るようです。(よく分かりませんが。) require は実際にライブラリをロードした場合 true、ロードしなかった場合 false を返すことを使って確認すると、修正前レシピファイルで作った実行ファイルでは、2つの require がどちらも true を返します。一方、インタプリタでの実行、および修正後レシピファイルで作った実行ファイルでは、1回目の require は true を、2回目の require は false を返します。
フォームの top メソッドでZオーダーを指定できます。VisualurubyリファレンスのSWin::Window#topの説明を参照のこと。
require 'vr/vrcontrol' module MainForm def construct self.move(100,100,200,200) self.top(0xffffffff) end end frm=VRLocalScreen.newform frm.extend MainForm frm.create.show VRLocalScreen.messageloop
exerb で実行ファイルを作るとき、レシピファイルの file ブロックにファイルを指定しておくことで、実行ファイル内にファイルを格納しておくことができます。
しかし、格納したファイルを読み込めるのは、ruby スクリプトの require のみです。load では読み込むことができませんので、load で読み込みたいファイルがある場合には、実行ファイルとは別にそのファイルを用意、配布する必要があります。
(2022-03-04追記)下記は、Windows10 + ruby 2.7では動かなくなっている? 動くコードは[Ruby] windowsでファイルを関連付けられたアプリケーションで開く2へ。
以下は「C:\test.pdf」を pdf ファイルに関連付けられたアプリで開くスクリプトです。
require 'Win32API' shellexecute = Win32API.new('shell32.dll','ShellExecuteA',%w(p p p p p i),'i') shellexecute.call(0, 'open', 'C:\test.pdf', 0, 0, 1)
バリケンのRuby日記 - Rubyからブラウザを起動する(Windows版)を参考にしたというか、そのままです
以下は「C:\test test\test.pdf」を pdf ファイルに関連付けられたアプリで開くスクリプトです。
path='C:\test test\test.pdf'
system('start "" '+'"'+path+'"')
windowsの「start」コマンドはなかなか難しくて、ダブルクォーテーションで囲まれた第一引数は「タイトル」とみなされるので、空のタイトルを入れています。
edit コントロールに文字を入力した後で何か動作をさせたい場合、通常はボタンをクリックして何か動作させるようにしないといけません。でも、文字入力した後なんだから Enter キーで動作させたいです
以下のようにすればいいです。以下は edit コントロールに何か入力して Enter を押すと、標準出力にその内容を出力します。
require 'vr/vruby' require 'vr/vrcontrol' require 'vr/vrhandler' class VRHookedEdit < VREdit include VRKeyFeasible def vrinit super add_parentcall("char") end end class MainForm < VRForm def construct addControl(VRHookedEdit,"edit1","",10,25,200,23) end def edit1_char(keycode,keydata) if keycode==13 #ENTER puts @edit1.text SKIP_DEFAULTHANDLER #beep音が消える end end end VRLocalScreen.start(MainForm)
通常の VREdit にキーボード入力を検出する機能を持たせた VRHookedEdit を作り、それを使っています。キーボード入力を検出したときには edit1_char メソッドが呼びだされ、入力されたキーが Enter だったら動作を行う、というような仕組みです。多分。SKIP_DEFAULTHANDLER はよくわかりませんが、これを入れておくと、Enter を押した時の音が消えます。
ruby 覚え書き(のGoogleキャッシュ)を参考にしました。
でも、コンパイルとかよくわかんない、という場合はバイナリを配布していらっしゃるサイトがありますので利用します。
Ruby-mswin32 (ja)の「拡張ライブラリ」ってところからダウンロードできます。バージョンがちょっと古いけど、キニシナイ。
自然対数 Math.log(x)、常用対数 Math.log10(x) は提供されていますが、任意の底を持つ対数は提供されていません。底の変換公式を使って計算しましょう。
def Math.log_a(value,base) Math.log(value)/Math.log(base) end # 3 を底とする 10 の対数 Math.log_a(10.0, 3.0) #=>2.09590327428938
小数を四捨五入して、任意の桁に丸めた文字列(小数点表現)を得るには次のようにします。
class Numeric def round_str(d=0) return sprintf("%.#{d.to_s}f",self) end end p (10.12345).round_str(3) #=>"10.123" p (10.12345).round_str(4) #=>"10.1235" p (10.00000).round_str(4) #=>"10.0000"
ただし、sprintf で行われる数値の丸めは、処理系によっては四捨五入でないかもしれないそうです。
NaN(非数、Not a Number)との大小比較は、必ずfalse となるらしい。
p 0.0/0 #=> NaN 非数は 0.0/0 などで作れる p 0.0/0 < 0 #=> false p 0.0/0 > 0 #=> false p 0.0/0 == 0 #=> false
NArray#sum を使って要素の総和を計算したが、結果がおかしい。
require 'narray' nary=NArray.byte(5,5) # 要素を byte 型としている nary.fill!(50) p nary # => NArray.byte(5,5): # [ [ 50, 50, 50, 50, 50 ], # [ 50, 50, 50, 50, 50 ], # [ 50, 50, 50, 50, 50 ], # [ 50, 50, 50, 50, 50 ], # [ 50, 50, 50, 50, 50 ] ] p nary.sum #=> 226 あれ? 50*5*5 で 1250 じゃないの?
NArrayのデータ型を byte としているので、和の計算も byte 型で行われているようです。正しく計算するには、いったん Array に変換してから和を計算すればよいです。Arrayに変換した時点で要素の型が Fixnum に変換されます。
require 'narray' nary=NArray.byte(5,5) # 要素を byte 型としている nary.fill!(50) p nary # => NArray.byte(5,5): # [ [ 50, 50, 50, 50, 50 ], # [ 50, 50, 50, 50, 50 ], # [ 50, 50, 50, 50, 50 ], # [ 50, 50, 50, 50, 50 ], # [ 50, 50, 50, 50, 50 ] ] p nary.sum #=> 226 あれ? 50*5*5 で 1250 じゃないの? p nary.to_a.flatten.inject(:+) #=> 1250
この項は未解決です。
artonさん配布の Ruby-1.9.3-p392 Microsoft Installer Package を利用してインストールした Ruby 実行環境にて、rubygems を使って拡張ライブラリをインストールして使いたい。しかし、インストールできなかったり、使うとエラーが出たりします。
原因としては、VC++10でビルドされたバイナリが提供されていない、ビルド環境がない、ビルド環境はあるが依存ライブラリがない、ビルドできてもコンパイラのバージョンが整合していないといったところです。
コンパイラのバージョン不整合については[ruby-list:47738][ANN] Ruby-1.9.2-p136 MSWin32(msvcr100) Packageに記載がある。
NArrayについては、無償で入手できるビルド環境を使って、インストールして使えるようになりました。そこまでの経過は以下の通り。まず、普通に gem でインストールしようとしましたが、できませんでした。(スタートメニューに登録されている Ruby-1.9 console (Administrator) 上で実行のこと)
>gem install narray (略) checking for stdint.h... *** extconf.rb failed *** (略)
これは、自分の環境にコンパイルできる環境がないために起こっています。コンパイル済みバイナリが配布されているので、そちらをインストールしてみます。配布物はruby1.8用のディレクトリ構造になっているので、以下のように変更してみました。
lib\ruby\site_ruby\1.8\i386-msvcrt ↓ lib\ruby\site_ruby\1.9.1\i386-msvcr100
その後、以下のコマンドを実行して、NArrayが使えるかどうか確認しました。
>ruby -e 'require "narray";p a=NArray.float(2, 2)'
結果、「このコンピュータに msvcrt-ruby18.dll がないため、プログラムを開始できません。」というダイアログが出て、エラーとなります。まあ、そもそもruby1.8用ですしね。
ruby1.9用のwindows用バイナリは配布されていなさそうなので、自力でバイナリをビルドする必要があります。ActiveScriptRuby 1.9.3 上で rubygem の json をコンパイルする方法(素人用)によると、無償で入手できる Microsoft Visual C++ 2010 Express を入れておけば、ビルドできるらしい。しかし、2013-03-03 の時点では次のバージョンである Visual Studio Express 2012 for Windows Desktop しか入手できません。これで何とかなるだろうか。インストールしたのち、 Ruby-1.9 console (Administrator) を起動し、その上で以下のコマンドを実行しました。
>"C:\Program Files\Microsoft Visual Studio 11.0\VC\bin\vcvars32.bat" >gem install narray (略) checking for stdint.h... *** extconf.rb failed *** (略) Check the mkmf.log file for more details. You may need configuration options. (略)
最初と同じエラーが出ました。mkmf.log をチェックしろと言われているので、Ruby-1.9.3\lib\ruby\gems\1.9.1\gems\narray-0.6.0.8\src\mkmf.log をメモ帳で開くと、以下のような記載があります。
include\ruby-1.9.1\i386-mswin32_100\ruby/config.h(4) : fatal error C1189: #error : MSC version unmatch: _MSC_VER: 1600 is expected.
これは、コンパイラのバージョンチェックに引っかかっているようです。WikipediaのMicrosoft Visual C++の記事によれば、_MSC_VER = 1600 は Visual C++ 2010、一方インストールしたVisual C++ 2012は_MSC_VER = 1700だそうです。Windowsでgem install jsonでエラー | Memorandumでは、バージョンチェック部分を書き換えて通していますので、こちらでもやってみましょう。Ruby-1.9.3\include\ruby-1.9.1\i386-mswin32_100\ruby\config.h をメモ帳で開き、以下のように変更して保存します。
(config.h 3行目) #if _MSC_VER != 1600 ↓ #if _MSC_VER != 1700
その後、 Ruby-1.9 console (Administrator) 上で、以下のコマンドを実行しました。(vcvars32.batはそのウインドウ上でのみ環境変数を追加するバッチファイルです。新しいウインドウを開くたびに実行する必要があります。実行済みのウインドウで引き続きgem を使うなら不要です。)
>"C:\Program Files\Microsoft Visual Studio 11.0\VC\bin\vcvars32.bat" >gem install narray (略) Successfully installed narray-0.6.0.8 1 gem installed (略)
おお、インストールできたっぽい。使ってみよう
>ruby -e 'require "narray";p a=NArray.float(2, 2)' NArray.float(2,2): [ [ 0.0, 0.0 ], [ 0.0, 0.0 ] ]
使えた! けど、本当はRuby実行環境から全部、自前でビルドするべきなんだろうなぁ。
Nokogiri については、インストールできていません。Ruby-1.9 console (Administrator) 上で、以下のコマンドでgem インストールしようとしましたが、できませんでした。
>gem install nokogiri (略) checking for libxml/parser.h... *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. (略)
Nokogiri の場合、windows用バイナリのgemファイルが提供されています。以下のようにしてインストールしてみました。
>gem install nokogiri --platform mswin32 Successfully installed nokogiri-1.5.6-x86-mswin32-60 1 gem installed (略)
インストールできたみたいなので、使ってみる。
>ruby -e 'require "nokogiri";require "open-uri";puts Nokogiri::HTML(open("http://www.google.com/"))'
結果、「このコンピュータに msvcrt-ruby191.dll がないため、プログラムを開始できません。」というダイアログが出て、エラーとなります。NArrayのときとファイル名がちょっと違います。これはRuby1.9用ではあるけど、冒頭のランタイム不整合が起こってる結果だろうか。Narrayのときと同じように、Visual Studio Express 2012 を使って、自分の環境でビルドしてみよう。事前にRuby-1.9.3\include\ruby-1.9.1\i386-mswin32_100\ruby\config.h をメモ帳で開き、以下のように変更して保存します。
(config.h 3行目) #if _MSC_VER != 1600 ↓ #if _MSC_VER != 1700
その後、以下をRuby-1.9 console (Administrator) 上で実行。
>"C:\Program Files\Microsoft Visual Studio 11.0\VC\bin\vcvars32.bat" >gem install nokogiri (略) libxml2 is missing. (略)
ダメだった。libxml2 というライブラリを使っていて、libxml2 がないのでビルドできないってことのようだ。この辺を参考に入手はできるのだが、これをどうすればよいのか不明。ここまでで力尽きる。
別の Ruby 実行環境インストーラである RubyInstaller はMinGW版で、VC++6 でコンパイルされた拡張ライブラリと互換性があるそうなので、こっち使うかなぁ。
2013-04-29追記:[ruby-list:48308] WinXPでnokogiインストール のスレッドが参考になるかも。
Excelに登録してあるマクロを実行するサンプルコードを示します。
' Excelのコード ブック test.xls の シート Sheet1 のマクロとして記述 Sub show_msgbox(msg as string) MsgBox (msg) End Sub
# Rubyのコード require 'win32ole' app=WIN32OLE.connect('Excel.Application') #Excelのブックはオープン済みを前提 app.run('test.xls!Sheet1.show_msgbox','やあ')
これでRubyのコードを実行すると、Excel上でメッセージボックスが表示されます。
マクロは「ブック名!シート名.マクロ名」で指定するようです。「ブック名!」を省略すると現在アクティブなブックを指定したことになり、「シート名.」を省略すると標準モジュールを指定したことになるようです。
2013-04-08 追記。シート名ではなく、コード名が正しいようです。シート名とは Worksheet.Name にて取得できる値で、ユーザによる変更が可能です。一方、コード名は Worksheet.CodeName にて取得できる値で、変更不可です。ワークブックの初期状態ではシート名=コード名ですが、シート名が変更されてもコード名は変更されないため、シート名≠コード名となります。
ファイル「test20211230.txt」を作成して、5秒後にごみ箱に捨てるコードを示します。
require 'win32ole'
class File
def self.recycle(fname)
fpath=File.expand_path(fname).gsub('/','\\')
sh=WIN32OLE.new("Shell.Application")
sh.NameSpace(10).MoveHere(fpath)
sleep(0.1) while File.exist?(fpath)
end
end
File.new('test20211230.txt','w').close
sleep(5)
File.recycle('test20211230.txt')
Windowsで,簡単にファイルを「ごみ箱」に送るバッチのサンプルコード。削除処理に「シェル名前空間」を使う仕組みの解説 - 主に言語とシステム開発に関してを参考にしました。
ファイル名を繋げるときなどに文字コード不整合でエラーになることが多い。使うメソッドなどで得られる文字コードが違うので、メモにしておく。
# encoding: euc-jp
p __FILE__.encoding # => #<Encoding:Windows-31J>
p $0.encoding # => #<Encoding:Windows-31J>
p $PROGRAM_NAME.encoding # => #<Encoding:Windows-31J>
File.open($PROGRAM_NAME,'r'){|f| p f.path.encoding} # => #<Encoding:Windows-31J>
Dir.chdir('c:'){|dir| p dir.encoding} # => #<Encoding:UTF-8>
p Dir.glob('*.*')[0].encoding # => #<Encoding:EUC-JP>
なんかバラバラやな。
画像のファイルパスを指定してPowerPointのスライドに画像を貼り付けようとするのだけれど、PowerPoint側で「指定したファイルが見つかりませんでした。」となる場合がある。Ruby上では File.exist? で確認しているのにどうして・・・という場合は、パスの区切り文字のせいかもしれない。
#fpath='D:\temporary\test.jpg' #貼り付け○
fpath = 'D:/temporary/test.jpg' #貼り付け×
#fpath = '\\\\192.168.0.70\Public\test.jpg' #貼り付け○
#fpath = '//192.168.0.70/Public/test.jpg' #貼り付け○
# ↑コメントにしたり外したりして確認する
require 'win32ole'
PpLayoutBlank=12
ppt=WIN32OLE.new("PowerPoint.application")
ppt.visible=true
pres=ppt.Presentations.Add
slide=pres.Slides.Add(1,PpLayoutBlank)
ppt.Activate
if File.exist?(fpath)
puts fpath
puts 'ファイルあります'
pic=slide.Shapes.AddPicture(FileName: fpath,
LinkToFile: false,
SaveWithDocument: true,
Left: 0,
Top: 0)
end
区切り文字がスラッシュのローカルパスは、File.exist? で存在確認できるが、PowerPoint側では受け入れられないらしい。[VBA] ファイル名の区切り文字を参照。Strint#tr などを使って区切り文字を円記号(or バックスラッシュ)に変えておくとよさそう。
#fpath='D:\temporary\test.jpg' #貼り付け○
fpath = 'D:/temporary/test.jpg' #貼り付け×
#fpath = '\\\\192.168.0.70\Public\test.jpg' #貼り付け○
#fpath = '//192.168.0.70/Public/test.jpg' #貼り付け○
# ↑コメントにしたり外したりして確認する
fpath.tr!('/','\\') # ←区切り文字置換
require 'win32ole'
PpLayoutBlank=12
ppt=WIN32OLE.new("PowerPoint.application")
ppt.Visible=true
pres=ppt.Presentations.Add
slide=pres.Slides.Add(1,PpLayoutBlank)
ppt.Activate
if File.exist?(fpath)
puts fpath
puts 'ファイルあります'
pic=slide.Shapes.AddPicture(FileName: fpath,
LinkToFile: false,
SaveWithDocument: true,
Left: 0,
Top: 0)
end
require 'win32ole'
excel=WIN32OLE.new('Excel.Application')
excel.visible=true
book=excel.workbooks.add
sheet=book.worksheets[1]
# 値の設定
sheet.range('A1').value='a'
sheet.range('A3:C4').value=[[3,4,"=A3+B3"],['c','d','=A4&B4']]
sheet.cells(6,1).value=6
sheet.range(sheet.cells(8,1),sheet.cells(8,2)).value=['=TODAY()','=RAND()']
# 値の取得
p sheet.range('A8:B8').value
# セルの背景色を水色に変更
# VBAで使用される RGB(r,g,b) 関数の中身は r + g*256 + g*65536
sheet.range('A1').interior.color= 0 + 255*256 + 255*65536
# 散布図の作成
sheet.range('A10:C15').value=[[0,0,0],[1,1,1],[2,4,8],[3,9,27],[4,16,64],[5,25,125]]
chart=sheet.shapes.addchart2.chart # addchart2の戻り値はchartオブジェクトじゃなくshapeオブジェクト
chart.charttype = -4169 # xlXYScatter=-4169
series=chart.seriescollection(1) # グラフを作ると、最初からデータ系列が一つ作成されている
series.name="y=x^2"
series.xvalues="Sheet1!A10:A15" # シート名が必要
series.values="Sheet1!B10:B15"
series=chart.seriescollection.newseries
series.name="y=x^3"
series.xvalues="Sheet1!A10:A15"
series.values="Sheet1!C10:C15"
book.close(:SaveChanges => false) # 保存せず閉じる
excel.quit
require 'win32ole'
module MsoConst end
module XlConst end
module WdConst end
module PpConst end
WIN32OLE_TYPELIB.typelibs.each{ |typelib|
case typelib.name
when /Microsoft Office [\d\.]+ Object Library/
WIN32OLE.const_load(typelib.name, MsoConst)
when /Microsoft Excel [\d\.]+ Object Library/
WIN32OLE.const_load(typelib.name, XlConst)
when /Microsoft Word [\d\.]+ Object Library/
WIN32OLE.const_load(typelib.name, WdConst)
when /Microsoft PowerPoint [\d\.]+ Object Library/
WIN32OLE.const_load(typelib.name, PpConst)
end
}
# 以下はテスト
puts MsoConst::MsoOrientationHorizontal
puts XlConst::XlLeft
puts WdConst::WdStyleTitle
puts PpConst::PpLayoutTitle
RubyGems にある clipboard ライブラリを使うのが楽。
set_str='テスト テスト'
require 'clipboard'
# クリップボードに文字列をセットする
Clipboard.copy(set_str)
# クリップボードから文字列を取得する
get_str=Clipboard.paste
puts get_str
# クリップボードを空にする
Clipboard.clear
PowerShell を使う方法もあって文字列以外も扱えたりするが、ややこしい。
set_str='テスト テスト'
# クリップボードに文字列をセットする
# スペースを含む場合は単引用符でくくる
system('powershell Set-Clipboard -value '+"\'"+set_str+"\'")
# クリップボードから文字列を取得する
# %x はコマンドを実行して、標準出力を文字列で受け取る記法
# エンコード関連はよくわからん
get_str=%x(powershell Get-Clipboard).encode('utf-8','sjis')
puts get_str
# ファイルのコピペなど高度なこともできるらしいがよくわからん
set_str='c:\test1.txt'
system('powershell Set-Clipboard -path '+"\'"+set_str+"\'")
set_str='c:\test2.txt'
system('powershell Set-Clipboard -append -path '+"\'"+set_str+"\'")
get_str=%x(powershell Get-Clipboard -Format FileDropList).encode('utf-8','sjis')
puts get_str
ruby2.7 が2023年3月までしかサポートされないので、ruby3.1 に乗り換えてみたところ、動かなくなったコードがあったので、対処方法をメモしておく。
非推奨な機能を使用した際に警告を出力する機能があるが、2.7.2 以降では機能がオフになっている。オンにしておくと、あらかじめ後のバージョンで動かなる部分を実行時に警告として指摘してくれる。2.7 を使いながら警告に対処するのがよさそう。機能をオンにする方法は3つくらいある。
一つ目は、コマンドラインオプションを追加して ruby インタプリタを起動する方法。Ruby 2.7.0 リファレンスマニュアル Rubyの起動を参照。
> ruby -W:deprecated test.rb
二つ目はコマンドラインオプションを環境変数 RUBYOPT で指定する方法。システムの詳細設定で、環境変数 RUBYOPT に「-W:deprecated」を追加しておく。Ruby 2.7.0 リファレンスマニュアル 環境変数を参照。たぶんあらかじめ「-Eutf-8」というデフォルトの文字コードを設定するオプションが入っているので、そのあとに空白で区切って追加する。
-Eutf-8 -W:deprecated
コードをコンソールとかバッチファイル実行しているなら、環境変数を編集するコマンドを実行してもよい。
> set RUBYOPT=%RUBYOPT% -W:deprecated
三つめはコード内で Warning モジュールのフラグを変更する方法。Warning[:deprecated] に true をセットする。Ruby 2.7.0 リファレンスマニュアル Warningモジュール を参照。
Warning[:deprecated] = true # これ以降のコードで警告があれば表示される
以下のコードは ruby2.7 では非推奨の警告が出て、ruby3.1ではエラーとなる。
require 'FileUtils'
FileUtils.cp('C:\src.txt','C:\dst.txt',{:verbose=>true,:noop=>true})
# (ruby2.7.7) warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
# (ruby3.1.3) wrong number of arguments (given 3, expected 2) (ArgumentError)
以下のようにすると、ruby3.1 でも動くようになる
require 'FileUtils'
# オプションの Hash の前に ** を付ける
FileUtils.cp('C:\src.txt','C:\dst.txt',**{:verbose=>true,:noop=>true})
# キーワード引数の型ににしてもよい
FileUtils.cp('C:\src.txt','C:\dst.txt',verbose: true,noop: true)
Ruby 3.0における位置引数とキーワード引数の分離についてを参照。なのだが、あまり理解できていない。
以下の ruby スクリプトを ocra を使って exe 化して実行したところ、「FATAL ERROR: BAD signature in executable」というエラーが表示されました。なお、エラーはコマンドプロンプト上に表示されます。
puts RUBY_VERSION # rubyのバージョンを表示するだけ
私の場合は ocra 実行時にすでにエラー「no such file or directory @ rbsysopen ... fiber.so」が出ていました。これは fiber.so がないというそのままの意味です。ですが fiber.so は RubyInstaller 3.0 系列には含まれていたようなのですが、RubyInstaller 3.1 系列には含まれていないようです。これは RubyInstaller の問題なのか ocra の問題なのかよくわかりません。GitHub / ocra リポジトリ / Issuesで話がされているようですので、書いてある対処法をすればとりあえずエラーは解消されました。
RubyInstaller / Downloads の 7-Zip Archives から RubyInstaller 3.0 系列のものをダウンロードして解凍します。その中の lib / ruby / 3.0.0 / x64-mingw32 / fiber.so をコピーしましょう。その fiber.so をパスの通ったフォルダ(例えばカレントフォルダ)に置いて ocra 実行すると良いです。いや、良いかどうかは知りませんがエラー解消はしました。exe 実行時には fiber.so は不要です。
Ignore fiber.so #189にて bin / ocra を書き換える提案がされているみたいです。これに従って Ruby31-x64 / lib / ruby / gems / 3.1.0 / gems / ocra-1.3.11 / bin / ocra を開き、191行目に以下のように「fiber.so」を追加する書き換えを行っても解消されました。
VERSION = "1.3.11"
IGNORE_MODULE_NAMES = /\/(enumerator.so|rational.so|complex.so|fiber.so|thread.rb|ruby2_keywords.rb)$/
GEM_SCRIPT_RE = /\.rbw?$/
まあ、ocra って最終更新が 2020/3/22 のようなので、すでにメンテされていないのですかね。
以下の ruby スクリプトを ocra を使って exe 化して実行したところ、「libgmp-10.dll が見つからないため、コードの実行を継続できません。」というエラーのダイアログが表示されました。
puts RUBY_VERSION # rubyのバージョンを表示するだけ
ocra 実行時に libgmp-10.dll を含めて exe 化するように指示するとよいです。
> ocra test.rb --dll ruby_builtin_dlls\libgmp-10.dll
irb のカスタマイズファイルを以下の場所に置いておくと、irb 起動時に読み込んでくれるそうです。Ruby3.1マニュアル > irb ライブラリ > irb のカスタマイズ 参照。
で、リスト5つめの「./.irbrc」を期待してカレントディレクトリにファイルを置いたのに、全然読み込んでくれない。どうして・・・
仕組みはよくわかりませんが、一度 irb を起動すると、ユーザーのホームディレクトリ「c:\Users\(ユーザー名)」 に自動的に「.irbrc」ファイルが作成され、その後の irb 起動ではリスト3つめの「$HOME/.irbrc」が読み込まれてしまうため、それより順位の低い「./.irbrc」は読み込まれません。実際に「c:\Users\(ユーザー名)」フォルダを確認すると「.irbrc」ファイルが出来ているはずです。これを消しても、irb を起動すると自動的に作成されます。(備考:ユーザーのホームディレクトリは、コマンドプロンプト中では %HOMEDRIVE%%HOMEPATH% 、rubyスクリプト中では ENV['HOME'] で参照できます。)
というわけで、自動的に作成された「$HOME/.irbrc」を上書きするなり編集するなりしてカスタマイズするのが良いでしょう。どうしてもカレントディレクトリにファイルを置きたいという場合は、とりあえず2つ方法があります。
ユーザーのホームディレクトリに勝手にできた「.irbrc」ファイルを開いて、以下の記載を追加します。記載するファイル名は作成したカスタマイズファイルのファイル名に合わせてください。
require './custom.rb'
irb 起動時に、以下のように -r オプションを使って ライブラリを読み込ませることができます。
> irb -r ./custom.rb
この時、先に「$HOME/.irbrc」が読み込まれた後で、-r オプションのライブラリが読み込まれます。
irb を電卓的に使っていると、実行結果をクリップボードに入れてほしいなあと思います。irbには実行結果の出力方式をカスタマイズする機能があり、これを利用することで実現できます。
カスタマイズファイルに以下の記述を追加します。
require 'clipboard'
# :MY_INSPECT という名前で出力方式を定義
IRB::Inspector.def_inspector([:MY_INSPECT]){ |v|
Clipboard.copy(v.inspect) # 出力をクリップボードに入れる
v.inspect # 出力をコマンドプロンプトに表示する
}
# 出力方式を :MY_INSPECT に設定
IRB.conf[:INSPECT_MODE] =:MY_INSPECT
この状態で irb を立ち上げると、各行で実行結果がクリップボードに送られるようになっています。
Windows上で、エクスプローラーからファイルをドラッグ&ドロップして、何かをしたい時ってありますよね?ね?
Rubyで使えるGUIライブラリって、いくつかあったり、あっても開発が停止してたりしますけど、とりあえず GTK3 というライブラリでファイルのドラッグ&ドロップが扱えるようなので、作ってみました。後継の GTK4 というのもありますが、ドキュメントが少なそうなので GTK3 を使っています。
Ruby/GTK3 を使用しますので、事前に gem でインストールしておきます。依存ライブラリが多いせいか、結構時間かかります。3分くらいか?
> gem install gtk3
作ってみたコードは以下です。 実行して開いたウインドウにエクスプローラからファイルをドロップすると、ファイルパスをウインドウ内に表示します。実行してからウインドウが開くまで5秒くらいかかるな・・・
require 'gtk3'
require 'cgi'
application=Gtk::Application.new
application.signal_connect "activate" do |app|
window = Gtk::ApplicationWindow.new(app)
window.set_default_size(400,200)
window.set_keep_above(true) #ウインドウを常に最前面に表示
window.title = "テスト"
label = Gtk::Label.new("ここにファイルをドロップ")
window.add(label)
window.show_all
dnd_entry = Gtk::TargetEntry.new("text/uri-list", 0, 0)
window.drag_dest_set(Gtk::DestDefaults::ALL,[dnd_entry],Gdk::DragAction::MOVE)
window.drag_dest_add_uri_targets
window.signal_connect "drag_data_received" do |app, context,x,y,data,info,t|
file_list=data.uris #ドロップされたファイルパスの文字列を要素に持つ配列を取得
# ここに行いたい処理を書く
# ファイルパス文字列はURLエンコードされているので、CGI.unescape でデコードしている
label.set_text(CGI.unescape(file_list.join("\n")))
end
end
application.run
徒然Ruby(36)Ruby/GTK -- RubyとGUI - おもこん および Python with GTK 3 Drag and Drop | Paepoi Blog を参考にしました。が、ほぼコピペしただけで、それぞれのフラグの意味とかは理解できていません。
sakura レンタルサーバー上のメールサーバーに IMAP アクセスして、条件に合致するメールを別のフォルダに移動するコード例を示します。
require 'net/imap'
require 'kconv'
imap = Net::IMAP.new('sample.sakura.ne.jp',993,true) # IMAPサーバに接続
imap.login('id@sample.sakura.ne.jp', 'password') # アカウントにログイン
puts imap.list("","*") #全てのフォルダ(メールボックス)のリストを表示
imap.select('INBOX') # 操作するフォルダを選択
imap.uid_search(["ALL"]).each{|uid|
envelope = imap.uid_fetch(uid, "ENVELOPE")[0].attr["ENVELOPE"]
puts envelope.subject.toutf8 # 件名を表示
if envelope.subject.toutf8 == 'テスト'
imap.uid_copy(uid,'INBOX.Archive') # 条件を満たすメールを所定のフォルダにコピー
imap.uid_store(uid,'+FLAGS',[:Deleted]) # 元メールに:Deletedフラグ付与
end
}
imap.expunge # :Deletedフラグ付与メールを実際に削除
# (imap.closeでもやるので、無くてもいい)
imap.close # フォルダの選択を解除
imap.logout # アカウントからログアウト
imap.disconnect # IMAPサーバーから切断
Net::IMAP#move
とか Net::IMAP#uid_move
といったメソッドがありますが、なぜか Net::IMAP::NoResponseError
が発生します。(プログラムとメールサーバーのどちらが原因かわかりません。)ここでは、メールを移動先フォルダにコピー、元メールに :Deleted
フラグを付与、:Deleted
フラグ付与されたメールの削除を行っています。
また、この操作での「削除」はゴミ箱に入るのではなく、実際に消去されますので注意してください。
VBScript.RegExp オブジェクトを利用することで、VBA 上で正規表現を使うことができます。ただし、VBScript.RegExp オブジェクトを利用するためには、InternetExplorer5.0 以上が必要です。
以下は、変数 str に格納された文字列が正規表現 WMF\d にマッチするかどうかをチェックする VBA スクリプトです
Sub sample() Dim str As String Set re = CreateObject("VBScript.RegExp") str = "WWF2" re.Pattern = "WMF\d" If re.test(str) Then MsgBox ("マッチしました") Else MsgBox ("マッチしませんでした") End If Set re = Nothing End Sub
その他詳しくは MSDNの「Clinick's Clinic on Scripting: 正規表現による Visual Basic Scripting Edition (VBScript) の機能強化」あたりを参照。
コマンドボタンに初期表示するキャプションを設定するには、表示 > ツールバー でコントロールツールボックスを表示、その中の デザインモード を ON 、コマンドボタン右クリック > プロパティ でプロパティダイアログを開く、Caption 欄を編集する、という具合で行います。
ですが、キャプションに改行を含めたい場合は、コードを書くしかなさそうです。ツール > マクロ > Visual Basic Editor でエディタを開き、左のツリーから ThisWorkbook をダブルクリック、右のエディタに以下のような感じに書く。すると、ワークブックがオープンされた段階でコマンドボタンのキャプションが書き換えられます。
Private Sub Workbook_Open() Worksheets("Sheet1").CommandButton1.Caption = "あけまして" & vbCr & "しめました" End Sub
まあ、マクロ無効でオープンされると手も足も出ませんが、一旦コードで書き換えてその状態を保存しておけば、改行を含んだまま保存されます。
Dim sheet As Worksheet sheet = Worksheets("Sheet1") 'エラー Set sheet = Worksheets("Sheet1") '正解「代入する」ではなく「参照を作成する」らしいですが。変数に文字列や数値を代入するのと、何で区別するんだろう?
以下は、Sheet1上に散布図を新たに作成するスクリプトです。
Sub Macro1() Charts.Add With ActiveChart .ChartType = xlXYScatter .SeriesCollection.NewSeries .SeriesCollection(1).XValues = "=Sheet1!R1C1:R9C1" .SeriesCollection(1).Values = "=Sheet1!R1C2:R9C2" 'ここでエラー .Location Where:=xlLocationAsObject, Name:="Sheet1" End With End Sub
しかし、実行すると ここでエラー とコメントした行で「SeriesクラスのValuesプロパティを設定できません」というエラーが発生します。原因は XL2000: Error Programmatically Accessing Data Series on a Chartを参照のこと。なにやら、グラフの表示されないデータ系列へアクセスしようとすると発生するらしいです。(ブランクのセルを参照してグラフを描かせようしてるからな!)
というわけで、回避方法としてはブランクセルでもグラフを書かせるようにすればよいです。
Sub Macro1() Charts.Add With ActiveChart .DisplayBlanksAs = xlZero .ChartType = xlXYScatter .SeriesCollection.NewSeries .SeriesCollection(1).XValues = "=Sheet1!R1C1:R9C1" .SeriesCollection(1).Values = "=Sheet1!R1C2:R9C2" 'ここでエラー .DisplayBlanksAs = xlNotPlotted .Location Where:=xlLocationAsObject, Name:="Sheet1" End With End Sub
「.DisplayBlanksAs = xlZero」の行は、手動で下記の操作を行うことと同じ動作です。
また後の行では、「プロットしない(空白を残す)」に戻しています。
挿入 > クラスモジュール で新たに作成したクラスモジュールは、デフォルトで Class1 などの名前がつきます。この名前を変更するには、表示 > プロパティーウインドウ でプロパティウインドウを表示させ、オブジェクト名欄に名前を入力します。
以下のプログラムを実行すると「オーバーフローしました」というエラーが出ます。
Sub test() a = 64 * 600 End Sub
変数 a はデータ型を宣言していないのでバリアント型となっていて、数値を入れる場合は Double (倍精度浮動小数点数型)と同じデータ範囲なので、64×600=30840 程度の数値を表現できないはずはありません。
実はこのエラーは、計算結果を a に代入するときではなく、64×600の計算をするときに発生していています。
64×600の計算は Integer(整数型)×Integer(整数型)の計算として行われます。この場合、VBA は結果を Integer(整数型)として処理しようとしますが、計算結果は 38400 であり Integer(整数型)のデータ範囲では表現できません。これがオーバーフローの原因となってます
回避するには以下のようにします。
Sub test() a = CLng(64) * 600 End Sub
CLng 関数は、引数を Long(長整数型)に変換して返します。こうすると、計算は Long(長整数型)× Integer(整数型)となり、VBA は 結果を Long(長整数型)として処理するようになります。
Office TANAKA - Excel VBAの実行時エラー[オーバーフローしました]を参照しました。
以下のプログラムを実行すると「アプリケーション定義またはオブジェクト定義のエラーです。」というエラーが出ます。
Sub test() Worksheets("sheet1").Activate Worksheets("sheet2").Range("A1:C3").Select End Sub
ワークシート内のセルなどを操作するには、あらかじめそのワークシートがアクティブである必要があるようです。上の例では、「sheet1」がアクティブな状態で、「sheet2」のレンジを操作しようとしてエラーとなっています。次の例のように、あらかじめ操作する「sheet2」をアクティブにしておくとエラーが出なくなります。
Sub test() Worksheets("sheet2").Activate Worksheets("sheet2").Range("A1:C3").Select End Sub
ちなみに、ワークシートをアクティブにするには「Activate」メソッドのほかに「select」メソッドがあります。「Activate」メソッドのほうは非表示ワークシートでもアクティブにできるそうです。
Excelでワークシートを選択する場合にSelectではなくActivateを使った方がよい理由 - paz3のおもいつき:を参照しました。
PowerPointのスライドに画像を貼る際に画像のファイルパスを指定しますけど、その時の区切り文字は「スラッシュ」なのか、「円記号(もしくはバックスラッシュ)」なのか。実際に試してみる。
Sub test()
' fpath = "D:\temporary\test.jpg" '貼り付け○
fpath = "D:/temporary/test.jpg" '貼り付け×
' fpath = "\\192.168.0.70\Public\test.jpg" '貼り付け○
' fpath = "//192.168.0.70/Public/test.jpg" '貼り付け○
'↑コメントにしたり外したりして試す
Set shps = ActivePresentation.Slides(1).Shapes
Set shp = shps.AddPicture(fpath, msoFalse, msoTrue, 1, 1, -1, -1)
End Sub
ローカルパスでスラッシュだけがNGというよくわからん結果。円記号にそろえておいた方がよさそう。
VBScriptでのエラー捕捉には「On Error Resume Next」と「On Error Goto 0」しか使えないらしいです。なので、エラー補足したい場所の直後で Err の値をチェックして、エラー処理しましょう。(エラーが発生してなければ Err=0)
On Error Resume Next a=1/0 'エラー発生 Select Case Err 'エラー内容に応じてエラー処理 Case 11 msgbox Err & " : " & Err.Description End Select On Error Goto 0 'エラー捕捉停止
VBとVBScriptの違いを参照しました。
例えば [AutoCAD] オブジェクト選択状態での右クリックメニューに「複写」を追加する の項の画像は、以下のようにData URI スキームを使って、HTML文書内に画像データを埋め込んでいます。
<img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAtIAAALdCAIAAACOXhMoAAAAAXNSR0IArs4c (略) 6I5coQAUgAJQAAo0UIHWNfhAASgABaAAFIACUKAQBf5/Ifg0R0LDcq4AAAAA SUVORK5CYII=">
しかしこの画像は、Internet Explorer のバージョン8以下では、表示されません。バージョン7以下はData URI スキーム非対応、バージョン8では32kBに制限されているそうです。どうしようもありません。
参考:インラインで画像をHTMLに埋め込むData URLスキーム at softelメモ
外部に公開せず、自分のPC内だけで tDiary を閲覧、編集できるようにします。ここでは、以下の3つのアプリケーションを使うことにします。
また以下のようなパスを想定します。
ActiveScriptRuby配布サイトよりインストーラ(ActiveRuby.msi)をダウンロードし、実行する。インストール先は C:\Ruby 。
ruby.exe の置いてあるフォルダ(C:\Ruby\bin)にパスを通す。
tDiary配布サイトよりパッケージをダウンロードする。とりあえずフルセットで良いのでは?
パッケージを解凍し、D:\ApplicationData\tdiary に保存する。
index.rb と update.rb の一行目を次のように変更する。(httpdでrbにruby.exeを関連付けておくと、いらない?)
#!ruby.exe
tdiary.conf.sample をコピーし、コピーしたファイルのファイル名を tdiary.conf に変更する。
tdiary.conf をテキストエディタで開き、@data_path に日記データベースの保存するフォルダの絶対パス(D:/ApplicationData/diary)を指定する。円記号ではなくスラッシュにすること
@data_path = 'D:/ApplicationData/diary'
tdiary.conf内の @update に update.rb のURLを指定する
@update = 'http://localhost/tdiary/update.rb'
日記データベース保存フォルダが無ければ、あらかじめ作っておく( D:\ApplicationData\diary)。
AN HTTPDの配布サイトからファイルを入手する。入手したファイルを解凍して出てくるファイルを、C:\Program Files\httpd に保存。
httpd.exe を実行。タスクトレイにアイコンが表示されるので、右クリックし、「オプション 一般」を選択。
一般タブ > デフォルトインデックスに index.rb を追加。(入力済みの index.html とは コンマ で区切る)
一般タブ > 追加 にて、拡張子.rb と 実行プログラム C:\Ruby\bin\ruby.exe を関連付け。チェックボックスは、なにもチェックしなくても動くっぽい。
エイリアスタブ > 実行パス > 追加 にて 仮想パス /tdiary に対して ローカルパス D:\ApplicationData\tdiary を設定。
アクセス制御タブ の パス欄 に最初から書かれている / の行を選択して 編集。許可IPの *.*.*.* を削除し、127.0.0.1と入力。これで外部からのアクセスを遮断する。
以上が終わったら http://localhost/tdiaryにアクセス!
あと便利のために2つほど設定など
青木さんとこから grep.rb を入手し、index.rbと同じフォルダ(D:\ApplicationData\tdiary)に保存。
grep.rb をテキストエディタで開き、一行目を以下のように修正。
#!ruby.exe
http://localhost/tdiary にアクセスし、右上の 追加 > 設定 、左欄の ヘッダ・フッタ と進む。
ヘッダのフォームに以下の文字をコピー
<form method="post" action="grep.rb"> <input type="text" name="q" size="20" value=""> <input type="submit" value="Return"> </form>
これでヘッダに検索フォームが表示されて、grep できるようになる。
RAA - rdtoolより rdtool-0.6.20.tar.gz をダウンロードし、適当なフォルダに解凍する。
setup.rb を実行し、rdtoolをインストールする。
D:\ApplicationData\tdiary\misc\style\rd にある rd_style.rb を D:\ApplicationData\tdiary\tdiary にコピーする。
tdiary.conf内の @style に 'RD' を指定する
@style = 'RD'
((<画像はこちら|URL:file:///E:/test.jpg>))
RDスタイルでは上記のような記述で、ローカルファイルへのリンクを貼れます。
しかし Firefox3 ではセキュリティー上の理由から、ローカルファイルへのリンクが許可されていないようです。まあ、なんかファイルを書き換えれば許可できるようなんですが「セキュリティー!」とかいわれるとなんか怖いですよ。というわけで、とりあえずの運用案として、リンクされるファイルは1つのフォルダにまとめて置く、ということにして、そのフォルダ内ファイルへリンクを貼れるようにしてみます。
まず、まとめるフォルダを準備します。
次に、AN HTTPD のタスクトレイアイコン 右クリックメニュー > オプション 一般 > エイリアス タブ > 実行パス 追加ボタンを押して、仮想パスとして例えば「/diary_ref」、ローカルパスとしてさっき作ったまとめるフォルダを指定します。
そうすると、「(まとめるフォルダ)\test.jpg」へのリンクを「http://localhost/diary_ref/test.jpg」として記述できるようになります。この場合、Firefoxからはweb上のファイルであるとみなされるので開くことができます。
(追記 2009-09-21)せっかくRuby入れてるんだから、サーバーだってRubyで書いて動かしたいです。tDiaryインストールメモ(1) - バリケンのRuby日記が参考になります。
メッセージを保存しているフォルダの filterlog.html、junklog.html がそれです。
メッセージの保存先は メニュー > ツール > アカウント設定でダイアログを開き、各アカウントの サーバ設定 > メッセージの保存先 の項目で確認できます
メール編集ウインドウに、添付したいファイルをエクスプローラからドラッグ&ドロップしたい。でもメール編集ウインドウが受け付けてくれない?
メール編集ウインドウ内の宛先や件名の欄なら、ドラッグ&ドロップを受け付けてくれます
ThunderbirdでIMAPアクセスするアカウントを追加したのだが、受信箱以外のフォルダが見えない。
左側のフォルダリストのアカウント名を右クリック > 購読 をすると、「IMAPフォルダーとニュースグループの購読」ダイアログが開く。見えるようにしたフィルタにチェックを入れて OK すると、見えるようになります。
Thunderbirdでメールをフォルダに自動振り分けしたいのだが、どこで設定すればいいのか。
右上の三本線アイコン > ツール > メッセージフィルタ で「メッセージフィルタ」ウインドウが開くので、そこで設定する。
SleipnirAPIに、現在読み込み中かどうかを返す isbusy メソッドがあります。しかし、読み込み中にもかかわらず、メソッドが 偽 を返すことがあります。Sleipnir 2.45 では直ってるはずらしいんだけど、ダメみたい。
GetDocumentObject メソッドで、document が取得できるかどうかで代用する方法があります。例えば、以下は、Sleipnir で Google を開いて、読み込みが完了するまで待機するスクリプトです。(Ruby スクリプト)
あと、あまり関係にない話ですが、この後すぐに Title を取得しようと思っても、Titleが設定されるまで、ちょっとだけタイムラグがあるようです。なので、Title を得たい場合、Titleが取得できるまでさらに待つ必要があります。以下は、Sleipnir で Google を開き、Sleipnir をアクティブにするスクリプトです。
上記スクリプトで、Title が設定されるまで待つ部分をなくすと、Sleipnirがアクティブにならない場合があります。なる場合もありますけど。
Sleipnir.API の PageSearchBarString プロパティーを用いてページ検索バーのテキストを取得・設定できます。下記はページ検索バーにテキストを設定するスクリプトです。(Rubyスクリプト)
require 'win32ole' pnir=WIN32OLE.new('Sleipnir.API') pnir.PageSearchBarString='愛ゆえに'
ただ、ページ検索バーの中の右のほうにあるボタンには反映されないのよね。中途半端に使えない。
AutoCADには、面積を求める機能があります。順番に頂点を選択していくと、それを結んでできる多角形の面積を求めるというものです。
・・・閉曲線の面積ってどうやって求めるんだ?
閉曲線の面積を求めるには、下準備として「リージョン」を作成する必要があります。
オブジェクトに対して寸法線を作成すると、寸法値が設定され、オブジェクトが変更されても自動で寸法値は変更されます。けど、「φ2.5」とか「R3」とかのように、寸法値の前後に文字列を付け加えたい場合があります。
寸法線のオブジェクトプロパティーの文字>寸法値上書きに記入すればよいのですが、そのまま「φ2.5」と書いちゃうと、オブジェクトが変更された場合でも、寸法値が変更されず「φ2.5」のままです。
自動で変更されるようにするには「φ<>」のようにします。そうすると、表示、印刷時に「<>」の部分にオブジェクトの寸法が代入されるようになります。
PC上では、描画を高速にするため、多角形で表示するそうです。例えば、小さく描いた円を大きく拡大すると、8角形として表示されたりします。内部の計算や印刷では真円として処理されるので問題ないのですが、曲線同士の交点をポイントしたい場合、画面上での交点と実際の交点とがずれて見えたりするので、ちょっと困ります。この場合、コマンドで regen と入力すると再描画されて、滑らかに見えるようになります
参考:mura's home - [ 円が多角形で表示されます。問題ないでしょうか。 ]
作成 > ブロック > ブロック定義 にて複数のオブジェクトをまとめてブロックとして扱うことが出来るようになりますが、解除するときはどうするの?
ブロックを選んだ状態で 修正 > 分解 とすると、個々のオブジェクトに分解できます。
しかし、ブロック作成のときに付けた名前は削除されてませんので、この状態では、同じ名前のブロックを作成することができません。ファイル > 図面ユーティリティ > 名前削除 にて表示されるダイアログで、該当する名前を選んで削除してください。
線の中点とか接点とかにスナップしたい、交点にはスナップしたくないなどの設定は 作図補助設定で可能です。
設定画面を呼び出すにはコマンド「DDRMODES」とします。オブジェクトスナップタブで設定できます。
設定画面はメニューにはないのかな。ずっと探してたのに。
現在の画層に関わらず、寸法線を作成すると AM_5 という画層に勝手に設定されてしまいます。
これは「自動プロパティ管理」という機能によるもので、作成したオブジェクトに応じて適切なプロパティーが設定されます。
「自動プロパティ管理」機能を OFF にするには、以下のようにします。
何で AutoCAD までリボンUIとか採用してんだよ。ホントに使いやすいのか、これ。
昔のクラシック表示に変更するには、以下のようにします
「名前をつけて保存」を使用とすると「フェイタルエラー Unhandled Access Violation reading 0x0278 Exception at 278h」というダイアログが出て、ソフトが終了してしまいました。数字のところは毎回違う気がします。
その後、不具合を Autodesk に送信するダイアログが出るので送信すると、AutoCAD Mechanical 2010 Update 1 の導入で解消されるらしいとのメッセージが出た。実際に導入したら解消された。
AutoCAD Mechanical 2010 Update 1は http://www.autodesk.co.jp/acm_download > Service Pack & パッチ からダウンロードが可能です。
AutoCAD Mechanical 2013にアップデートすると、右クリックメニューから「複写」がなくなってた。追加したい。
左右両クリックしながら右上ドラッグで「全体」の表示を行うことができますが、この「全体」は、描画領域全体が1画面にちょうど入るように拡大縮小移動するという意味ではないようです。
「全体」とは「用紙全体」の意味です。「用紙」は見えるようにはなっていませんが次のような位置・大きさに設定されています。「用紙」の位置は、ファイルを新規作成した際に表示される最初の画面位置の中央で固定されています。「用紙」の大きさは メニュー>設定>用紙サイズ にて設定されている大きさです(変更可能)。つまり「全体」の表示を行なうと、画面中心が上記「最初の画面位置の中央」になるように移動し、用紙サイズで設定した範囲全体が画面内に収まるように拡大縮小されます。ちなみに、印刷するときの範囲の初期位置もこの「用紙」の位置のようです。
冒頭のように、その時の描画領域に応じた描画領域の全体表示を行う機能はなさそうです。なので使い方でカバーします。なるべく「全体」の中央を中心に描画を行う・ずれてきたらその都度描画領域全体を「全体」表示の中央に移動させる・だいたい全体が見渡せる用紙サイズを設定する、といったことを心がけておけばよさそうです。
もしくは、現在の表示状態を記憶させておいてあとで呼び出すことも可能です。メニュー>設定>画面倍率・文字表示 で、表示範囲記憶 ボタンをクリックすると、現在の表示状態を記憶できます。呼び出すには「全体」と同じように、左右両クリックしながら右上ドラッグです。(コマンドの内容が「全体」から「範囲」に変わっています) 解除するには表示範囲記憶 ボタンの右の 記憶解除 ボタンをクリックすればいいです。
クイックグループに機能によりグループ化したオブジェクトは。通常だと「右クリック > エンティティグループ > クイックグループ解除」でグループ解除できます。しかしクイックグループを複数まとめてクイックグループにした場合、前記「クイックグループ解除」が選択できず、グループ解除できません。
リボンメニューから可能です。「リボン > ホーム タブ > グループ カテゴリ」に「クイックグループ解除」のアイコンがあります。こちらはクリック可能です。実行するとコマンドウインドウに「オプション:受け入れる(A) または 次へ(N)」と表示されます。「a(受け入れる)」を入力するとグループ化解除が実行されます。「n(次へ)」はグループに含まれる複数の子グループを個々に指定して単独でグループ解除するためのものです。「n(次へ)」を入力すると子グループが順番にフォーカスされたり、全体がフォーカスされたりしますので、該当するグループが選択された時点で「a(受け入れる)」を入力するとそのグループのみがグループ解除されます。
WordやExcelなどで、描画オブジェクトの表示が異常に遅いことがあります。しかも、スクロールバーでウインドウをスクロールするたびに改めて表示しようとするもんだから、何度PCを叩き割ろうかと。
ウチでは、以下の手順で「ハードウェアアクセラレータ」設定を変更することで解決しました。
マイクロソフト サポートのOffice XP プログラムで文書のスクロールやウィンドウのサイズ変更を行うと、グラフィックスまたはテキストの表示が乱れるも参照してみると良いでしょう。
Office 2010を購入した際に、Office 2013への無償アップグレードキャンペーンをやっていたので申し込んでおきました。後日、Office 2013 が発売されてインストールできるようになったのですが、通常の手順ではネットワークインストールとなります。オフラインでインストールできるように、フルインストーラをローカルに保存しておきたいです。フルインストーラを入手する方法は以下の通り。
ただし、これで入手できるのはディスクイメージであり、通常はこのファイルをDVDに書き込んで使用することになります。DVDへ書き込まずにハードディスク上からインストールできるようにするには、ディスクイメージからファイルを取り出す必要があります。仮想DVDドライブソフトを利用すれば可能で、たとえば DAEMON Tools Liteあたりを使えばよいでしょう。ディスクイメージには「autorun.inf」「setup.exe」「office フォルダ」が含まれていますので、これらと、さっきのプロダクトキーを保存しておけば、オフラインインストールが可能となります。たぶん。
あと、プロダクトキーの入手は 2013/5/31 までらしいです。
PowerPointで、アニメーションを含むスライドショーを自動的に繰り返すには、いくつか設定が必要です。→自動的に何度も繰り返すパワポのスライドショー [パワーポイント(PowerPoint)の使い方] All About
Excelで範囲選択してコピー、PowerPointに貼り付けすると表を張り付けられますが、罫線と文字の間が狭すぎて、非常に見にくい。
「セルの余白」を変更すると罫線と文字の間を広げられます。リボン > 配置 > セルの余白 > ユーザー設定の余白 をクリックするとダイアログが開くので、そこで変更できます。
穴の開いた図形を作るために、塗りつぶし=白、枠線=白の図形を置いたのに、モノクロプリンタでのプレビューや印刷で枠が黒く見えてしまう場合があります。
以下の方法で解決できます。
参考:Microsoftサポート [PPTX] グレースケール印刷で線なしの図形に線がついて印刷される
「形式を選択して貼り付け」で「列幅」を貼り付けるマクロを動作させると、「RangeクラスのPasteSpecialメソッドが失敗しました。」というエラーメッセージが表示され、動作しないことがあります。
これは、「新しいマクロの記録」でマクロを作成すると、コード内で「列幅」を意味するExcelの定数 xlColumnWidths が使用されるが、実はその定数は定義されていないことが原因です。
ゲイツさんの脳内では xlColumnWidths = 8 だそうですので、コード内の定数 xlColumnWidths を全て 8 で置き換えてやれば良いです。
マイクロソフト サポートの[XL2000]マクロ記録でPasteSpecialの引数Pasteが正しく記録されないも参照してみると良いでしょう。
セルやオートシェイプに名前をつけておくと、マクロで操作するときにインデックスで指定しなくて良くなるので、何かと便利な場面があります。セルに名前をつけるには、名前をつけたいセルを選択した状態で、メニューの 挿入 > 名前 > 定義 で表示される 名前の定義 ダイアログで、最上欄に名前を入力して OK すればよいです。
オートシェイプには、作成した時点で自動で名前が付いています。オブジェクトを選択した状態で、ウインドウ右上の名前ボックスに表示されるものがそうです。ですが「四角形 1」とかなので、扱いにくいです。名前をつけなおすには、名前ボックス内のテキストを編集すればOKです。
で、グラフオブジェクトにも名前をつけたいのですが、グラフオブジェクトを選択しても名前ボックスに「グラフエリア」としか表示されなくて、グラフオブジェクトの名前が分からないのです。名前を知るには、図形描画ツールバー の オブジェクトの選択ボタンを押してから、グラフオブジェクトを選択します。すると名前ボックスに「グラフ 1」みたいな名前が表示されます。名前を付け直すには、上記オートシェイプでやったのと同じようにすれば良いです。
通常、検索の対象は「数式」に設定されているので、数式の結果に対してはヒットしません。たとえはどこかのセルに数式「=A1&A2」が入力されていて、その結果が「ab」になっていた場合、「ab」を検索しても、検索の対象が「数式」に設定されているとヒットしません。検索の対象を「値」にするとヒットします。検索の対象の設定は、検索ダイアログ上で行うことができます。
メニュー > データ > オートフィルタ でオートフィルタがかかっているために表示されていないセルは、検索にも引っかかりません。オートフィルタをはずすか、(すべて)を選んですべて表示させましょう
例えば以下のような 2 つの Excel ファイルがあったとします。
これら 2 つのファイルをダブルクリックして開こうとすると、後で開こうとしたほうが「'光熱費.xls'と同じ名前のファイル名が既に開いています。・・・」といって開くことができません。別な場所にあっても、ファイル名が同じだと開けないのです。
名前を変えたくない。何とか開きたい。そんな場合は、Excel を OLE オブジェクトとして起動しすることで、多重起動すれば良いです。以下は、そんなことを実現する Ruby スクリプトです。
require 'win32ole' app=WIN32OLE.new('Excel.Application') app.Visible=true if ARGV.empty? then app.Workbooks.add else ARGV.each{|path| app.Workbooks.open(path) } end
既 にExcel が起動している状態でこのスクリプトを実行すると、既存のエクセルとは別の Excel を起動します。引数にファイルパスを与えて起動すると、既存のエクセルとは別の Excel を開き、そこに与えられたファイルを開きます。既存の Excel と新規の Excel は別アプリケーションとみなされますので、双方に同じ名前のファイルを開いても注意されません。
ワークブックの中に「個別項目のリスト」と「項目を集計したテーブル」があって、それらを並べて表示して作業したい・・・
[表示] > [新しいウインドウを開く] をクリックすると、今開いているワークブックを別のウインドウでもう一つ開くことができます。それぞれのウインドウで表示したいところを表示して、ウインドウを並べればよいです。
[表示] > [整列] を使えば、上下に並べたり、左右に並べたりできます。
LibreOffice 3.4.2 から 3.5.1 へアップデートしようとしました。公式サイトからインストーラを入手して、実行しましたが、次のメッセージが出て、インストールできませんでした。「続ける前に、LibreOffice 3.4 と LbreOffice 3.4 クイック起動を終了させてください。マルチユーザ環境を使用している場合は、他のだれも LbreOffice 3.4 を開いていないことを確認してください。」
LibreOfficeは終了していますし、クイック起動も使用していませんでした。LibreOfficeのオプション > メモリ の項目にクイック起動を使用するかどうか選択できる欄がありますが、OFFになっていました。タスクマネージャを見てもそれらしいタスクはありません。msconfig コマンドを使ってスタートアップを全部切った状態で Windows 再起動してインストーラ実行しても、状況は変わりません。
結局、3.4.2をアンインストールしてからであれば、3.5.1をインストールできました。それでいいのか?
例えば画像のようなデータで、B列をX値に、C列をY値として散布図を描かせるのですけど、A列が 「a」となってる行と「b」となってる行を分けて2系列のグラフすることを考えます。「a」となってる行が離れた位置にあります。
Excelだと、セルを指定するときにCtrlキーを押しながら指定すると、離れたセルを指定できますので特に難しくはないです。
LibreOffice Calcでは、同じように複数領域を選択しようとしてもできません。連続するセル範囲をドラッグしてマウスクリックを離した時点で、Ctrlを押していても範囲決定されてしまいます。LibreOffice help グラフウィザード → データ系列によると、以下のように書かれています。
相互に隣り合わない複数のセル領域のデータ範囲が必要な場合は、最初の範囲を入力してから、テキストボックスの最後にセミコロンを手動で追加し、さらにほかの範囲を入力します。 範囲間の区切り記号として、セミコロンを使用します。
これに従って、まず第1範囲をマウスで選択したのち、キーボードでセミコロンを入力し、さらにキーボードで第2範囲を入力したのですが、入力欄が赤くなり、OKボタンがグレーになってクリックできなくなります。
どうやら「セミコロン」ではなく「カンマ」で区切るのが正解みたいです。ヘルプドキュメントが古いのかもしれない
MigemizeExplorerの作者のサイトが既になくなっているため、正規の方法では入手できません。が、入手する方法はあります。Internet Archive にて入手可能です。いきなり直リンク貼ってもいいのだけれど、後学のために、やった手順を書いておこう。
2009-07-22追記:復活してるっぽい。http://www12.plala.or.jp/yoshi223/
例えば、ファイルオープンダイアログ・Explorer・MDIEの3つで MigemizeExplorer を有効にするには MigemizeExplorer.ini 内の TargetConditions キーの値を次のようにします。
TargetConditions=* #32770 * Explorer.EXE ExploreWClass ExploreWClass MDIE.exe MDIEClass MDIEClass
単に「実行ファイル名 [TAB] ルートウィンドウのクラス名 [TAB] ルートオーナーウィンドウのクラス名」のセットをさらに TAB 区切りで書けばいいだけなんですけど。
というか、そんなことは ini ファイル内に書いてあるんだけれども、こういう意味だとは読み取れなかった・・・
タイプ別設定 > カラー > 色指定 で設定できる項目。「色分け/表示」「太字」「文字色」「背景色」「下線」の設定をカンマ区切りで設定する。例:0,1,000080,f0fbff,0
「色分け/表示」「太字」「下線」は 0 で無効、1 で有効。
「文字色」「背景色」は赤、緑、青の要素をそれぞれ 00 〜 ff であらわして、それらを連結した文字列。 ff0000 で赤、ffff00 で黄色など。
全てのファイルタイプ別設定のタブ幅を統一したい、とか言う場合、設定ダイアログ上で一つずつ変更していくのはめんどくさい。できれば sakura.ini をサクラエディタで編集したい。正規表現使って置換とかできるし。でも、サクラエディタは終了時に sakura.ini を上書きしてしまうので、せっかく編集した成果が台無しに。どうにかならんのか。
正しい手順でサクラエディタを終了させるから、sakura.ini が上書きされてしまう。ならば、上書きされる前にプロセスを殺せば・・・。というわけで、sakura.ini を編集して保存したあと、タスクマネージャ等でサクラエディタのプロセスを殺してしまえばいいです。
ちょっと心臓に悪いけど、手順としては簡単。
sakura.ini として保存するから上書きされてしまう。ならば、別名で保存すれば・・・。というわけで、sakura.ini を編集し、別名で保存し、そのままサクラエディタを終了します。そのあと、sakura.ini を削除して、別名で保存したファイルを sakura.ini にリネームすればいいです。別のフォルダに同名で保存しておいて、サクラエディタ終了後に上書きしてもいいけど。
ちょっと手間がかかるけど、心臓には優しい。
VSCodeでのRubyのコード補完のためにVSCode拡張機能Ruby Solargraphを使おうとして、Rubyのほうで gem install solargraph したら、Rubocop もインストールされた。そのせいでVSCode拡張機能RubyでのRubocopによるTipsが表示されるようになってしまった。これを表示されなくしたい。
VSCode拡張機能Rubyの設定で Ruby:Lintの項目にある 「settings.jsonで編集」をクリック。 するとsettings.json の "ruby.lint" 部分が開く。以下のように "rubocop" の値を true から false に変える。
"ruby.lint": {
"reek": true,
"rubocop": true, // <-ここを false に変える
"ruby": true, //Runs ruby -wc
"fasterer": true,
"debride": true,
"ruby-lint": true
},
設定などを丸ごとUSBメモリなどに入れて持ち運べる Firefox Portableですが、なんか設定が保持されない場合があるような。
インストールディレクトリ直下にある FirefoxPortable.exe は Firefox 本体ではなく、Firefox 本体(Firefox.exe)にプロファイル(設定とか)のありかを伝えて起動するアプリのようです。なので、FirefoxPortable.exe を実行した場合は、設定が反映されます。
しかし、関連付けなどは Firefox.exe に対して行われているので、ショートカットなどから Firefox を起動した場合には、Firefox.exe が起動します。こうして起動された Firefox.exe はプロファイルのありかが伝えられていないので、設定が反映されません。
じゃあ 関連付けなんかは全部 FirefoxPortable.exe に対して行えばいいのではないか、と思って、contexter というソフトを使って、ひとまず .lnk を FirefoxPortable.exe に対して関連漬けしてみましたが、なんか 設定の反映されていない Firefox が起動しました。
あと、FirefoxPortable.exe を2回起動すると、Firefox が2つ立ち上がるしな。
FirefoxPortable は自分管理でない複数のパソコンで使うためのものであって、自分管理の複数のパソコンでファイルをコピーするだけで同じ環境を作りたいというような用途向けではない、ちゅーことやね。
AutoPagerize は wedata から自動で SITEINFO を取得しますが、今日の時点でwedata 上にある ねたミシュラン のデータは、なぜか 古→新 へリンクを辿る設定なのよね。何とか逆にできないのか?(wedataのデータを書き換えずに)
PCのどこかに autopagerize.user.js というファイルがあるので、それを編集すれば、wedata から取得したデータに優先してそのデータを適用させられます。編集する箇所は SITEINFO の値で、以下のようにします。
var SITEINFO = [ { pageElement: '//td[@class="left_outline"]/../td[2]/*[position()<3]', url: 'http://netamichelin.blog68.fc2.com/blog.+', nextLink: '//link[@rel="next"]', exampleUrl: 'http://netamichelin.blog68.fc2.com/blog-entry-1469.html', }, /* sample { url: 'http://(.*).google.+/(search).+', nextLink: 'id("navbar")//td[last()]/a', pageElement: '//div[@id="res"]/div', exampleUrl: 'http://www.google.com/search?q=nsIObserver', }, */ /* template { url: '', nextLink: '', pageElement: '', exampleUrl: '', }, */ ]
Firefox の右クリックメニュー「ページのソースを表示」では、通所h Firefox 自前のビューアで草すが表示されますが、アドオン ViewSourceWith を使えば、任意のエディタで開くことができるようになります。
ただし、ページのパスに日本語を含む場合には処理できないらしく、開くことができません。ホームページにローカルのページを使用している場合には、そうなりがちです。
回避するにはどうすればよいのですか?分かりません。 とりあえず日本語を含まないディレクトリに移動して対応しました。
上記のような日本語パスをサクラエディタでソース表示させると、サクラエディタの設定が全部消えるのな。バックアップ取っといて良かった。
ブラウザのアドレスバーのアイコンをデスクトップにドラッグすると作成される、拡張子が「.url」のファイル(インターネットショートカット)について、Firefoxを規定のブラウザに設定したあと、ダブルクリックで開こうとすると「指定されたファイルに対してこの操作を・・・」というダイアログが出てきて、開けなくなった
とりあえず InternetExplorer を規定のブラウザにすれば、ダブルクリックで InternetExplorer で開けるようになります。InternetExplorer を規定のブラウザにする方法は以下の通り
いや、どうしても Firefox で開きたいんだ、という場合は以下のようにする。
LDRizeの動作が、いつの間にか変になりました。j キーを押すと次のパラグラフがウインドウの最上段になるように自動でスクロールし、そのパラグラフに「>」のアイコンが付くのが正常なのですが、前のパラグラフがウインドウの最上段になるようにスクロールするようになってしまいました。前のパラグラフの描画エリアの大きさによっては、次のパラグラフがウインドウ内に入らない場合もあります。
原因はよく分かりませんが、LDRize のスムーズスクロール機能を off にすると正常になりました。LDRize のスムーズスクロール機能を off にするには、: キーを押して Minibuffer ウインドウを出し、「LDRize::toggle-smooth-scroll」コマンドを実行します。(その度に on / off が切り替わります。)
Firefox を新バージョンにアップデートすると、アドオンの互換性チェックに引っかかって、アドオンが使えなくなる(無効になる)ことがあります。そのアドオンが新バージョンの Firefox で、動作確認されていないからなんですけども、マイナーアップデートくらいなら結構動いたりします。
とりあえず有効にしたい場合には、以下のようにします。
このあと、Firefox を再起動でアドオンの互換性チェックをスキップできます。この状態でアドオンマネージャを開くと「アドオンの互換性確認が無効になっています。」という常時がされます。また、新バージョンに未対応のアドオンには、アイコンに「!」マークが付きます。
(追記)Firefox 3.6 では仕様が変更になってます。新たに設定名「extensions.checkCompatibility.3.6」の値を、真偽値「false」にすれば、互換性チェックが無効になります。今後、メジャーアップデート(3.7とか?)のたびに設定名を変えて登録しなおす必要があるようです。まあ、しょうがないですね。
ロケーションバーに何かキーワードを入力して Enter を押すと、デフォルトでは Google の I'm Feeling Lucky の結果のページへアクセスします。これを別の検索エンジンに変更したい場合は以下のようにします。
Stylishアドオンを使って、特定の要素のデザインを変えたいのだけれど、要素のタグに id も class も指定されていないし、特異な属性も持っていない場合、要素を特定できない(他の要素まで含んでしまう)ことがあります。そんな時、nth-child 擬似クラスを使えば「・・・の子要素の?番目の要素」なんていう風に特定できます。でもFirefox3は CSS3 の nth-child 擬似クラスをサポートしていませんので、Stylishで nth-child 擬似クラスを指定することはできません。
代わりに first-child 擬似クラスと隣接セレクタを使って指定できます。
<body> <h1>title</h1> <h1>title</h1> <h1>title</h1> <h1>title</h1> </body>
上のような場合に、3つめのh1要素を指定するには、first-child 擬似クラスと隣接セレクタを使って以下のようにできます。
body > h1:first-child + h1 + h1
userstyles.org の掲示板を参照しました。
2chまとめサイトにアドオン Stylish を使って CSS を適用させたい。独自ドメインとってるところは以下のような感じでURLを指定できる。
@-moz-document domain("workingnews.blog117.fc2.com") { }
でも、そうじゃないところ(http://blog.livedoor.jp/dqnplus/ とか)はどうすればよいのか。以下のようにすればいい。
@-moz-document url-prefix(http://blog.livedoor.jp/dqnplus/) { }
Stylish 用ユーザースタイルシートの作り方 | AUTHORITY SITEを参照しました。
Stylishアドオンを使って、font-size を変更したのに反映されない場合、Firefox の最小フォントサイズの指定が優先されているのかもしれません。
Firefoxのオプション > コンテンツ > フォントと配色の詳細設定 で、最小フォントサイズを「なし」にすると良いです。
リンク先の PDF ファイルをそのまま Firefox 内で開くには、Firefoxで以下のように設定すればいいはずです。(事前にプラグイン導入)
TabMixPlus よりも機能を絞って動作を軽くしたらしい Tabberwocky というアドオンを入れてみました。が、こちらは新しいタブを空白ページでしか開けないようです。
NewTabURL というアドオンは、新しいタブを開くと指定したURLを開いてくれるので、入れてみました。確かに期待した動作なのですが、echofon という twitter のためのアドオンのステータスバーアイコンをダブルクリックしたときに、twitter のサイトが開かず、NewTabURL で指定したURLが開くようになってしまいました。これはダメです。
まあ、他にも色々方法はありそうだけど、まず「空白ページが開かれたら任意のページにリダイレクトする Greasemonkey スクリプト」で対応してみました。この例では、空白ページが開かれたら、自動で Google にリダイレクトします。@name、@namespace は、他と干渉しないように適当に決めてください。
// ==UserScript== // @name blank_redirect // @namespace wue // @include about:blank // ==/UserScript== location.href = "http://www.google.co.jp/";
けど、一旦空白ページ開いた後リダイレクトするから、ワンテンポ引っかかるんだよねー。どうせマウスジェスチャでしか新しいタブとか開かないし。というわけで、次に「任意のページを新しいタブで開く FireGestures スクリプト」を作ってみました。
var linkURL = "http://www.google.co.jp/"; gBrowser.selectedTab=gBrowser.loadOneTab(linkURL, null, null, null, true, false);
まあ、素直に TabMixPlus に戻ったほうがいいかも。
ARecX6 プレイヤーの画面サイズが小さいので見にくいです。だからといって全画面にはしたくない。アドオン Stylish でスタイルをいじってやれば大きくできます。Stylishに以下のスタイルを登録してください。
@namespace url(http://www.w3.org/1999/xhtml); @-moz-document domain("192.168.24.62") { embed#player{ width:640px !important ; height:390px !important ; } }
IPアドレス部分は、実際の ARecX6 のIPアドレスにあわせて書き換えてください。これで画面サイズは縦横2倍になります。width、height の値を増減させれば、好きなサイズに変えられます。
2010-07-31 追記。ARecX6 ファームウェアVer.2.10 にてプレイヤーサイズがウインドウサイズに追随するようになりました。このバージョンで上記スタイルを適用すると、ウインドウサイズにかかわらず固定になります。
大体の検索エンジンは Mycroft Project に登録されていたりしますが、自分で作りたい場合 Ready2Searchなんてサービスがあります。
たとえば「bing」を検索エンジンに追加するには、以下のような感じで。
アイコンを登録するには、「画像ファイルを送信」に何かファイルを登録して、「原色」をクリック。別のボタンでもいいけど。その後「検索プラグインを作成」
ちなみに、webサイトのfaviconを取得するには、HTMLソースから .ico ファイルへのリンク探して、それをダウンロードするなど。
アドオンがまだ対応してなかった、などの理由で旧バージョンに戻したいことがあります。旧バージョンに戻すには、旧バージョンのインストーラを使ってインストールすればいいです。インストーラは 以前のバージョンの Firefox をインストールするには | Firefox ヘルプ からリンクされている ftpサーバ においてあります。希望のバージョン、OSの種類、言語の順にフォルダをたどっていくと「Firefox Setup 16.0.2.exe」といった実行ファイルがありますのでダウンロードして、実行しましょう。
アップデートのたびにアドオンが対応していなかったりして、うんざりですわーということで、延長サポート版であるESR版に移行したい。
Firefox/Thunderbird 法人向け延長サポート版 (ESR) のダウンロードから、最新のESR版インストーラをダウンロードして、実行するだけでよいです。通常版の設定がそのまま引き継がれます。
ただし、Firefoxのバージョンが巻き戻るため、こっちはこっちでアドオンの最新版が対応していない場合があります。この場合は、アドオンのバージョンも巻き戻せばよいです。Add-ons for Firefoxで入手したアドオンであれば、そのアドオンの紹介ページにて、バージョン情報>すべてのバージョン履歴を見る とたどれば、過去のバージョンを入手することが可能です。使用しているFirefoxのバージョンに対応するアドオンのバージョンを探してインストールすればよいです。
Google 検索で AutoPagerize したときに、2ページ目以降の検索結果がおかしい場合があります。具体的には、検索キーワードを変更した場合に前の結果が表示される、検索ツールの指定が効かないなどです。
このようなことが起こるのは、Google 検索のインスタント検索機能により、検索結果がダイナミックに(ページ変更なしに)書き換わっているからだそうです。インスタント検索機能をオフにすれば AutoPagerize は期待通りの動作をするようになります。Google 検索のインスタント検索機能をオフにするには以下の手順を行います。
ただし、Google の検索設定は Cookie に保存されるので、Firefox 終了時に Cookie を削除している場合、Firefox起動のたびに検索設定を変更するか、Google アカウントにログインする必要があります。
もしくは、アドオン Biscuit を使えば、特定のクッキーを消させないようにすることが可能です。Google検索の設定は google.co.jp の場合、PREF という Cookie 名で保存されていますので、これを保護しておきましょう。Firefox のオプション > プライバシー > Cookieを表示 にて、保護したい cookie を右クリックしてチェックを入れれば保護できます。アドオン Biscuit の設定は同じ画面の オプション ボタンで表示できます。
AutopagerizeがGoogle検索でうまくいかない場合の対処法 ≫ macj's Log を参照しました。
PDF を Firefox 内蔵ビューアで表示させると、表示フォントのエッジがギザギザでとても汚く表示される場合があります。設定をいじると改善することがあるようです。
Googkeカレンダーを携帯電話のブラウザで見るにはどうすればよいのか。
Googleデスクトップのインデックスデータは GB クラスの結構大きなデータです。このデータは通常 C:\Documents and Settings\(ユーザー名)\Local Settings\Application Data\Google\Google Desktop あたりに保存されますが、そんな大きなデータは別のところに保存したいと思ったりします。
保存場所を変更するには、以下のようにすればよいです。
Windows Media エンコーダを使って複数の動画を連続してエンコードしたいとか、Windows Media エンコーダを別のプログラムから操作したいという場合、Windows Media エンコーダをコマンドプロンプトから操作できれば便利です。
Windows Media エンコーダにコマンドラインオプションは無いようですが、付属の WMCmd.vbs を経由して操作することが可能です。WMCmd.vbs の使い方・使用できるコマンドラインオプションについては、WMEncUtil.chm を参照しましょう。(「スタートメニュー > プログラム > Windows Media > ユーティリティー > Windows Media エンコード スクリプト」でも開けます)
ファイルのエンコード方法は 「ファイルおよびライブイベントをエンコードする > ファイルをエンコードするには」を参照。コマンドラインオプションは「高度なエンコード手法 > コマンドラインオプションを使う」を参照。
用語とかいろいろちがってたらごめんなさい。
640x480のサイズに収まるように拡大 or 縮小する。
>gm.exe convert -geometry 640x480 input_file output_file
明度が24%以上を白、24%未満を黒に2値化する。
>gm.exe convert -threshold 24% input_file output_file
明暗差が小さい画像を大きくする
>gm.exe convert -normalize input_file output_file
明度20%が黒、80%が白になるように明度を変える。ガンマ値を1.2にする。
>gm.exe convert -level 20%,1.2,80% input_file output_file
ガンマ値は0.1〜10.0。
input_file のX位置50、Y位置70、横100x縦200の大きさの領域を切り出して、output_file に書き出す。
>gm.exe convert -crop 100x200+50+70 input_file output_file
GraphickMagickを使って、画像に直線を引こうとして以下のコマンドを実行しましたが、メッセージが表示されて、出力画像には直線が引かれていませんでした。
> gm.exe convert -draw 'line 0,0 200,200' src.png dst.png convert: Non-conforming drawing primitive definition (line).
Windowsのコマンドラインでは、単引用符ではなく2重引用符を使わないとダメです。以下のようにすれば良いです。
gm.exe convert -draw "line 0,0 200,200" src.png dst.png
フォルダ内の .jpg ファイルを一括して縦横50%に縮小する。ファイルは上書きされるので注意。
> cd (画像のあるフォルダ) > magick mogrify -resize 50% *.jpg
convert で出力を txt 形式に指定すると、各画素の色情報をテキストで出力してくれる。
> magick convert src.jpg dst.txt
dst.txtに出力される内容は以下のとおり。[X座標],[Y座標]: ([Red],[Green],[Blue])・・・みたいな感じ。一行目は画像の画素数などが出力されている。逆に、このテキストファイルを入力にして画像ファイルを作成することも可能らしい。
# ImageMagick pixel enumeration: 640,480,255,srgb 0,0: (205,209,218) #CDD1DA srgb(205,209,218) 1,0: (204,208,217) #CCD0D9 srgb(204,208,217) 2,0: (204,208,217) #CCD0D9 srgb(204,208,217) 3,0: (205,209,218) #CDD1DA srgb(205,209,218) (以下略)
-colorspace オプションで、CMYKの情報で出力させることも可能。
> magick convert -colorspace CMYK src.jpg dst.txt
ファイルに書き出すのではなく、標準出力に出力することも可能。自分で作るプログラム内から利用する場合に使える。
> magick convert src.jpg txt:
例えば Ruby で情報を得るには次のように書く。リテラルの%記法のコマンド出力を利用します。
str=%x(magick convert src.jpg txt:)
特定位置の色情報だけ得るなら、画像全体をテキストにせず、crop してからのほうが早い。
> magick convert -crop 1x1+100+200 src.jpg txt
ImageMagickで画像を座標+RGB値のテキストに変換する、またその逆を参考にしました。
PDF を PowerPoint に直接貼り付けることができないので、ImageMagick を使って、いったん jpg にする。(PowerPoint 上でスクリーンショット機能を使う手もあるが、面積の大きなPDFだとツラいので。)
> magick convert -density 200 src.pdf dst.jpg
「-density 200」は PDF を 200 dpi で読み込む指定。なくてもいいけどデフォルトは 72 dpi なので結構粗い。数値を大きくするとどんどんきれいになるけどファイルサイズも大きくなるので、適当な数値で。
PDF が複数ページからなってる場合は「dst-0.jpg」「dst-1.jpg」などというファイル名で全ページが出力される。ページ指定したい場合は以下のようにする。この例では2ページ目を指定。※ImageMagick でのページ数はゼロ始まり
> magick convert -density 200 src.pdf[1] dst.jpg
マイコンピュータなどを開いたとき、標準のエクスプローラではなく、MDIEで開くようにするためには、MDIEのオプションで全般 > 動作 > 標準のファイラーに設定する をチェックすればよいです。が、Windows Vista では、MDIEを再起動するとチェックが外れてしまっています。また、実際にMDIEが標準のファイラーに設定されていません。
UAC(User Account Control)機能により、そういう危なげな設定変更がブロックされているようです。ブロックされないためには、MDIE.exeの右クリックメニューで「管理者として実行」をクリックして実行したあと、上記設定をすればよいです。
Windows Vista で Shorter Launcher を起動すると、メニューが表示される前に、「フック失敗」というダイアログが2回でる様になりました。Shorter Launcher が Vista に対応していないからのようで、解決方法はありません。
代替アプリとしてはポチエス ランチャー版 がよさそう。設定ファイルの書き方が大分違うけど。例えば、実行オプションとか作業ディレクトリは設定ファイルでの指定ができない。(たぶん) 必要なときは、そういう設定をしたショートカットファイル(.lnk)を作って、それをポチエス ランチャー版に登録すると良い。
win32mbcs というものを使用すれば、日本語ファイル、フォルダが使用可能になるそうです。win32mbcs は TortoiseHg に同梱されており、設定を書き換えるだけでよいです。やり方は以下のとおり。
ただし、どうも「表」や「ソ」など 2 バイト目が「\」となる、いわゆるダメ文字が含まれる場合、右クリックメニューからは扱えないっぽい。(コマンドラインからは扱える?) あと、これを使っちゃうと、Windows 以外からは触れなくなるらしい。
参考:http://bitbucket.org/kuy/thg-ja/wiki/Japanese
Bazaar という分散型バージョン管理システムは、ファイル名を unicode で扱うので、その辺の問題がないらしいが、TortoiseBzrでも問題ないかどうかは、しらない。そのうち試す。
巻き戻った状態で新たに commit しようとすると「Do you want to creade a branch now?」と聞かれる。「はい」「いいえ」いずれでも、これまでの commit は残したまま新たなブランチとなるが、「はい」では次にブランチ名を聞かれ、「いいえ」とするとブランチ名なしとなる。ブランチ名なしの場合、以降の commit でも再度「Do you want to creade a branch now?」と聞かれるので、その際にブランチ名を付けることができる。
過去の commit 時点のファイルをひとつだけ取出して、別の場所にセーブしたい時は、以下のようにする。
ネットワーク上にあるフォルダにエクスプローラでアクセスして、ローカルリポジトリを作ったりコミットしたりしたいが、エラーが出る。
どうやら、信頼できないリポジトリを不用意に操作してしまわないようにするセキュリティ機能らしい。USB メモリ上のフォルダでも同様のエラーが出るらしい。信頼できるリポジトリとして登録する必要がある。基本的にはエラーメッセージ通りにコマンド実行すればよい。
「Could not initialize a new repository.」とエラー表示がでる。
まずは不完全なリポジトリを削除する。これは単に、フォルダに作成されている「.git」フォルダを削除すればよい。隠しフォルダになっているので、「.git」フォルダが見えない場合は、エクスプローラの表示 > オプション で フォルダオプションを開き、表示 > 詳細設定 > ファイルとフォルダの表示 > 隠しファイル、隠しフォルダ...を表示する をチェックして見えるようにできる
スタートメニューから Git > Git CMD を開いて、以下のコマンドを実行する。(フォルダパスはリポジトリ作成したいフォルダに書き換える)
> git config --global --add safe.directory "//192.168.0.70/test"
注意点は以下の通り。
コミットしようとすると「Failed to get UnRev file list...」というエラー表示が出る。
上記と同様に、Git CMD で以下のコマンドを実行する。
> git config --global --add safe.directory "%(prefix)///192.168.0.70/test"
上記コマンドは、ユーザーフォルダ(c:\Users\ユーザー名)にある .gitconfig ファイルに以下の様な内容で反映されている。コマンドの代わりにテキストエディタで.gitconfig ファイルを編集してもよい。
[safe] directory = //192.168.0.70/test directory = %(prefix)///192.168.0.70/test
上記コマンドはフォルダごとに行わないといけないのだが、メンドクセーという場合は、森羅万象すべて信頼するという意味で以下のようにする方法もある。
> git config --global --add safe.directory *
ただし、セキュリティノーガード戦法になるので、良くない。
セッティングも「記事」として記述する。
このことを理解しておけば、取っ掛かりにはなるかと思います。例えば、タイトルは「SiteTitle」という記事として書かれています。この記事は隠し記事になっていて、右のタブ「More」 > タブ「Shadowed」と進むと表示されます。記事「SiteTitle」の本文を編集すれば、タイトルを変えることができます。
このタブ「Shadowed」には、他にも隠し記事が列挙されています。記事「MainMenu」はページ左に表示する内容が書かれています。記事「StyleSheet」にはページのデザインについて書かれています(最初は何も書かれてませんけど)。タブにどんな項目を表示するかというのも記事「SideBarTabs」や Tab で始まる記事に記述されています。
また、配布されている プラグイン も記事として導入します。こちらは隠し記事ではなく、タグ「systemConfig」がついた記事となっています。
ということで、つぎは、どのように記事を書けばよいかということになります。それには TiddlyWiki 固有の作法や、HTML・CSS・JavaScript の知識が必要となります。勉強すればいいじゃない。
多数の記事を表示させると、縦に長くなって、メインメニューとかにアクセスしにくくなりますよね。というわけで、スクロールしてもメインメニューが追従するようにする方法です。
左のタブにある More > Shadowed > StyleSheet で隠し記事[StyleSheet」を表示。Edit を押して編集モードにはいります。で、以下にように本文に追記して done 。
#mainMenu{ position: fixed; }
んー、でもこの「position: fixed;」は IE6 では機能しません。でも方法はあります。IE だけに実装さいれているらしい CSS 中での expression 関数というのがありまして、コレを使って以下のようにすれば、IE6 でも IE8 でも Firefox3 でも、スクロール追従が可能です。
#mainMenu{ position: fixed; position: expression("absolute"); top: expression(eval(document.documentElement.scrollTop+100)); }
IE では多少カクカクした動きになりますがそこは我慢です。「+100」のところは好みに合わせて調整してください。あと今回はメインメニューでしたけども、他の要素にも適用可能です。
ppBlogの記事を参照しました。
TiddlyWikiには、他のTiddlyWikiファイルからインポートできる機能があります。けど、俺の書きためてきた、独自フォーマットのメモ集をどうにかしてインポートできるようにしたい。
以下のようなフォーマットのファイルを用意すれば、TiddlyWikiにインポート可能です。なので、メモ集を以下のフォーマットに変換するプログラムを作ればいいわけです。(それが大変)
<html><body><div id="storeArea"> <div title="記事1のタイトル" modifier="氏名" created="201002020540" tags="記事1のタグA 記事1のタグB"> <pre> 記事1の本文 </pre></div> <div title="記事2のタイトル" modifier="氏名" created="201002012100" tags="記事2のタグA 記事2のタグB"> <pre> 記事2の本文 </pre></div> </div></body></html>
では、順に説明を。基本的に内容は HTML です。全体は <html><body> <div id="storeArea"> でくくられており、その中に記事が書かれています。文字コードは UTF-8 です。(hta で運用している場合は、さらに10進数値文字参照に変換しないとダメっぽい。)
1つの記事は、<div> でくくられていて、タイトルなど情報が div タグの属性として設定され、本文が <pre> 内に書かれています。
title 属性には、記事のタイトルを記載します。Wikiなので、他の記事と同じタイトルは付けられません(上書きされます)。重複しそうな場合は、日付や連番をつけるなどします。
modifier 属性には、記事を書いた人の氏名を記載します。
created 属性には記事を作成した時刻を記載します。時刻は協定世界時(UTC)で記載します。例えば、日本時間 2010年02月02日05時40分 の記事の場合、協定世界時(UTC)では9時間引いた 2010年02月01日20時40分 ですので、created="201002012040" とします。
tags 属性には、タグをスペース区切りで記載します。
他にも、modified や changecount といった属性がありますが、気にしなくていいのでは? 気になる人は、TiddlyWikiに適当に記事を書いて、ファイルをテキストエディタで開いて、<div id="storeArea"> 以下に書いてある記事データを見て、確認してください。
今開いてるフォルダの表示形式を全てのフォルダに適用するには以下のようにします。(表示形式とは、アイコン表示、詳細表示とか言うヤツのこと)
変更するには、メニュー > ツール > フォルダ設定 を開いて、さっき付けた名前のアイテムを削除して、やり直してください。分かる人はアイテムのプロパティを編集しても良い。
まずリンクバーにフォルダを作ります。
次にフォルダ内にアイテムを登録します。
作ったフォルダ内にフォルダへのショートカットをいれても良いけど、その場合には現在のタブに開かれることになります。
画像が保存されたフォルダでは、縮小版表示にすると便利ですが、フォルダも縮小版表示されてしまい、ちょっと邪魔です。指定したフォルダ内でリストにフォルダを表示させないようにするには以下のようにします。
ViewStyle:5 Sort:更新日時 Open: ;!*.folder
上記では並び順を更新日時にしていますが、名前順にしたければ「Sort:名前」にすればいいです。また、フォルダ設定に複数のアイテムが登録されている場合、下のものほど優先度が高いので、アイテムをマウスでドラッグして順番を変えてやります。
画像中に使われている色をマウスで指定して、その色を別の色に置換するには次のようにします。
色の選択時に厳密に同じ色だけを選択するには、選択する前にツールボックス下欄のしきい値の値を小さくしておきます。似た色も一緒に選択するには逆にしきい値を大きくします。実際には、マウスでひとまず色をクリックしておいて、しきい値を変えてもう一度色をクリック、しきい値を変えてクリックを繰り返して、望みの選択範囲になるように調節すればよいでしょう。
普通にインストールするだけで、起動すれば日本語表示になるはずなのですが、そうならない場合があります。
原因として、環境変数LANG=ja以外の値がすでにセットされている可能性があります。 例えば、3D-CADソフトの PRO Engineer は日本語表示するためにLANG=jananeseと設定している(or する必要がある)ようです。
LANG=ja以外の値がすでにセットされている場合の対処方法としては、LANG=jaに設定する方法があります。環境変数を編集するには、スタートボタン > コントロールパネル > システム > 詳細設定 > 環境変数 と開いて、ユーザ環境変数を編集します。新規ボタンを押して、変数名:LANG、変数値:ja と入力してOKします。
しかしながら、この方法では上記 PRO Engineer のように LANG の値を読みに行くアプリケーションが他にもあった場合に、そのアプリが日本語表示でなくなってしまう可能性があります
そうならないために、バッチファイルを作り、一時的に環境変数を変更する方法があります。まず、以下のような内容のバッチファイル(.bat)を作成します。
set lang=ja cd "C:\Program Files\GIMP-2.0\bin" start gimp-2.6.exe
このバッチファイルを起動すると、LANGの値に関わらずGIMPが日本語で起動します。コマンド set は、実行中のコマンドプロンプトのみについて環境変数を変更したりするコマンドです。なので他のアプリには影響しません。GIMPを起動するときに常にこのバッチファイルを起動するようにすれば良いです。
G26 memo 2009年01月25日 使用言語を変更するを参照しました。
背景が単色の画像において、背景を透明色に変更するには以下のようにします。
http://www.geocities.jp/gimpmanual/manual.htmlを参照しました。
画像から不要なものをいい感じに消し去るために、Resynthesizerという GIMP プラグインがあります。
インストール方法は以下の通り。
使い方は以下の通り。
hen_cyberneの備忘録 : Resynthesizer @ [Gimp2.0][WindowsXP]を参照しました。
ロジクールのマウスについて、SetPointという公式アプリを使えば、ボタンにいろんな機能を割り当てることができます。が、限界があるので、AutoHotKeyに処理を引き継がせようと思い、通常使わないキーをボタンに割り当てたいと思いました。Setpoint の設定ファイルを直接メモ帳で編集することで、F13 や F14 といったキーを割り当てることが可能です。割り当てられれば、AutoHotKeyで F13 や F14 をトリガーとしたコードを書けばよいわけです。
まずは、普通にSetPointを起動した状態で、SetPointを使って、割り当てたいボタンに何か適当に(F12とか)割り当てます。そのあと、タスクトレイのSetPointアイコン右クリックからSetPointを終了します。
次に設定ファイルを編集します。設定ファイルは C:\Users\(ユーザー名)\AppData\Roaming\Logitech\SetPoint\use.xml ですので、これをメモ帳で開きます。以下のような記載のある行を探してください。
<Param DisplayName="F12" LParam="4128769" Modifier="0" VirtualKey="123"/>
「DisplayName="F12"」のところに、先ほど割り当てたキーが記載されています。ここが、マウスのボタンの設定が記載された部分ですので、ここを編集します。F13 を割り当てるには、以下のように書き直して上書き保存します。
<Param DisplayName="F13" LParam="4128769" Modifier="0" VirtualKey="124"/>
「DisplayName="F13"」は自分がわかりやすければ何でもいいです。「LParam="4128769"」はよくわかりません。そのままでよいと思います。「Modifier="0"」はShiftとかCtrlなどの修飾キーの設定です。使ったことないのでよく知りません。試しににSetpoint上でボタンに Shift+Ctrl+F12など割り当ててみて、ここの記載がどうなるか見てみればわかるんじゃないでしょうか。「VirtualKey="124"」には仮想キーコードを記載します。Windowsの仮想キーコード一覧(Win32API) などを参照してください。
ファイルを保存した後、SetPointを起動すれば有効になります。
マニュアルには書いてないそうですが、Evernoteはコマンドラインからある程度、操作することが可能です。Evernoteのインストールフォルダに「ENScript.exe」というのがあり、これにコマンドを投げれば操作可能です。使い方はヘルプを参照のこと。ヘルプは以下のようなコマンドで表示できます。
> ENScript.exe /? Usage: ENScript <command> [options] Commands: createNote - creates note from the specified file or url importNotes - imports notes from the specified export file or url showNotes - displays specified notes in the Evernote window printNotes - prints specified notes from the Evernote window exportNotes - exports specified notes into a file createNotebook - creates a notebook listNotebooks - lists specified notebooks to standard output syncDatabase - synchronizes database to the service Type "ENScript <command> /?" to get command specific help. @filename - specifies response file name contaning options one per line. Command line options that follow response file name specification override options specified in the response file.
> ENScript.exe showNotes /? Usage: ENScript showNotes [options] Options: /q query - query to filter the notes. If omitted, stdin is used to gather quer y specification. /u username - user name if not the same as database file name. /p password - user password to confirm Evernote service access. /d database - database file name if user name is not specified. If both database file name and user name are not specified, last login name is u sed and if there is none, USERNAME environment variable value is used as a user name.
たとえば、「領収書」で検索した結果を表示させるには以下のようにします。よく使う検索をランチャに登録しておくと便利そうです。
> ENScript.exe showNotes /q 領収書
「a4techsの備忘録 / Evernoteコマンドラインのヘルプ一覧」「DIGINOIZ:NET 3rd / Evernote for Windows付属のENScript.exeを使う」を参照しました。
Evernote の ENScript.exe を利用すると、コマンドラインでノートをエクスポートすることができます。コマンドをバッチファイルに書いておいて、タスクスケジューラに登録しておけば、定期的にデータのバックアップをとることができます。
以下はそのためのコマンドです。内容は、まず「username」というユーザ名のデータについて同期を行います。次に「俺のノートブック」という名前のノートブックに含まれるすべてのノートを、フォルダ「D:\temporary」に「20121115.enex」といった日付のファイル名でエクスポートします。ユーザ名など適宜書き換えて使ってください。
setlocal set dt=%date% set FName=D:\temporary\%dt:~-10,4%%dt:~-5,2%%dt:~-2,2%.enex "C:\Program Files\Evernote\Evernote\ENScript.exe" syncDatabase /u username "C:\Program Files\Evernote\Evernote\ENScript.exe" exportNotes /q notebook:"俺のノートブック" /f "%FName%" endlocal
コマンドライン中で日付文字列を得る方法についてはバッチ・ファイル中で日付をファイル名に使用する − @IT参照。ENScript.exe については[Evernote] コマンドラインから操作する参照。Evernote の検索クエリについてはご存じですか:Evernote 検索ボックスの使い方 | Evernote日本語版ブログ参照。
(追記 2012-11-19) 重複ファイル検索・削除ツールの UnDup で前日と同じ内容なら削除しようと思ってたが、エクスポートしたファイル内に同期日時の情報が入るため、ノートに変更がなくてもファイルの内容は毎回異なることになってしまう。UnDup には位置を指定して部分一致検索できる機能があるっぽいが、数値を入れても反映されない。(バグ?) 他のツールを探してみたが、部分一致で比較できるツールはなさそう。んー。
ノートにエクスプローラーからファイルをドロップすると、ファイルが Vault にコピーされたうえで、ファイルへのリンクがノートに記載されます。この時、画像やPDFファイルであればノート上で内容が確認できる埋め込み表示になります。
でも、特にPDFは表示サイズが大きく、ノートの途中で表示されると結構邪魔なんですよね。リンク文字列だけ表示するように(リンク表示)できないのか。
記載される文字列の先頭の「!」を消すと、リンク表示になります。
![[テスト.pdf]] ←ドロップすると、先頭に「!」がついた内部リンクになる、埋め込み表示される [[テスト.pdf]] ←先頭の「!」を消すと、リンク表示される
なお今のところ、ドロップ時のデフォルトをリンク表示にすることはできなさそうです。
AviUtlと拡張編集プラグインと使って動画編集をしている。プロジェクトファイル(.aup)と、関連する画像や動画を他のフォルダや他のPCに移動したい。でも、フォルダ構造とかパスとか維持しないといけないのだろうか。
プロジェクトファイルは、他のファイルへのパスを絶対パスで記録しています。なので、関連する画像や動画が別のフォルダに移動してしまうと読み込めなくなります。
でも、拡張編集の環境設定(拡張編集ウインドウで右クリック>環境設定)には「ファイルの場所が変更された時にプロジェクトパスから読む」という設定があります。これを ON にすると、ファイルを読み込めなかったときに、プロジェクトファイルと同じフォルダに同名のファイルがあればそれから読み込むようになります。
というわけで、関連する画像や動画をプロジェクトファイルと同じフォルダにおいて作業するようにし、「ファイルの場所が変更された時にプロジェクトパスから読む」をONにしておけば、そのフォルダごと移動させて編集を続行することができます。
ただし、相変わらず絶対パスで記録されているので、たまたまその絶対パスにファイルがあった場合にはそちらが優先されるようです。作業の途中段階として一式をコピーしておいておくような場合、古いほうのファイルを参照してしまうといったことがおこるかも。コピーした場合はコピー元のフォルダ名を変えておくなどしたほうがよさそう。
拡張編集のタイムライン上で動画ファイルを短くカットしたので、それに応じてその後のオブジェクトを全て前に詰めたい。Ctrl キー押しながら対象オブジェクトをクリックで選択すると複数選択できるので、グループ化してまとめて前に移動という方法がありますが、オブジェクトの数が多いと大変。
「右クリック>オブジェクトの選択>カーソル以降に開始するオブジェクトを選択」を使うと便利です。このとき Ctrl キーを押しながらマウス操作しないとダメです。また、引き続き Ctrl キーを押しながらオブジェクトを前にドラッグしてください。途中で Ctrl キーを話すと選択状態が解除されてしまいます。
底辺SNS・某カロイド◎ぬっぽん!:>Aviutlで空フレームを削除する→できた! を参照しました。
拡張編集のタイムライン上に画像を登録した際、大きなピクセルサイズの画像だと周囲がトリミングされた状態になります。大きな画像を動画上で拡大したり縮小させたりさせたいんだけどなあ。
拡張編集の環境設定に「最大画像サイズ」という項目があり、これを超えるサイズの画像は最大画像サイズ設定値にトリミングされてしまうようです。拡張編集の環境設定は、拡張編集のタイムライン上の右クリックメニューから入れます。「最大画像サイズ」の項目に、読み込みたい画像サイズと同じか大きなサイズを設定しておけば、大きなサイズの画像全体を読み込めるようになります。(たぶん、AviUtlの再起動が必要です。)
拡張編集「最大画像サイズ」の項目が空白の場合、AviUtl本体の設定が適用されます。メニュー > 環境設定 > システム設定 に 「最大画像サイズ」の項目があります。
P版のQTTabBarであった「詳細表示で交互に色を変える」って項目が、Q版のQTTabBarでは見当たらないんやけど、どうにかならんのか。
QTTabBarのオプションウインドウで、項目「互換ビュー」のタブ「カスタムカラー」の右下のほうに「奇数列」「偶数列」というのがあります。これです。
実際に設定するにはこんな感じ。
色などを変更するときは、先ほどリストに追加された項目を選択して背景色を選びなおしたりすればよいです。
タッチパネルディスプレイが接続されたシステムで、スクロールバーが表示されない設定になることがあるそうです。一時的対応と恒久対応があります。
一時的対応では、その操作をしたウインドウのみスクロールバーの表示が復活します。
恒久対応では、以後すべてのウインドウでスクロールバーの表示が復活します。
Adobe Reader でスクロールバーが表示されない場合の対応方法: ある SE のつぶやきを参照しました。
キーワード入力型ランチャの「fenrir」は、migemo検索ができて超イカスのですけど、新しく買ったPCで新たに必要ファイルをダウンロードして使おうとすると、migemo検索ができませんでした。以下のようにファイルをダウンロードしてきて設置すれば、動くはずなんだけど・・・
今入手できるのが、fenrir 0.75c、BREGEXP.DLL 2.0.4.29、migemo.dll 1.3.0.0 なんですけど、migemo.dll が新しいと migemo 検索できないようです。古いPCにあった C/migemo 1.1.0.7 (32bit)を持ってくると、migemo 検索できました。
たまたま古い migemo.dll が手元にあったからよかったけど、配布されてないので持ってない場合は作者にお願いするしかないか?
「SETUNA」っていう、画面キャプチャソフトがあります。画面の一部を切り取って最前面に置いておけるソフトで、webサイトの一部を見ながらwordに文章を書いたり、PDFの別ページにあるグラフ同士を横に並べて比較したりするのにすごい便利です。
が、すでに作者サイトがなくなっているので正規手順では入手不可。でも、INTERNET ARCHIVE なら入手できます。
ただ、いつまでもそういうわけにもいかないので、代替ソフトを探した。→Rapture 設定などを以下のようにすると、自分的には似たように使える。
tDiaryをダウンロードして 7-zip で解凍しようとしたが、tar 書庫を解凍すると、本来は含まれていないと思われる「PaxHeaders」というフォルダが生成されたり、展開中に「ファイルの上書き確認」をされたりして、何かおかしい。PeaZip でも同じだった。
どうやら、tar には複数のフォーマットがあるようで、そのうちの一つのフォーマットがダメっぽい。
Windows に付属している tar コマンドを使えば、ちゃんと解凍できます。コマンドプロンプトで以下のようにすればよい。
> tar -xvf archive.tar.gz
Smart Familinkで動画を見るときに自動画面回転をONに、見終わってSmart Familinkを切ったら自動画面回転OFFにしたい。Llama を使ってそういうように設定したつもりなんだけど、うまくいかない。
Smart Familinkで動画を再生したとき、実際に再生しているのは別のアプリで、Familink Secure Player という名前です。なので、この Familink Secure Player が起動したとき、終了したときをトリガーにして自動画面回転を変更するようにすればよいです。
Llamaの設定 > 実験中の機能 > WiFiネットワークを確認 の機能を使って、家に帰ってきたら○○する、みたいなイベントを作ってるわけですが、この位置確認のためのWi-Fiオンは一時的にオンになるだけで、すぐにオフになるのが通常の動作です。しかし、オフにならないことが頻繁にありました。どのアクセスポイントにも接続していないのに。
詳しいことはわかりませんが、当方の場合はアプリの「docomo Wi-Fiかんたん接続」をアンインストールすれば解消できました。LlamaのほかにWi-Fiオンオフを自動設定するようなアプリがあると、干渉するんでしょうかね。
場所の設定がしたいのに、近況タブに見えるはずのWiFi名が表示されないことがあります。
リストの表示件数は決まっていて、そこからあふれているのかもしれません。表示件数は設定で変更できます。ナビゲーションバー右端の点々アイコン > 設定 > デバッグ設定(一番下) > Max recent items をタップして、大きな数に設定してください。
・・・なんだけど、この設定が反映されていないような感じなのよね。よくわからん。順番が入れ替わるようになるまでひたすら待つしかないかもしれない。
「Wi-Fi SSID の変化」トリガーというのがありますが、特定の SSID の有無を「条件」にすることは標準ではできません。特定の SSID の有無を条件にできれば、SSIDを位置情報のように使うことができるのに。
例えば、病院にある SSID には接続はできないけど位置情報として使って「病院でイヤホン外したら」というマクロを作りたい。(「イヤホン外す」がトリガーで、「病院で」が条件)
変数 と マクロ を使えば、同じことができます。
これで、条件として変数「病院にいる」の値を見ればよいです。
シャープ製スマホには、「電話帳アクセスモニタ」というアプリが搭載されている場合があります。設定メニューの「ロックとセキュリティ」>「電話帳アクセスモニター」とたどると起動できます。 アプリの電話帳へのアクセスを制御できるようなんですが、新規に追加されたアプリに関しては、初期設定として「アクセスを許可する/通知する」が設定されることなっています。でも新規アプリを起動して電話帳にアクセスされてから通知されても、時すでに遅しないのでは? これを、初期設定で「アクセスを禁止する/通知する」にできないものか。
できないみたいです。
しかし、新規アプリが追加された時点で、新規アプリを起動しなくても、電話帳アクセスモニタにはリストアップされています。電話帳アクセスの権限を要求するアプリをインストールしたら、起動する前に電話帳アクセスモニタでアクセス制限かけとくのがよいのではないでしょうか。
Yahoo!ニュースアプリで、通知設定で朝刊、昼刊、夕刊をONにしていると、決まった時間に通知がされて、タップすると朝刊などの画面に遷移します。でも通知以外から朝刊などの画面に遷移する方法が見当たらない。
「主要」ニュースの画面で、一番上にスクロールした状態だと、右下に「朝刊」とかのアイコンが出ていますので、それをタップすれば表示されます。しかしこのアイコンが表示される時間帯が決まっていて、8〜12時と18〜24時だけみたいです。
パソコンのブラウザ上のGoogleマップで作成した経路情報は、メール経由でAndroidへ送信することができます。で、その経路でナビを開始したいのだが、開始ボタンが見当たらない。
ナビ開始ボタンは、現在地が出発地の近くになると表示されます。遠くにいると経路の確認・編集しかできません。
買ったときに付いてた 120GB のハードディスクが一杯になってきたので、ハードディスクを増設した。新たに買ってきた 500GB のヤツをマスターの端子にさして、もともと付いてた 120GB のヤツをスレーブの端子にさしかえた。んで、500GBの方に WindowsXPをインストール。そのあと、古い 120GB のヤツから 新しい 500GB のヤツにデータ移してたんだけど、なんか、異常に転送速度が遅い、1MB/sec とかそんなくらい。さらに転送中、動画プレイヤーとかアプリの動作が不安定になる。んんー、なんでー?
BIOSの設定をいじると直りました。いじったところは Drive configuration > Primary Slave 何とか のところ。最初、ここが off になってたので auto にかえる。この時点で、表示が 「unknown device」になってるのだが、BIOS 設定を抜けて、再度入りなおすと 「harddisk device」になってた。この状態でデータ転送すると 35MB/sec 位になった。
Windows7マシンに、AX300のユーティリティーソフトをインストールしようとしましたが、SmartVision/PLAYER をインストールすることができませんでした。「ご使用のパソコンにはサウンドデバイスがありません。」と出ます。サウンドデバイスはあるんだけどなぁ。また、AX連携ツール は SmartVision/PLAYER のインストールが必要なので、これもインストール不可です。
回避方法は不明です。どうしたものか。
ARecXプレイヤー 1.5 では番組を再生できるのですが、ARecX6プレイヤー 2.00-01 では、再生用の別ウインドウは表示されるものの、その中にプレイヤーが表示されず、番組を再生することができませんでした。
不具合については、まずARecX6 Ver.2.00ベータの不具合情報を参照するのが良いですが、ウチの場合は InternetExplorer をバージョン 6 からバージョン 8 にすることで再生できるようになりました。なぜか Firefox でも再生できなかったのですが、これも再生できるようになりました。
急にまた、Arecx6 番組再生用ウインドウは表示されるものの、その中にプレイヤーが表示されない症状が現れました。いろいろ確認したところ、Firefox のアドオンである FlashStopper を無効にすると正常に視聴できるようになりました。以前は有効でも正常に視聴できていたのに、なぜこうなったかは不明です。
FlashStopper を使い続けるには、FlashStopper のアドオン設定で Arecx6 の URI を除外すればよいです。「Exceptions」のボタンを押すと現れるウインドウにて、「サイトのアドレス」欄にArecx6 のURI (うちの場合は http://192.168.0.2)を入力して、「許可」ボタンを押してリストに追加、「変更を保存」ボタンで設定が完了します。
Arecx6 番組再生用ウインドウは表示されるものの、「サーバーに接続できませんでした」と表示されて、番組が再生されなくなりました。
何が起きてるのかよくわからないんですけども、以下のことをやると番組が再生されるようになりました。
Windowsを再起動すると、また「サーバーに接続できませんでした」となる場合があるのですが、上記をやるとまた再生できるようになりました。
はてなアンテナに、ニコニコ動画の公開マイリストの更新チェックをさせたいと思いました。
まず普通にマイリストのURLをはてなアンテナに登録しましたが、内容が更新されていないのに更新されたことになってしまいます。マイリスト画面の最下部には総動画数やら総再生数やらが入ってて、この数値の変更が引っかかってるようです。なのではてなアンテナの更新無視文字列に「総動画数」を設定してみたところ、今度はマイリストが更新されてるのに、はてなアンテナは拾ってくれませんでした。マイリスト画面のソースを見てみると、どうも登録動画のデータがJavaScriptで書かれているようで、はてなアンテナはJavaScriptのコード部分の変更は検知しないようです。
次にマイリストのRSSのURLをはてなアンテナに登録しましたが、これも内容が更新されていないのに更新されたことになってしまいます。RSSデータ内の<pubDate>、<lastBuildDate>あたりがマイリスト更新とは無関係に変更されているようです。これを無視するために、はてなアンテナの更新無視文字列に、「(c) niwango, inc. All rights reserved.」を入れると、うまくいきそうな気がします。(確認中)
AQUOSブルーレイの Wi-Fi 転送&ダビング機能により、AQUOS Phone のプリセットアプリである Smart Familink から録画番組を見たり、番組をダビングしたりできます。AQUOS FamilinkはSHツールのアプリ内から起動できます。
なんですけど、録画した番組がリストアップはされるのですが、タップしても何の反応もない場合があります。公式資料が見つかりませんが、最高画質(DR)で録画したものは見れないようです。
なので、あらかじめ低画質で録画しておくか、もしくはすでに録画したものについてはレコーダ内のダビング機能で低画質ダビングすればよいです。
ASUSTOR製NAS AS3102T にはプリントサーバー機能があるので、Canon製USBプリンタ LBP5050 を接続して、WindowsからLAN経由で印刷しようと思ったのですが、印刷できませんでした。結果的には、NASのプリントサーバー機能は双方向通信をサポートしていないことが原因のようです。
接続するために以下の事を行いました。
印刷をしてみると、WindowsPCのブラウザでみるNAS管理ページでは印刷キューを受け取っているようだが、プリンタ実機はなにも動作が開始されない。
ためしにプリンタをWindowsPCに直接接続して印刷しようとしたところ、トナーの寿命が近い旨のメッセージが表示されました。無視して続行すると印刷できました。このメッセージはプリンタをNASに接続した場合には表示されていませんでした。
こういったメッセージはプリンタとの「双方向通信」によって実現されています。Windowsにてプリンタのプロパティー > ポート を見ると「双方向サポートを有効にする」というチェックボックスがあり、チェックを入れることで双方向通信が可能になります。直接接続している場合はそれでよいのですが、NASに接続した場合、NASが双方向通信をサポートしていないので、双方向通信できないということになります。そして、プリンタが双方向通信でエラーを通知しているのに、NASがそれを中継できずWindowsに送信できないので、なぜか印刷できないという状況になっていたと思われます。違うかも知れんけど。
なんだよ、プリントサーバー機能があっても、実質使えねぇのかよ。でも、NASメーカーが接続ハードウエアの互換性確認を行っている機種なら大丈夫なのかも。
QNAP製NAS TS-230 のフォルダに Windows のエクスプローラからアクセスすると、「ネットワーク資格情報の入力」を求められる。NASに登録してあるアカウント情報を入れればよいのだけれど、いちいち入力するのメンドイ。認証なしでアクセスできるようにしたい。
NAS側の設定を変更すると実現できる、という情報があったがだめだった。情報は以下とおり、NASのコントロールページにて以下のように設定を変更する。
これでフォルダ一覧は見れるようになったのだけれど、フォルダ開こうとすると相変わらず認証を求められる。どうすればよいのか。
価格.com - 『ゲストユーザーでも共有フォルダにアクセス可能にする方法』 QNAP TS-431P のクチコミ掲示板を参照しました。
SwitchBot のデバイスは、スマホのアプリでオートメーション組んだり、スマートスピーカーから操作できたりいろいろ便利ですが、SwitchBot API を利用してプログラムから操作することも可能です。これにより祝日かどうか、特定機器がネットワーク接続してるかどうかなど、より多様な条件判定と組み合わせたりできます。というわけで、Ruby で書いた「プラグミニを操作する」サンプルコードを示します。
事前準備として、トークンとシークレットキーの入手が必要です。
トークンとシークレットキーは他人に漏らさないようにしてください。悪用されると他人に勝手に機器を操作されるおそれがあります。漏れたと思ったら「リセット」して、再発行すればよいです。
以下がサンプルコードです。コード中に先ほどのトークンとシークレットキーを貼り付けてください。説明できるほどの知識がないので説明なしです。
require 'securerandom'
require 'base64'
require 'openssl'
require 'httpclient' #要gem install
require "json"
token = "" # switchbotアプリから入手した文字列をコピペ
secret = "" # switchbotアプリから入手した文字列をコピペ
# 署名生成
t = (Time.now.to_f * 1000).to_i
nonce = SecureRandom.alphanumeric
sign = Base64.strict_encode64(
OpenSSL::HMAC.digest('sha256', secret, "#{token}#{t}#{nonce}") )
puts "Authorization: #{token}"
puts "sign: #{sign}"
puts "nonce: #{nonce}"
puts "t: #{t}"
# デバイスリスト取得
client = HTTPClient.new
url = "https://api.switch-bot.com/v1.1/devices"
header = { "Authorization" => token,
"sign" => sign,
"nonce" => nonce,
"t" => t ,
'Content-Type' => 'application/json; charset=utf8'}
response = client.get(url, header: header)
puts response.body # リストがJSONで得られる
device_list = JSON.load(response.body)['body']['deviceList']
# 「fan」という名前のプラグをON
device = device_list.find{|dev| dev["deviceName"]=="fan"}
device_id = device["deviceId"]
url = 'https://api.switch-bot.com/v1.1/devices/'+device_id+'/commands'
command = { "commandType" => 'command',
"command" => 'turnOn',
"parameter" => 'default'}.to_json # 操作内容をJSONで作成
response = client.post(url, header: header, body: command)
puts response.body # 結果がJSONで得られる
sleep(5)
# 状態を取得
url = 'https://api.switch-bot.com/v1.1/devices/'+device_id+'/status'
response = client.get(url, header: header)
puts response.body # 状態がJSONで得られる
sleep(5)
# プラグをOFF
url = 'https://api.switch-bot.com/v1.1/devices/'+device_id+'/commands'
command = { "commandType" => 'command',
"command" => 'turnOff',
"parameter" => 'default'}.to_json # 操作内容をJSONで作成
response = client.post(url, header: header, body: command)
puts response.body # 結果がJSONで得られる
HTTPクライアントとして httpclient ライブラリを使用していますが、他のでもできると思います。
参考にしたサイトは以下です。
さくらのレンタルサーバーにて、Ruby で書かれた cgi スクリプトを動かしたいのだけれど、ライトプランでは SSH を使えないので gem install できない。標準ライブラリしか使えないのか・・・?
万能ではないかもしれませんが、何とか使えるようにする方法はあります。ここでは例として httpclient を使えるようにする方法をあげます。
まずhttpclient の右カラムの「ダウンロード」から gem ファイル(httpclient-2.8.3.gem)をダウンロードします。次に コマンドプロンプトにて以下のコマンドを実行し、gem ファイルを展開します
> gem unpack httpclient-2.8.3.gem
出てきた中身のうち、lib フォルダ内にあるファイルをすべてをサーバーに送ってください。保存先は、動かしたいスクリプトのフォルダです。下のような構成になるはずです。
test
┣ sample.cgi(動かしたいスクリプト)
┃
┃ (以下 gem から取り出したファイル)
┣ hexdump.rb
┣ http-access2.rb
┣ httpclient.rb
┣ jsonclient.rb
┣ oauthclient.rb
┣ http-access2(フォルダ)
┃ ┗・・・
┗ httpclient(フォルダ)
┗・・・
sample.cgi(動かしたいスクリプト)の内容は以下です。
#!/usr/local/bin/ruby
# coding: euc-jp
print "Content-type: text/html\n\n"
$LOAD_PATH.unshift File.dirname(__FILE__) # ここがポイント
require 'httpclient'
client = HTTPClient.new
url='https://www.google.com/'
response = client.get(url)
puts response.body
5行目でライブラリのロードパスを追加しているのがポイントです。これにより sample.cgi の置いてあるフォルダがロードパスに加わり、送った httpclient 関連ファイルが読み込まれます。
こんな感じで使えるようにすることが可能ですが、依存ライブラリが多いと、結構大変化かも・・・
さくらのレンタルサーバーで使える Ruby のバージョンを上げたくて新サーバーへ移行したのに、v1.8.7 のままなんだが?
プラン変更・移行ツールの機能別引き継ぎ項目を知りたい さくらのサポート情報 を参照すると、「home/アカウント/」フォルダに「.ruby.version」というファイルが置いてあり、ここで Ruby のバージョンを指定しているとのこと。確かに、中身を見ると「1.8」と書いてある。これを消す or リネームすると v2.5.9 になった。
なお、Ruby のバージョン等は レンタルサーバ コントロールパネル の サーバー情報 > 各種コマンドのパス で確認できます。