TeXインストールエラー「JsclassesのGetInfoで例外が発生しました」対応2009年07月27日 22時33分29秒

10年以上前に作成したLaTeXのドキュメントを久々に確認しようとおもいましたが、最近購入したパソコンの環境の全てにおいてLaTeX環境はインストールしていませんでした。

そこで簡単にインストールする方法を検索したところ、阿部紀行氏の作成したTeXインストーラというものがあるということがわかりました。
全体のインストールはこちらが詳しいでしょう。

ところが、私の環境ではインストールの最初の段階でエラーが出ます。同じ症状の人も結構検索すると見つかります。

ということで以下に対応について整理してみます。

現象

インストールの初期段階で「JsclassesのGetInfoで例外が発生しました」というエラーダイヤログが表示されて先に進めません。
ログには「Jsclasses::GetInfo : getaddrinfo: no address associated with hostname.」または「Jsclasses::GetInfo : 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。 - connect(2)」と格納されていると思います。
現象としては作者の掲示板の「jsclassesについて」と同じです。

この掲示板ではインストーラとしてのエラーは解決していません。

対応方法

以下の概要で対応できます。インストーラの機能をあくまでも使うということが前提です。
  1. 奥村さんのページからjsclasses本体をダウンロード
  2. ダウンロードしたjsclasses.zipをkakuto3フォルダにコピーする
  3. kakuto3\pluginフォルダにあるjsclasses.rbファイルを修正する

jsclasses.rbの修正内容

奥村さんのページからダウンロードするURLが記述されている部分をローカル指定に変えてしまいます。

修正結果は以下のようになります。要は13行目のURLを「file://」の形式に変更して57行目から87行目をコメントにして「http:チェックをはずす」ということです。

require 'net/http'
require 'uri'
require 'time'

Net::HTTP.version_1_2

class JsclassesClass
	
	def initialize
		@ini = ""
		@log = ""
		
		@url = "file:///c:/kakuto3/jsclasses.zip"
		@size = 0
		@success = false
		@definstall = true
		return true
	end
	
	def Info
		return [{"softname" => "jsclasses", "info" => "奥村さんによる日本語用のクラスファイルです."}]
	end
	
	
	def Init(ini,log)
		@ini = ini
		@log = log
	end
	
	
	def IsNeedReboot()
		return false
	end
	
	
	def IsNeedSetting(soft)
		return false
	end
	
	
	def Set(hwnd,soft)
		return
	end
	
	
	def GetInfo(hwnd)
		Log("jsclassesの情報取得開始");
		if Kakuto3::GETINIINT(@ini,"Connect","UseNetwork") == 0 then
			begin
				@definstall = File.exist?(Kakuto3::GETINISTR(@ini,"Dir","Hozon") + "jsclasses.zip");
			rescue
				@definstall = false;
			end
			return true;
		end
		uri = URI.parse(@url);
#		if uri.scheme != "http" then
#			Log("httpでないとダメです.");
#			return false;
#		end
#		Kakuto3::ADDMESSAGE(hwnd,"\r\n\r\n♪jsclassesの情報取得開始♪\r\n");
#
#		response = nil;
#		Kakuto3::ADDMESSAGE(hwnd,uri.host + "に接続し情報を取得します.\r\n");
#		
#		proxy = Kakuto3::GETINISTR(@ini,"Connect","Proxy");
#		if proxy == "" then
#			proxydata = Kakuto3::GETIEPROXYINFO();
#			if proxydata == nil || proxydata["server"] == "" then
#				proxy = nil;
#				proxyport = nil;
#			else
#				proxy = proxydata["server"];
#				proxyport = proxydata["port"];
#			end
#		else
#			proxyport = Kakuto3::GETINIINT(@ini,"Connect","Port");
#		end;
#		Net::HTTP::Proxy(proxy,proxyport).start(uri.host){|http|
#			response = http.head(uri.path);
#		}
#		Log(uri.host + "に接続成功");
#		if response == nil then
#			Kakuto3::ADDMESSAGE(hwnd,"情報取得に失敗.\r\n")
#			Log("情報取得に失敗.")
#			return false
#		end
		
		begin
			localtime = File.atime(Kakuto3::GETINISTR(@ini,"Dir","Hozon") + "jsclasses.zip");
			@size = response['Content-Length'].to_i
			nettime = Time.parse(response['last-modified']) + 120
			@definstall = (localtime < nettime)
		rescue
			@definstall = true
		end
		
		Log("jsclassesの情報取得終了")
		Kakuto3::ADDMESSAGE(hwnd,"完了\r\n")
		@success = true
		return true
	end
	
	
	def GetDownloadData(soft)
		if Kakuto3::GETINIINT(@ini,"Connect","UseNetwork") == 0 then
			return {
				"success" => true,
				"downnum" => 0,
				"dls" => []};
		else
			return {
				"success" => @success,
				"downnum" => 1,
				"dls" => [{
					"url" => @url,
					"file" => "jsclasses.zip",
					"size" => @size}]};
		end
	end
	
	
	def IsDefaultInstall(soft)
		return @definstall
	end
	
	
	def Install(hwnd,soft)
	# 2007/08/03 W32TeXがptexディレクトリをなくす
#		dir = Kakuto3::GETINISTR(@ini,"Dir","Install") + "share\\texmf-local\\ptex\\platex\\jsclasses\\"
		dir = Kakuto3::GETINISTR(@ini,"Dir","Install") + "share\\texmf-local\\tex\\platex\\jsclasses\\"
		from = Kakuto3::GETINISTR(@ini,"Dir","Hozon") + "jsclasses.zip"
		Kakuto3::ADDMESSAGE(hwnd,"jsclassesのインストール……")
		if Kakuto3::ZIPDLG(hwnd,from,dir) then
			Kakuto3::ADDMESSAGE(hwnd,"成功\r\n")
			Log("jsclassesのインストールに成功")
			return true
		else
			Kakuto3::ADDMESSAGE(hwnd,"失敗\r\n")
			Log("jsclassesのインストールに失敗")
			return false
		end
	end
	
	
private
	def Log(l)
		begin
			fp = File.open(@log,"a+")
		rescue
			return
		end
		fp.write(l + "\n");
		fp.close()
	end
	
end

Jsclasses = JsclassesClass.new

考察

スクリプトを修正してから再度インストーラを実行するとインストーラはエラーを出さずに先に進めるはずです。
私の想像ですが、この現象は接続しているプロバイダなどの環境に依存しているのではないかと思います。

ということで私の接続環境を書いておきます。

  • Bフレッツマンションタイプ
  • VDSL接続
  • asahi-net
  • WebCaster V100
  • バッファローBBR-4HG
  • WindowsXP Professional SP3