id:seishubuでお知らせしている「秋も一箱古本市」順調に準備が進んでいます。
これから不忍ブックストリートのあちこちのお店で目にすることになると思いますが、はてなのフォトライフにタグ「秋も一箱古本市2006」でチラシ画像を掲載しました。
遠方の方は、地図も載っているので当日の計画に役立ててください。
id:musessouさん、宣伝にもどんどんご利用ください。
不忍ブックストリート公式サイトでも随時更新されるようになっています。
id:seishubuでお知らせしている「秋も一箱古本市」順調に準備が進んでいます。
これから不忍ブックストリートのあちこちのお店で目にすることになると思いますが、はてなのフォトライフにタグ「秋も一箱古本市2006」でチラシ画像を掲載しました。
遠方の方は、地図も載っているので当日の計画に役立ててください。
id:musessouさん、宣伝にもどんどんご利用ください。
不忍ブックストリート公式サイトでも随時更新されるようになっています。
去年作ったモノですが、気がつくと結構あちこちで使っていた。
手元ではLinux版のOracle9iで動作しています。
/* Oracle用 ISBNパッケージ
10桁と13桁のISBNを相互に変換する。チェックデジットの計算もできる。
http://www.isbn-center.jp/
$Id: pkg_isbn.sql,v 1.5 2005/11/07 02:12:27 ymo Exp $
*/
CREATE OR REPLACE PACKAGE ISBN_PKG AS
/*
|| 入力されたISBNをチェックデジットを付けたりいろいろする。
|| 10桁を13桁に直したり、13桁を10桁に直すこともできる。
*/
FUNCTION ISBN10(i_isbn IN varchar2) RETURN varchar2;
FUNCTION ISBN13(i_isbn IN varchar2) RETURN varchar2;
/*
|| 入力されたISBNをチェックデジットを抜いた大事なところだけにする。
*/
FUNCTION REGULATE_ISBN(i_isbn IN varchar2) RETURN varchar;
/*
|| 10桁版チェックデジットを計算して返す
|| 入力は9文字、10文字、13文字のどれか
*/
FUNCTION CHECK_DEGIT10( i_isbn IN varchar2) RETURN char;
/*
|| 13桁版ISBNのチェックデジットを計算して返す。
|| 入力は9文字、10文字、13文字のどれか
*/
FUNCTION CHECK_DEGIT13( i_isbn IN varchar2) RETURN char;
END ISBN_PKG;
/
----------------------------------------------------------
-- PACKAGE BODY
----------------------------------------------------------
CREATE OR REPLACE PACKAGE BODY ISBN_PKG AS
----------------------------------------------------------
-- F ISBN10
----------------------------------------------------------
FUNCTION ISBN10(i_isbn IN varchar2) RETURN varchar2
IS
sRaw varchar2(9);
BEGIN
sRaw := REGULATE_ISBN(i_isbn);
RETURN sRaw || CHECK_DEGIT10(sRaw);
END;
----------------------------------------------------------
-- F ISBN13
----------------------------------------------------------
FUNCTION ISBN13(i_isbn IN varchar2) RETURN varchar2
IS
sRaw varchar2(9);
BEGIN
sRaw := REGULATE_ISBN(i_isbn);
RETURN '978' || sRaw || CHECK_DEGIT13(sRaw);
END;
----------------------------------------------------------
-- F REGULATE_ISBN
----------------------------------------------------------
FUNCTION REGULATE_ISBN(i_isbn IN varchar2) RETURN varchar
IS
buf varchar2(20);
sRaw varchar2(9);
BEGIN
buf := SUBSTRB(REPLACE(REPLACE(UPPER(TRIM(i_isbn)),'ISBN'),'-'),1,20);
sRaw := TRIM(SUBSTRB(buf,1,9));
IF LENGTH(buf) = 9 THEN
sRaw := SUBSTRB(buf, 1, 9);
END IF;
IF LENGTH(buf) = 10 THEN
sRaw := SUBSTRB(buf, 1, 9);
END IF;
IF LENGTH(buf) = 13 THEN
sRaw := SUBSTRB(buf, 4, 9);
END IF;
RETURN sRaw;
END;
----------------------------------------------------------
-- F CHECK_DEGIT10
----------------------------------------------------------
FUNCTION CHECK_DEGIT10(i_isbn IN varchar2) RETURN char
IS
vWeight PLS_INTEGER;
vSum PLS_INTEGER;
vResult PLS_INTEGER;
sRaw varchar2(9);
BEGIN
sRaw := REGULATE_ISBN(i_isbn);
vWeight := 10;
vSum := 0;
FOR i IN 1..LENGTH(sRaw)
LOOP
vSum := vSum + vWeight * to_number(SUBSTR(sRaw, i, 1));
vWeight := vWeight - 1;
END LOOP;
vResult := 11 - (vSum MOD 11);
if vResult = 10 THEN
RETURN 'X';
END IF;
if vResult = 11 THEN
RETURN '0';
END IF;
RETURN SUBSTR(to_char(vResult),1,1);
EXCEPTION
WHEN OTHERS THEN
RETURN 'E';
END;
----------------------------------------------------------
-- F CHECK_DEGIT13
----------------------------------------------------------
FUNCTION CHECK_DEGIT13(i_isbn IN varchar2) RETURN char
IS
vSum1 PLS_INTEGER;
vSum2 PLS_INTEGER;
vResult PLS_INTEGER;
r char;
sRaw varchar2(12);
BEGIN
sRaw := '978' || REGULATE_ISBN(i_isbn);
vSum1 := 0;
vSum2 := 0;
FOR i IN 1..LENGTH(sRaw)
LOOP
IF MOD(i,2) = 1 THEN
vSum1 := vSum1 + to_number(SUBSTR(sRaw, i, 1));
ELSE
vSum2 := vSum2 + to_number(SUBSTR(sRaw, i, 1));
END IF;
END LOOP;
vResult := vSum1 + (vSum2 * 3);
vResult := 10 - to_number(SUBSTR(to_char(vResult),length(to_char(vResult)),1));
IF vResult > 9 THEN
RETURN '0';
ELSE
RETURN SUBSTR(to_char(vResult),1,1);
END IF;
EXCEPTION
WHEN OTHERS THEN
RETURN 'E';
END;
END ISBN_PKG;
/
/**
SELECT 'Answer => 4798108545: '||ISBN_PKG.ISBN10('479810854') FROM DUAL;
SELECT 'Answer => 9784798108544: '||ISBN_PKG.ISBN13('4798108545') FROM DUAL;
SELECT 'Answer => 4949999087: '|| ISBN_PKG.ISBN10('494999908') FROM DUAL;
SELECT 'Answer => 9784949999083: ' || ISBN_PKG.ISBN13('494999908') FROM DUAL;
SELECT ISBN_PKG.CHECK_DEGIT10('4798108545') FROM DUAL;
SELECT ISBN_PKG.CHECK_DEGIT10('494999908') FROM DUAL;
SELECT ISBN_PKG.CHECK_DEGIT10('ISBN4-9499-9908') FROM DUAL;
SELECT ISBN_PKG.CHECK_DEGIT10('9784883810246') FROM DUAL;
SELECT ISBN_PKG.CHECK_DEGIT10('9784883810161') FROM DUAL;
SELECT ISBN_PKG.CHECK_DEGIT10('9784431711438') FROM DUAL;
SELECT ISBN_PKG.CHECK_DEGIT13('4798108545') FROM DUAL;
SELECT ISBN_PKG.CHECK_DEGIT13('494999908') FROM DUAL;
SELECT ISBN_PKG.CHECK_DEGIT13('ISBN4-9499-9908') FROM DUAL;
*/
店主申し込みは、9月21日(木)締め切りです。
定員オーバーの場合は先着順なのでお急ぎを。
Guidelines For Shipping Container Labeling http://www.bisg.org/docs/shipping_label_guidelines_09-2005.pdf
こんなのをやるにあたって、ちゃんとしたモジュラス10ウエイト3のチェックデジットを計算する必要があったので作った。
ついでに、isbnlib.pyよりもシンプルに10桁ISBNを13桁にする関数も。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""モジュラス10ウエイト3とISBNのチェックデジット計算。Python版。
"""
def m10w31(code):
"""モジュラス10ウエイト3チェックデジットの計算
"""
s = list(str(code))
s.reverse()
sum = 0
w = 3
for i in s:
sum = sum + (int(i) * w)
if w == 3: w = 1
else: w = 3
d = sum % 10
if d<>0: d = 10 - d
return str(d)
def isbn10to13(isbn10):
"""10桁ISBNを13桁ISBNに変換
"""
s = '978'+isbn10[:9]
return s+m10w31(s)
def ssccBarCode(isbn13):
""" SSCC bar code
See, http://www.bisg.org/docs/shipping_label_guidelines_09-2005.pdf
"""
PRFX1='01'
PRFX2='1'
code = isbn13[:12]
return "(%s)%s %s-%s" % (PRFX1, PRFX2, code, m10w31(PRFX2+code))
if __name__=='__main__':
data = ('4770025364','4770023230','4770015419','4881359290','4883731626','4873112109')
for isbn10 in data:
isbn13 = isbn10to13(isbn10)
print " %s -> %s -> %s" % (isbn10,isbn13,ssccBarCode(isbn13))
function m10w31(code: string): integer;
/**
Delphi版 モジュラス10ウエィト3のチェックデジット計算。
*/
var
i,w,sum: integer;
begin
w := 3;
sum := 0;
for i := length(code) downto 1 do
begin
sum := sum + strtoint(code[i]) * w;
if w = 3 then w := 1
else w := 3;
end;
Result := sum mod 10;
if Result<>0 then Result := 10 - Result;
end;
タムタム工房さんが、フォトアルバムの写真をスポット別に整理してくださいました。
不忍ブックストリートの一箱古本市2006 フォトアルバムから
タムタム工房さん、ありがとうございました。
フフ、秋もあるよ。
総務省が四日、発表した住民基本台帳に基づく今年三月三十一日現在の人口動態によると、全国の人口は前年比三千五百五人減の一億二千七百五万五千二十五人で、一九六八年の調査以来、初めて減少に転じた。
ちょっと感慨深いニュース。
僕の親は人口を増やした最後の世代になるのかも。
あ、1968年以前増えてたってことは言ってないか。戦後は死人より生まれるほうが増えていたと思うけど。
まあ、確かなことは、ボク達は意思で人口を減らし始めた最初の世代ってことだ。