WindowsLiveWriterで画像付きの記事をWordPressに投稿するとエラーになる

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

エラー内容は、↓。

ブログへの接続中にエラーが発生しました。

https://qos.dev7.net/wordpress/xmlrpc.php

基礎になる接続が閉じられました: 接続が予期せずに閉じられました

20110504_111518_1

C:\Users\User\AppData\Local\Windows Live Writer\
Windows Live Writer.log
に、↓のExceptionが。

WindowsLiveWriter,1.5948,None,00017,04-May-2011 11:15:16.136,"XML-RPC request:
https://qos.dev7.net/wordpress/xmlrpc.php
<?xml version=""1.0"" encoding=""utf-8""?>
<methodCall>
 <methodName>metaWeblog.newMediaObject</methodName>
 <params>
  <param>
   <value>
    <string>1</string>
   </value>
  </param>
  <param>
   <value>
    <string>webmaster</string>
   </value>
  </param>
  <param>
   <value>[removed]</value>
  </param>
  <param>
   <value>
    <struct>
     <member>
      <name>name</name>
      <value>
       <string>xxxxxxxxxx.png</string>
      </value>
     </member>
     <member>
      <name>type</name>
      <value>
       <string>image/png</string>
      </value>
     </member>
     <member>
      <name>bits</name>
      <value>
       <base64>[25417 bytes]</base64>
      </value>
     </member>
    </struct>
   </value>
  </param>
 </params>
</methodCall>",""
WindowsLiveWriter,1.5948,None,00018,04-May-2011 11:15:16.136,"== BEGIN WebException =====================",""
WindowsLiveWriter,1.5948,None,00019,04-May-2011 11:15:16.136,"Status: ConnectionClosed",""
WindowsLiveWriter,1.5948,None,00020,04-May-2011 11:15:16.167,"System.Net.WebException: 基礎になる接続が閉じられました: 接続が予期せずに閉じられました
   場所 System.Net.HttpWebRequest.GetResponse()
   場所 WindowsLive.Writer.CoreServices.HttpRequestHelper.SendRequest(String requestUri, HttpRequestFilter filter)
   場所 WindowsLive.Writer.CoreServices.XmlRpcClient.CallMethod(String methodName, XmlRpcValue[] parameters)
   場所 WindowsLive.Writer.BlogClient.Clients.XmlRpcBlogClient.CallMethod(String methodName, XmlRpcValue[] parameters)",""
WindowsLiveWriter,1.5948,None,00021,04-May-2011 11:15:16.167,"== END WebException =======================",""
WindowsLiveWriter,1.5948,Fail,00022,04-May-2011 11:15:16.189,"WindowsLive.Writer.Extensibility.BlogClient.BlogClientConnectionErrorException: ネットワーク接続エラー - ブログへの接続中にエラーが発生しました。

https://qos.dev7.net/wordpress/xmlrpc.php

基礎になる接続が閉じられました: 接続が予期せずに閉じられました
   場所 WindowsLive.Writer.BlogClient.Clients.XmlRpcBlogClient.CallMethod(String methodName, XmlRpcValue[] parameters)
   場所 WindowsLive.Writer.BlogClient.Clients.MetaweblogClient.DoBeforePublishUploadWork(IFileUploadContext uploadContext)
   場所 WindowsLive.Writer.PostEditor.WeblogBlogFileUploader.DoUploadWorkBeforePublish(IFileUploadContext uploadContext)","   場所 System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
   場所 System.Environment.get_StackTrace()
   場所 WindowsLive.Writer.CoreServices.Diagnostics.LogFileTraceListener.Fail(String message)
   場所 System.Diagnostics.TraceInternal.Fail(String message)
   場所 System.Diagnostics.Trace.Fail(String message)
   場所 WindowsLive.Writer.PostEditor.WeblogBlogFileUploader.DoUploadWorkBeforePublish(IFileUploadContext uploadContext)
   場所 WindowsLive.Writer.PostEditor.BlogPostReferenceFixer.FileUploadWorker.DoUploadWork(String fileReference, BlogFileUploader fileUploader, Boolean isWindowsLiveLightboxCloneEnabled)
   場所 WindowsLive.Writer.PostEditor.BlogPostReferenceFixer.LocalFileTransformer.Transform(BeginTag tag, String reference)
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.LocalFileReferenceFixupFilter.FixReferences(BeginTag tag, String reference)
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.OnBeginTag(BeginTag tag)
   場所 WindowsLive.Writer.CoreServices.LightWeightHTMLDocumentIterator.Parse()
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.FixReferences(TextWriter output, ReferenceFixer referenceFixer, ReferenceFixedCallback referenceFixed)
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.FixReferences(String html, ReferenceFixer fixer, ReferenceFixedCallback referenceFixed)
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.FixLocalFileReferences(String html, ReferenceFixer fixer, ReferenceFixedCallback referenceFixed)
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.FixLocalFileReferences(String html, ReferenceFixer fixer)
   場所 WindowsLive.Writer.PostEditor.UpdateWeblogAsyncOperation.LocalSupportingFileUploader.UploadFilesBeforePublish()
   場所 WindowsLive.Writer.PostEditor.UpdateWeblogAsyncOperation.DoWork()
   場所 WindowsLive.Writer.CoreServices.AsyncOperation.InternalStart()
   場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   場所 System.Threading.ThreadHelper.ThreadStart()"
WindowsLiveWriter,1.5948,Fail,00023,04-May-2011 11:15:16.221,"WindowsLive.Writer.Extensibility.BlogClient.BlogClientConnectionErrorException: ネットワーク接続エラー - ブログへの接続中にエラーが発生しました。

https://qos.dev7.net/wordpress/xmlrpc.php

基礎になる接続が閉じられました: 接続が予期せずに閉じられました
   場所 WindowsLive.Writer.BlogClient.Clients.XmlRpcBlogClient.CallMethod(String methodName, XmlRpcValue[] parameters)
   場所 WindowsLive.Writer.BlogClient.Clients.MetaweblogClient.DoBeforePublishUploadWork(IFileUploadContext uploadContext)
   場所 WindowsLive.Writer.PostEditor.WeblogBlogFileUploader.DoUploadWorkBeforePublish(IFileUploadContext uploadContext)
   場所 WindowsLive.Writer.PostEditor.BlogPostReferenceFixer.FileUploadWorker.DoUploadWork(String fileReference, BlogFileUploader fileUploader, Boolean isWindowsLiveLightboxCloneEnabled)
   場所 WindowsLive.Writer.PostEditor.BlogPostReferenceFixer.LocalFileTransformer.Transform(BeginTag tag, String reference)
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.LocalFileReferenceFixupFilter.FixReferences(BeginTag tag, String reference)
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.OnBeginTag(BeginTag tag)
   場所 WindowsLive.Writer.CoreServices.LightWeightHTMLDocumentIterator.Parse()
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.FixReferences(TextWriter output, ReferenceFixer referenceFixer, ReferenceFixedCallback referenceFixed)
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.FixReferences(String html, ReferenceFixer fixer, ReferenceFixedCallback referenceFixed)
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.FixLocalFileReferences(String html, ReferenceFixer fixer, ReferenceFixedCallback referenceFixed)
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.FixLocalFileReferences(String html, ReferenceFixer fixer)
   場所 WindowsLive.Writer.PostEditor.UpdateWeblogAsyncOperation.LocalSupportingFileUploader.UploadFilesBeforePublish()
   場所 WindowsLive.Writer.PostEditor.UpdateWeblogAsyncOperation.DoWork()
   場所 WindowsLive.Writer.CoreServices.AsyncOperation.InternalStart()","   場所 System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
   場所 System.Environment.get_StackTrace()
   場所 WindowsLive.Writer.CoreServices.Diagnostics.LogFileTraceListener.Fail(String message)
   場所 System.Diagnostics.TraceInternal.Fail(String message)
   場所 System.Diagnostics.Trace.Fail(String message)
   場所 WindowsLive.Writer.PostEditor.BlogPostEditingManager.UpdateWeblog(Boolean publish)
   場所 WindowsLive.Writer.PostEditor.BlogPostEditingManager.PostToWeblog(Boolean publish)
   場所 WindowsLive.Writer.PostEditor.BlogPostEditingManager.PublishAsDraft()
   場所 WindowsLive.Writer.PostEditor.PostEditorMainControl.commandPostAsDraft_Execute(Object sender, EventArgs e)
   場所 WindowsLive.Writer.ApplicationFramework.Command.RaiseEvent(Object eventKey, EventArgs e)
   場所 WindowsLive.Writer.ApplicationFramework.Command.OnExecute(EventArgs e)
   場所 WindowsLive.Writer.ApplicationFramework.Command.PerformExecute()
   場所 WindowsLive.Writer.ApplicationFramework.Command.PerformExecute(CommandExecutionVerb verb, PropertyKeyRef key, PropVariantRef currentValue, IUISimplePropertySet commandExecutionProperties)
   場所 WindowsLive.Writer.ApplicationFramework.CommandManager.Execute(UInt32 commandId, CommandExecutionVerb verb, PropertyKeyRef key, PropVariantRef currentValue, IUISimplePropertySet commandExecutionProperties)
   場所 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   場所 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
   場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   場所 System.Windows.Forms.Application.Run(Form mainForm)
   場所 WindowsLive.Writer.ApplicationFramework.SatelliteApplicationForm.Launcher.ThreadMain(Object[] parameters)
   場所 WindowsLive.Writer.CoreServices.Threading.ThreadStartWithParams.Run()
   場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   場所 System.Threading.ThreadHelper.ThreadStart()"
WindowsLiveWriter,1.5948,None,00024,04-May-2011 11:15:16.239,"DisplayableException occurred: WindowsLive.Writer.Extensibility.BlogClient.BlogClientConnectionErrorException: ネットワーク接続エラー - ブログへの接続中にエラーが発生しました。

https://qos.dev7.net/wordpress/xmlrpc.php

基礎になる接続が閉じられました: 接続が予期せずに閉じられました
   場所 WindowsLive.Writer.BlogClient.Clients.XmlRpcBlogClient.CallMethod(String methodName, XmlRpcValue[] parameters)
   場所 WindowsLive.Writer.BlogClient.Clients.MetaweblogClient.DoBeforePublishUploadWork(IFileUploadContext uploadContext)
   場所 WindowsLive.Writer.PostEditor.WeblogBlogFileUploader.DoUploadWorkBeforePublish(IFileUploadContext uploadContext)
   場所 WindowsLive.Writer.PostEditor.BlogPostReferenceFixer.FileUploadWorker.DoUploadWork(String fileReference, BlogFileUploader fileUploader, Boolean isWindowsLiveLightboxCloneEnabled)
   場所 WindowsLive.Writer.PostEditor.BlogPostReferenceFixer.LocalFileTransformer.Transform(BeginTag tag, String reference)
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.LocalFileReferenceFixupFilter.FixReferences(BeginTag tag, String reference)
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.OnBeginTag(BeginTag tag)
   場所 WindowsLive.Writer.CoreServices.LightWeightHTMLDocumentIterator.Parse()
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.FixReferences(TextWriter output, ReferenceFixer referenceFixer, ReferenceFixedCallback referenceFixed)
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.FixReferences(String html, ReferenceFixer fixer, ReferenceFixedCallback referenceFixed)
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.FixLocalFileReferences(String html, ReferenceFixer fixer, ReferenceFixedCallback referenceFixed)
   場所 WindowsLive.Writer.CoreServices.HTML.HtmlReferenceFixer.FixLocalFileReferences(String html, ReferenceFixer fixer)
   場所 WindowsLive.Writer.PostEditor.UpdateWeblogAsyncOperation.LocalSupportingFileUploader.UploadFilesBeforePublish()
   場所 WindowsLive.Writer.PostEditor.UpdateWeblogAsyncOperation.DoWork()
   場所 WindowsLive.Writer.CoreServices.AsyncOperation.InternalStart()",""

System.Net.HttpWebRequest.GetResponse()でException?
ってことは、XML-RPC request投げた後に、Response取得タイミングで切断されたってこと??

tcpdumpで、パケットキャプチャ

# tcpdump -i bge0 -x -w http_dump.cap -s 1600 'port 80 and host xxx.xxx.xxx.xxx'

して、解析してみたところ、たしかにXML-RPC requestの後、サーバ側が切断している模様だった。

サーバ側に問題があるようなので、
Wordpress自体にログ埋め込んで見ることに。

まず、xmlrpcのloggingを有効に。
安全のためにログファイルの場所も変更。(外部から見えない場所に変更)

wordpress/xmlrpc.php

/**
 * Whether to enable XMLRPC Logging.
 *
 * @name xmlrpc_logging
 * @var int|bool
 */

$xmlrpc_logging = 1;

/**
 * logIO() - Writes logging info to a file.
 *
 * @uses $xmlrpc_logging
 * @package WordPress
 * @subpackage Logging
 *
 * @param string $io Whether input or output
 * @param string $msg Information describing logging reason.
 * @return bool Always return true
 */

function logIO($io,$msg) {
    global $xmlrpc_logging;
    if ($xmlrpc_logging) {
//      $fp = fopen("../xmlrpc.log","a+");
        $fp = fopen("/tmp/xmlrpc.log","a+");

このlogIOを、あっちこっちに埋めて行った結果、
wordpress/wp-includes/media.php の wp_load_image で異常終了してた。

/**
 * Load an image from a string, if PHP supports it.
 *
 * @since 2.1.0
 *
 * @param string $file Filename of the image to load.
 * @return resource The resulting image resource on success, Error string on failure.
 */

function wp_load_image( $file ) {
    if ( is_numeric( $file ) )
        $file = get_attached_file( $file );

    if ( ! file_exists( $file ) )
        return sprintf(__('File &#8220;%s&#8221; doesn&#8217;t exist?'), $file);

    if ( ! function_exists('imagecreatefromstring') )
        return __('The GD image library is not installed.');

    // Set artificially high because GD uses uncompressed images in memory
    @ini_set('memory_limit', '256M');
    $image = imagecreatefromstring( file_get_contents( $file ) );

厳密に言うと、imagecreatefromstringで。

画像つき記事の投稿に失敗する原因は分かったけど、対処方法が分からなかったので、
GDではなくImageMagickを使うように、プラグイン「ImageMagick Engine」を導入。
これでようやく、画像つき記事の投稿が出来るようになった。

カテゴリー: ソフトウェア | タグ: , , , , , , , , | コメントする

WP to Twitterが動かなくてハマった

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m
  • Consumer Key
  • Consumer Secret
  • Access Token
  • Access Token Secret

をちゃんと設定して、「Connect to twitter」をクリックしたのに、何もならない。エラーも出ない。

Twitter Applications | dev.twitter.com
で何回も設定しなおしたりしてもダメ。

php.log見てみたら、↓のログが。。

25869 [02-Apr-2011 11:34:51] PHP Fatal error:  Call to undefined function curl_init() in /usr/local/www/data/wordpress/wp-content/plugins/wp-to-twitter/jd_twitterOAuth.php on line 200

php5-curl入れて、apache2再起動したら

% sudo portinstall php5-curl
% sudo /usr/local/etc/rc.d/apache22 restart

WP to Twitterもちゃんと動作した。

カテゴリー: サーバ管理 | タグ: , , , | コメントする

HyperEstraierのdoc_linkをURLデコードして表示


Warning: Undefined array key "file" in /usr/local/www/apache24/data/wordpress/wp-includes/media.php on line 1723
この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m


(超弩級Wikipedia検索の画面をお借りしてます)

緑色で、http://ja.wikipedia.org/wiki/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX になっている部分は、URLエンコードされている。

日本語フォルダ・ファイル名が大量にあるドキュメントに対して、estcmd gatherしているような場合は、
URLデコードされた状態で表示して欲しい場合もあります。ので、そのパッチを作ってみました。

・estseek.c (estseek.c.patch)

user@qos % diff diff -crN estseek.c estseek.c.new
*** estseek.c   2011-04-17 20:27:25.000000000 +0900
--- estseek.c.new       2011-04-17 20:26:38.000000000 +0900
***************
*** 91,96 ****
--- 91,97 ----
  const char *g_qxpndcmd = NULL;           /* command for query expansion */
  const char *g_logfile = NULL;            /* path of the log file */
  const char *g_logformat = NULL;          /* format of the log */
+ int g_doclinkdecode = FALSE;             /* whether to decode doc_link  */


  /* global variables for parameters */
***************
*** 304,309 ****
--- 305,312 ----
        g_logfile = skiplabel(rp);
      } else if(cbstrfwimatch(rp, "logformat:")){
        g_logformat = skiplabel(rp);
+     } else if(cbstrfwimatch(rp, "doclinkdecode:")){
+       if(!cbstricmp(skiplabel(rp), "true")) g_doclinkdecode = TRUE;
      }
    }
    if(!g_indexname) showerror("indexname is undefined.");
***************
*** 1760,1766 ****
    xmlprintf("<dd class="doc_navi">\n");
    xmlprintf("<span class="doc_link">");
    sprintf(numbuf, "%%%d@", detail ? 9999 : g_attrwidth);
!   xmlprintf(numbuf, turi);
    xmlprintf("</span>\n");
    if(*g_dispproxy != '\0'){
      if(!strcmp(g_dispproxy, "[URI]")){
--- 1763,1775 ----
    xmlprintf("<dd class="doc_navi">\n");
    xmlprintf("<span class="doc_link">");
    sprintf(numbuf, "%%%d@", detail ? 9999 : g_attrwidth);
!   if(g_doclinkdecode){
!     char *dturi = cburldecode(turi, NULL);
!     xmlprintf(numbuf, dturi);
!     free(dturi);
!   } else{
!     xmlprintf(numbuf, turi);
!   }
    xmlprintf("</span>\n");
    if(*g_dispproxy != '\0'){
      if(!strcmp(g_dispproxy, "[URI]")){

・パッチ適用

user@qos % cd  /usr/ports/textproc/hyperestraier/
user@qos % sudo make
user@qos % cd  work/hyperestraier-1.4.13
user@qos % wget 'https://qos.dev7.net/files/estseek.c.patch'
user@qos % sudo patch -p < estseek.c.patch
user@qos % cd ../..
user@qos % sudo make
user@qos % sudo make install

・estseek.conf

doclinkdecode: true
カテゴリー: ソフトウェア | タグ: , , | コメントする

rep2のtGrepが使えなくなってた

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

無いとかなり不便なので、find.2ch.netの結果を変換するスクリプトを書いてみました。
(かなり適当。。。)
#自宅のFreeBSDサーバ上で動作することは確認しましたが、
#他で動くかは未確認。(Windows, Linux, Mac OS Xでも動くとコメント有り。)


【2011/11/07 20:58 追記】
PHP Simple HTML DOM ParserのVersionによっては動作しないとコメント頂きました。
v1.5では白紙状態になるそうです。。v1.11だとOK。
自分で確認した時もv1.11で確認。
【2011/12/29 17:12 追記】 v1.5でも問題ないとか。他要因かな。


【2011/05/07 00:17 追記】
rep2 part51 でバグってると言われる。ゴメンナサイ・・m(_ _)m

799 :名無しさん@お腹いっぱい。:2011/05/05(木) 12:06:27.86 ID:jp3/MRoa0
>>746の方法でtgrepは使えるようになったんだけど、実際の結果が違う場合がある
例えば「muteki」で検索すると、find.2ch.netでは14件だがtgrepは1件のみ。
bbspinkを含む場合は上手く動かないのかな?それとも俺だけですか?

・・・

809 :名無しさん@お腹いっぱい。:2011/05/05(木) 15:50:46.97 ID:0VScl8/m0
まぁBUGつぅか考慮漏れってなら
find.2ch.netは100件表示指定しても最大50件に制限されるので...
diff tgrepc.php.old tgrepc.php
44c44
< $query_params['n'] = $limit = ($_conf['ktai'] || $_conf['iphone']) ? '25' : '100';
---
> $query_params['n'] = $limit = ($_conf['ktai'] || $_conf['iphone']) ? '25' : '50';

ここ50に変えないと検索漏れる位だな  

・・・

812 :799:2011/05/06(金) 03:06:01.51 ID:YDWYCun00
>>810
もっとエレガントな書き方はあるかもしれませんが、これでおkでした

diff findproxy.php.old findproxy.php
49c49
< if(ereg('^http://[A-Za-z]+\.2ch\.net/test/.*read\.cgi/.*', $element->href)){
---
> if(ereg('^http://[A-Za-z]+\.(2ch\.net|bbspink\.com)/test/.*read\.cgi/.*', $element->href)){

有難いことに修正イメージも書いてある。
ほぼそのままだけど、tGrep復活したらすぐ戻せるように、tgrepc.phpには極力手を入れたくないから、
↓で修正してみました。ついでにコメントで指摘受けたハイライトの件も。

% diff findproxy.php.old findproxy.php
14a15,17
>     $max_count = 50;
>     global $limit;
>     $limit = $query_array['n'] > $max_count ? $max_count : $query_array['n'];
18c21
<                            ,'COUNT' => $query_array['n']
---
>                            ,'COUNT' => $limit
21c24
<         $f2query_array['OFFSET'] = (intval($query_array['p']) - 1) * intval($query_array['n']);
---
>         $f2query_array['OFFSET'] = (intval($query_array['p']) - 1) * intval($limit);
49c52
<             if(ereg('^http://[A-Za-z]+\.2ch\.net/test/.*read\.cgi/.*', $element->href)){
---
>             if(ereg('^http://[A-Za-z]+\.(2ch\.net|bbspink\.com)/test/.*read\.cgi/.*', $element->href)){
62c65,66
<                 $result['profile']['regex'] = '/(.*)/i';
---
> //                $result['profile']['regex'] = '/(.*)/i';
>               $keyword = explode(" ", $query_array['q']);
>               $result['profile']['regex'] = '/(' . $keyword[0] .')/i';

findproxy.php.zip (以前の:findproxy.php.old.zip)


【必要なもの】
・rep2 expack
PHP Simple HTML DOM Parser

【↓こんな構成にしとく必要あり】
rep2/
  tgrepc.php
  findproxy.php (後述)
  simplehtmldom/simple_html_dom.php

・findproxy.php(findproxy.php.zip)

<?php
// {{{ findproxy()
function findproxy($query)
{
    require_once './simplehtmldom/simple_html_dom.php';
    global $_conf;
    // q -> STR
    // n -> COUNT
    // s -> ???
    // b -> ???
    // c -> ???
    // p -> OFFSET

    parse_str($query, $query_array);
    $max_count = 50;
    global $limit;
    $limit = $query_array['n'] > $max_count ? $max_count : $query_array['n'];
    $f2query_array = array(
                           'STR' => mb_convert_encoding($query_array['q'], "EUC-JP","UTF-8")
                           ,'TYPE' => 'TITLE'
                           ,'COUNT' => $limit
                           );
    if(isset($query_array['p'])){
        $f2query_array['OFFSET'] = (intval($query_array['p']) - 1) * intval($limit);
    }

//    print_r($f2query_array);
    ini_set('arg_separator.output', '&');
    $f2query = http_build_query($f2query_array);
    ini_set('arg_separator.output', '&amp;');

//    print($query . ' -- > ' . $f2query);

    $find2ch = 'http://find.2ch.net/index.php';

    $client = new HTTP_Client;
    $client->setDefaultHeader('User-Agent', 'p2-tgrep-client');
    //    print($find2ch . '?' . $f2query);
    $code = $client->get($find2ch . '?' . $f2query);
    if (PEAR::isError($code)) {
        p2die($code->getMessage());
    } elseif ($code != 200) {
        p2die("HTTP Error - {$code}");
    }

    $response = $client->currentResponse();
    $dom = str_get_html(urldecode($response['body']));

    $n1 = 0;
    foreach($dom->find('dt') as $dom2) {
        foreach($dom2->find('a') as $element) {
            if(ereg('^http://[A-Za-z]+\.(2ch\.net|bbspink\.com)/test/.*read\.cgi/.*', $element->href)){
                $name = mb_convert_encoding($element->find('text', 0)->plaintext,"UTF-8","EUC-JP");

                $urls = parse_url($element->href);
                $bbs = $tkey = '';
                if(ereg('^/test/read\.cgi/([0-9A-Za-z]+)/([0-9]+)/.*', $urls['path'], $hits)){
                    $bbs = $hits[1];
                    $tkey = $hits[2];
                }
                $result['threads'][$n1]->title = $name;
                $result['threads'][$n1]->host = $urls['host'];
                $result['threads'][$n1]->bbs = $bbs;
                $result['threads'][$n1]->tkey = $tkey;
//                $result['profile']['regex'] = '/(.*)/i';
//              $keyword = explode(" ", $f2query_array['STR']);
                $keyword = explode(" ", $query_array['q']);
                $result['profile']['regex'] = '/(' . $keyword[0] .')/i';

                if(ereg('\(([0-9]+)\)', $dom2->find('text', 1)->plaintext, $hits)){
                    $result['threads'][$n1]->resnum = $hits[1];
                }

                $name = mb_convert_encoding($dom2->find('text', 2)->plaintext,"UTF-8","EUC-JP");
                $result['threads'][$n1]->ita = $name;

                $n1++;
            }
        }
    }
    $result['modified'] = $response['body']['date'];

    foreach($dom->find('font') as $element) {
        $name = mb_convert_encoding($element->find('text', 0)->plaintext,"CP932","EUC-JP");
        if(ereg('([0-9]+)スレ.*', $name, $hits)){
            $result['profile']['hits'] = $hits[1];
            break;
        }
    }

    return $result;
}
// }}}
?>

↑のfindproxy.phpを呼ぶため、tgrepc.phpのtgrep_searchに少し手を入れる

function tgrep_search($query)
{
require_once './findproxy.php'; // 追加
return findproxy($query); // 追加
    global $_conf;
・・・
カテゴリー: ソフトウェア | タグ: , , , , , , , , , , | 15件のコメント

Kindle3でHTMLのaccesskeyが使えない

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

だから、Kindle3のブラウザでrep2使ってるとかなり不便。

rep2/js/ 辺りに、 ↓のコードを書いた kindle.js を置いて

document.onkeypress = function(e){
  if(window.event.shiftKey
     && (0x30 <= window.event.charCode && window.event.charCode <= 0x39)){

    var num = window.event.charCode;

    aTag=document.getElementsByTagName("a");
    for(i=0;i<aTag.length;i++){
      if(aTag[i].getAttribute("accesskey") == num - 0x30){
        location.href = aTag[i].getAttribute("href");
      }
    }
  }
}

rep2/lib/index_print_k.inc.php の</head>>の後辺りで、kindle.jsを読み込んでやる。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta name="ROBOTS" content="NOINDEX, NOFOLLOW">
{$_conf['extra_headers_ht']}
<title>{$ptitle}</title>
</head>
<script type="text/javascript" src="js/kindle.js"></script>

すると、shift+alt+上段のアルファベットキーで、ジャンプできるようになった。かなり快適。
(shiftキーは、「↑」と印字されてるキー)

shift+alt+q → 1
shift+alt+w → 2
shift+alt+e → 3
shift+alt+r → 4
shift+alt+t → 5
shift+alt+y → 6
shift+alt+u → 7
shift+alt+i → 8
shift+alt+o → 9
shift+alt+p → 0

ただ、アドレスバーにカーソルがある場合は、数字が入力されるだけでジャンプしないので、
↓キー等を押下してカーソル移動擦る必要があります。

現在は、index_print_k.inc.php 以外に、↓辺りにも埋め込んで使用中。

sb_header_k.inc.php
read_header_k.inc.php
sb_print_k.inc.php
menu.inc.php

カテゴリー: ソフトウェア, プログラム, モバイル | タグ: , , , , | コメントする

BooksLabo(スキャン代行サービス)を利用してみた

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

本棚に空きが無く、足の踏み場もなくなってきたため、BooksLabo(スキャン代行サービス)を利用してみました。とりあえず床に置いてあった本をダンボールに詰めるだけ詰めた結果の62冊(1冊平均400ページ)を依頼。

BooksLaboを選択したのは、ページ数の制限が無く安かったから。

  • 2/10に、スキャン代行サービス・書籍スキャンサービスのBooksLabo (ブックスラボ)から、申し込み。(この時は、OCR無しで1冊150円でした)
  • 2/11に、発送。
  • 2/15に、全く反応がなかったので不安になって確認メールを出す。
  • 2/19に、↑に対して返信が無く、より不安になったので、再度確認メールを出す。
    すると、受け取り完了している旨の返信が有り一安心。また、「3月第1週」に開封予定と記載有り。
  • 3/12に本の一覧(xls)と、請求が来る。
    Excel持ってないので、Excel Viewerをインストール。
    本の一覧を確認後、PayPalで支払い。 (62冊 × ¥150 = ¥9,300)
  • 3/15に、スキャン完了メールが来る。
    「おまかせファイルサーバ」へのログインIDとPASSが記載されているので、そこからダウンロード。「通常」と、「圧縮」の2通りのファイルがダウンロード可能。
    ファイルサイズは、通常だと62冊で、9.82GB。圧縮だと62冊で2.69GBでした。
    念のため両方共ダウンロード。
  • 3/16~3/18の夜中に地道にダウンロード。

時期が悪かったのか、かなり時間が掛かったけど、急いでたわけじゃなかったから、気にするほどではないかな。
仕上がりに関しては特に問題なし。傾きもほとんど無い。

とりあえず足の踏み場は確保できた。

カテゴリー: その他 | タグ: , , | 5件のコメント

USB-シリアルケーブル購入

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

IMG_1176IMG_1177

Amazonにて、¥2,412で。

ただ、繋ぎたいサーバのシリアルポートが、オスだったことに気付き変換アダプタを購入。
・・・間違えて。(「よく一緒に購入されている商品」に出てた奴を調べずに買ってしまった。。)

IMG_1187IMG_1188

サーバに接続しても送信時のLEDは光るのに受信時のLEDが光らずかなり悩んだけど。
単純に、ELECOM公式(AD-D9FF) を見るとクロスしていなかった。。orz
USB-シリアルケーブルは、ストレートなので(参考:RS-232c クロスケーブルとUSB変換 – 教えて!goo)結線がクロスしている必要がある。。

IMG_1210IMG_1211IMG_1217

を購入して、ようやくサーバのシリアルポート(オス)に接続できた。

カテゴリー: ハードウェア | タグ: , | コメントする

Core2Quad Q9550購入

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

じゃんぱらにて、¥16,800で。当然中古。
VMware ESXi用にしようかと。
新品だと2011/02/27現在 ¥24,029 なので約¥8,000安い。

IMG_1219IMG_1220IMG_1222IMG_1223IMG_1224IMG_1225IMG_1226IMG_1229

 

付属のCPUクーラー。取り付けが結構大変だった。
IMG_1227IMG_1228

取説に書いてあるのは、↓だけ。
IMG_1250
それぞれの4角を押せば、何かしら音(カチッとか)が出るのかと思いきや、2箇所しかカチッって言わなかった。仕方ないので、残り2箇所は、強く押しつつネジ的な物を回し、固定させた。引っ張っても取れなそうだったのでそれで良しとした。

今まで使ってた、E7400。さようなら。
IMG_1248

ESXiで見ると。
全画面キャプチャ 20110227 232411

これで十数台は起動できるかな。

カテゴリー: ハードウェア | タグ: , , | コメントする

Acrobat使って、A4のPDFをA5のPDFに2分割する

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

Kindle + papercrop でA4サイズのPDFを楽々読むを参考に、papercropで2分割しようとしたけど、paercropだとサイズがでかくなるし、画像をまとめたPDFになってしまう。(それ以外の方法は分からなかった)

分割したいPDFが画像をまとめたPDFであれば問題ないけど、普通のPDF(テキストを選択したりできるPDF)だったら普通のPDFのまま2分割したいので、Acrobatを使ってやってみた。

Acrobatは、去年無償アップグレードしたAcrobat X Proがあるので、それで。

IMG_0898IMG_0899

分割元のPDFは、Flatlineで公開されているOn Lisp。

まず、onlisp_j.pdfをAcrobatで開いて、余白をトリミング。

20110219_205411_120110219_205441_120110219_205453_120110219_205513_1

トリミングした結果

20110219_205609_1

次に印刷。ページ設定をA5横にする。

20110219_205641_1

ページの拡大/縮小は、「大きいページを分割」。
重なりを「4mm」に設定。2分割するとき、行の中間で分割されるような場合があると見辛いので、小さすぎない適当な大きさが良い。
設定した後「プレビュー:コンポジット」に、2分割された状態で表示されるかを確認しておく。

20110219_205650_1

で、印刷した結果は、

20110219_205738_1

見開きページにして見易くする。

20110219_205751_120110219_205840_120110219_205846_120110219_205849_1

ファイルサイズは、元PDF(onlisp_j.pdf)に比べて2分割後PDF(_onlisp_j.pdf)は、400KB程度増加。

20110219_210057_1-1

Kindle3に転送してみてみると、

screen_shot-39163

Screen Rotationは縦のままで、横表示になる。
Acrobatでページを180°回転させれば、左側が下になるけど、それだとページ送りが逆転してしまい違和感があった。

IMG_1205IMG_1206

ただ、、、下側が少し切れてしまっている。

screen_shot-39166screen_shot-39164

2分割後PDFの上下の余白を再度トリミングすると、

20110219 225957

切れずに表示された。

screen_shot-39170screen_shot-39169

検索は普通に動作する。

screen_shot-39171screen_shot-39172

カーソルの動きが少しヘンだけど、辞書も動作する。
screen_shot-39173

とまぁ、結構手間が掛かる。。

カテゴリー: ソフトウェア, モバイル | タグ: , , | コメントする

Logicool HD Pro Webcam C910購入

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

Amazonにて、¥6,980で。

去年の12末に注文したのを忘れてた。。Windows Web Server2008 R2で使えるのか不安だったけど何とかなった。

IMG_1156IMG_1158IMG_1160IMG_1161IMG_1162IMG_1163

付属のCD-ROMを入れてインストールしようとすると、20110122_115819_1
「このソフトウェアはご使用のオペレーティングシステムとは互換性がありません。Logicoolのウェブサイトに行き、互換性のあるバージョンをダウンロードして下さい。」
って言われる。仕方なく言われたとおりにLogicoolのサイトへ行き、Windows7のFull(120Mb)(lws210_full.exe)をダウンロードして、インストールしようとしても結局同じ事言われた。

このメッセージを表示してるのが、MSetup.exeのようなので、lws210_full.exeを展開して、MSetup.exeを互換モード(Windows XP)にすると先へ進める。Windows Vistaだとなぜか↑のメッセージが表示される。

20110122_115127_1

互換モードに設定した後、Setup.exeを実行しても、↓のシンプルな画面が表示される。。[次へ]が無い。。。orz

20110122_115133_1

なぜか言語を「中国語 (簡字体)」に変更すると、ちゃんと表示された。全画面キャプチャ 20110123 200831

ので、試しにlws210_full\UI\chs\CustomLayout.xmlimage

を、lws210_full\UI\jpn\ にコピー

image

その後、Setup.exeを実行してみると・・・

20110122_115837_1

表示された!!
後はすんなり。

20110122_115842_120110122_115855_120110122_115941_1

ドライバはlws210_full\Drivers 内のファイルでインストールできそうだったので、ここではインストールしなかった。

20110122_115945_120110122_120024_120110122_120031_1

ドライバを別途インストール。

image20110122_120115_120110122_120136_1

再起動。

20110122_120721_120110122_120729_1

インストール成功!!

でも使用用途無いな・・・。

カテゴリー: ソフトウェア, ハードウェア | タグ: , , , , | コメントする