同人誌にバーコードを付ける。
同人誌にISDNなるバーコードを付けてみた。
ISDN - 国際標準同人誌番号
http://isdn.jp/
ISBNをパロったインストアJANコード。
「司書にゃん」なる蔵書管理アプリが同人誌DBとして使ってたり。
んで、このコードを書籍バーコード風にして貼り付けたいと思った訳だが、
・左右センターバー含め全て均一サイズ
・バーコードの下にOCR Bフォントで数字を表記
という書式で吐き出してくれる無料なWebサービスは無いっぽかった。
じゃあ別のアプローチってんで、ベクターにあったフリーのJANバーコードフォントを入手。
バーコードフォント(サンプル版)
http://www.vector.co.jp/soft/data/writing/se293727.html
このフォント、単純に整数13桁入れてもまともなバーコードは生成されないので、
付属のDelphiコードをExcelVBAに部分移植した。
マクロで出力した文字列を、上記バーコードフォントで表示することで
ようやく正しいバーコードが生成されるようになった。
が、今欲してた必要最小限でしか組んでないのでコミケが無事終わって落ち着いてきたら、
チェックディジット算出と短絡8桁も含めたVBSに手直しする予定。
BarFont.bas
' ' BarFont(JAN)補助モジュール ' ' version 0.01 ' Dec 23, 2013 ' ' by REGEKATSU ' ' release ' ' version 0.01 ' JANコード13桁のみ対応しています。12桁での入力には対応していません ' (チェックディジットの計算機能はありません。)。 ' '入力ボックスに指定されたJANコード13桁に対するバーコード表示用文字列を、同じく入力ボックスに出力します。 '入力無しかキャンセルボタンをクリックすることで、処理が終了します。 Public Sub JanCodeToFontChar() Const DEFAULT_PROMPT As String = "JANコード13桁を入力してください。" Dim prompt As String prompt = DEFAULT_PROMPT Dim promptNoUseLongBar As String Dim inputNoUseLongBar As Boolean Dim inputCode As String inputCode = "" Do inputCode = InputBox(prompt, "バーコードフォント、表示用変換マクロ", inputCode) If inputCode Like "#############" Then prompt = DEFAULT_PROMPT & vbCrLf & vbCrLf & "前回JANコード13桁: " & inputCode & vbCrLf If MsgBox("バーコードの高さを均一に揃えますか?" & vbCrLf & vbCrLf & _ "はい(Y): 同サイズ, いいえ(N): ロング", vbYesNo Or vbQuestion, _ "指定") = vbYes Then inputNoUseLongBar = True promptNoUseLongBar = "同サイズ" Else inputNoUseLongBar = False promptNoUseLongBar = "ロング" End If prompt = prompt & "前回バーコードサイズ: " & promptNoUseLongBar & vbCrLf inputCode = ConvertFontChar(inputCode, inputNoUseLongBar) prompt = prompt & "前回表示用文字列: " & inputCode MsgBox "変換が完了しました。", vbInformation, "完了" ElseIf inputCode <> "" Then MsgBox "入力に誤りがあります。", vbCritical, "エラー" End If Loop While inputCode <> "" End Sub 'BarFont(JAN)を利用した、バーコード描画関数です。 '指定したJANコード13桁及びロングバーの有無に対する、バーコード表示用文字列を返します。 ' 'JANコード13桁のみ対応しています。12桁での入力には対応していません '(チェックディジットの計算機能はありません。)。 ' 'パラメータ janCode: バーコードの文字列 ' noUseLongBar: ロングバーを使わない場合True '戻り値 バーコードで表現される文字列 ' Public Function ConvertFontChar(janCode As String, noUseLongBar As Boolean) As String '変換文字列用変数。 Dim janConv As String janConv = "" 'パリティビット算出用テーブル。 Dim combiTable(2 To 7) As Byte combiTable(2) = 32 combiTable(3) = 16 combiTable(4) = 8 combiTable(5) = 4 combiTable(6) = 2 combiTable(7) = 1 Dim prifixTable(9) As Byte prifixTable(0) = 0 '000000b prifixTable(1) = 11 '001011b prifixTable(2) = 13 '001101b prifixTable(3) = 14 '001110b prifixTable(4) = 19 '010011b prifixTable(5) = 25 '011001b prifixTable(6) = 28 '011100b prifixTable(7) = 21 '010101b prifixTable(8) = 22 '010110b prifixTable(9) = 26 '011010b '左ガイドバーをセットする。 janConv = janConv & Chr$(&H29 - noUseLongBar - 1) '左側7桁に対する、パリティビットに基づいたキャラクタをセットしていく。 Dim parityCheck As Integer Dim i, x As Integer '左1文字目を取得して、使用するパリティテーブルを決定する。 x = Asc(Mid(janCode, 1, 1)) And &HF '使用するパリティテーブルに基づいて2〜7文字目の、奇数または偶数パリティのキャラクタをセットしていく。 For i = 2 To 7 parityCheck = 0 If (combiTable(i) And prifixTable(x)) = 0 Then parityCheck = 1 janConv = janConv + Chr$(Asc(Mid(janCode, i, 1)) + &H10 + (&H10 * parityCheck)) Next 'センターバーをセットする。 janConv = janConv & Chr$(&H2B - noUseLongBar - 1) '右側6桁に対するキャラクタをセットする。 janConv = janConv & Mid(janCode, 8, 6) '右ガイドバーをセットする。 janConv = janConv & Chr$(&H29 - noUseLongBar - 1) '変換文字列を返す。 ConvertFontChar = janConv End Function
コミックマーケット85
今年末、東京ビッグサイトにて行われるコミックマーケット85にサークル参加する事となりました。
頒布物は新刊と、夏に出した既刊になります。
今回も新刊で取り上げた製作例を展示してお待ちしておりますので、宜しければ是非お立ち寄りください。
レトロゲーム活用研究同好会
日時: 2013/12/31(火)
場所: 東京ビッグサイト
スペース: 西地区“す”ブロック−27b
新刊:
誌名: レトロゲーム活用研究同好会会報 PART02 -GBAスロットはPIOの夢を見るか?-
表紙:
サイズ: B5
価格: 200円
内容:
ニンテンドーDS〜DS LiteにあるGBAスロットの制御方法について解説した本です。
既刊:
誌名: レトロゲーム活用研究同好会会報 PART01 -DSに自作ハードを繋ぐ試み-
表紙:
サイズ: B5 40p
価格: 300円
内容:
ニンテンドーDSに繋いだ自作ハードをプログラムから制御する方法について解説した本です。
原稿が進まない。
いくら頭で練ってても結果が得られてない状態だと文章にまとまらない。
理論とか回路図とかプログラムは大体整えたんだけど試作回路のハンダ付けに時間食ってる。
DS の GBA Slot は一般的なマイコンと違ってラッチ機構持たないから固定的な出力はそもそも出来なくて
74HC573とか74HC574等のラッチ回路咬ます必要があるのと、ポートがビット単位で指定出来ないってのは理解した。
AD0 〜 AD15 の unsigned short (u16) か A16 〜 A23 の unsigned char (u8) かでそれぞれ入出力選べるハズなので
全て実証すれば PIO 実験のレポとして体裁は保てる感じ。
この調子では今回もギリギリ展開な予感な悪寒。
コミックマーケット85 受かりました。
ちゅーことで本文書いたりテストプログラム作ったりしてます。
コミケウェブカタログって当落確定すると、全サークルの当・落・抽選漏れが全て調べられちゃうんですね。
冊子及びROM版出るまでの間サークル参加情報を隠蔽出来なくなってしまった訳ですか、そうですか。
ISBN-13←→ISBN-10 変換プログラム。
サンプルその2。前回プログラムの応用編的な感じで。
ISBN1310.COB (ISBN-13→ISBN-10 変換)
IDENTIFICATION DIVISION. PROGRAM-ID. ISBN1310-VER001. AUTHOR. DUMBO. DATE-WRITTEN. 11.11.2013. DATA DIVISION. WORKING-STORAGE SECTION. 01 ISBN-IN PIC X(13). 01 ISBN-TMP PIC X(9). 01 ISBN-CNT PIC 99 VALUE 9. 01 MOD-11 PIC 9(3) VALUE 11. 01 WAIT-10-2 PIC 9(3) VALUE 10. 01 TEMP PIC 9(3) VALUE ZEROS. 01 TOTAL PIC 9(3) VALUE ZEROS. 01 Q PIC 9(3). 01 R PIC 9(3). 01 CDTEMP PIC 9. 01 CDIGIT PIC X. 01 CNT PIC 99. 01 FLG PIC 9 VALUE ZERO. PROCEDURE DIVISION. MAIN. DISPLAY "ISBN-13→ISBN-10 変換プログラム ver0.01" UPON CONSOLE. PERFORM UNTIL FLG >= 1 DISPLAY "ISBN-13(13桁) を入力してください。" UPON CONSOLE ACCEPT ISBN-IN FROM CONSOLE DISPLAY "入力した ISBN-13 = " ISBN-IN UPON CONSOLE IF ISBN-IN IS NUMERIC THEN * DISPLAY "入力は正しいです。" UPON CONSOLE MOVE ISBN-IN(4:9) TO ISBN-TMP MOVE 1 TO FLG ELSE DISPLAY "入力に誤りがあります。" UPON CONSOLE END-IF END-PERFORM. *ISBN-TMPを左桁の数字から順に×10、×9…×2と乗算して、 *その結果を合計する。 PERFORM VARYING CNT FROM 1 BY 1 UNTIL CNT > ISBN-CNT COMPUTE TEMP = FUNCTION NUMVAL(ISBN-TMP(CNT:1)) COMPUTE TOTAL = (WAIT-10-2 - CNT + 1) * TEMP + TOTAL END-PERFORM. *合計÷モジュラス11=余り *→モジュラス11−余り=チェックデジット を算出する。 *結果が10ならX、11なら0、それ以外なら余り値がチェックディジット。 DIVIDE MOD-11 INTO TOTAL GIVING Q REMAINDER R. COMPUTE TEMP = MOD-11 - R. MOVE TEMP TO CDTEMP. EVALUATE TEMP WHEN 10 MOVE "X" TO CDIGIT WHEN 11 MOVE 0 TO CDIGIT WHEN OTHER MOVE CDTEMP TO CDIGIT END-EVALUATE. DISPLAY "ISBN-10 は " ISBN-TMP CDIGIT " です。" UPON CONSOLE. STOP RUN.
ISBN1013.COB (ISBN-10→ISBN-13 変換)
IDENTIFICATION DIVISION. PROGRAM-ID. ISBN1013-VER001. AUTHOR. DUMBO. DATE-WRITTEN. 11.11.2013. DATA DIVISION. WORKING-STORAGE SECTION. 01 ISBN-IN PIC X(10). 01 ISBN-TMP PIC X(12). 01 ISBN-HD PIC X(3) VALUE "978". 01 ISBN-CNT PIC 99 VALUE 12. 01 MOD-10 PIC 9(3) VALUE 10. 01 WAIT-3-1 PIC 9(3) VALUE 3. 01 ODD PIC 9(3) VALUE ZEROS. 01 EVEN PIC 9(3) VALUE ZEROS. 01 TOTAL PIC 9(3) VALUE ZEROS. 01 Q PIC 9(3). 01 R PIC 9(3). 01 CDIGIT PIC 9. 01 CNT PIC 99. 01 FLG PIC 9 VALUE ZERO. PROCEDURE DIVISION. MAIN. DISPLAY "ISBN-10→ISBN-13 変換プログラム ver0.01" UPON CONSOLE. PERFORM UNTIL FLG >= 1 DISPLAY "ISBN-10(10桁) を入力してください。" UPON CONSOLE ACCEPT ISBN-IN FROM CONSOLE DISPLAY "入力した ISBN-10 = " ISBN-IN UPON CONSOLE IF ISBN-IN IS NUMERIC OR (ISBN-IN(1:9) IS NUMERIC AND ISBN-IN(10:1) = "X") THEN * DISPLAY "入力は正しいです。" UPON CONSOLE STRING ISBN-HD DELIMITED BY SIZE ISBN-IN(1:9) DELIMITED BY SIZE INTO ISBN-TMP END-STRING MOVE 1 TO FLG ELSE DISPLAY "入力に誤りがあります。" UPON CONSOLE END-IF END-PERFORM. *ISBN-TMPを左から奇数桁の数字を合計する。 PERFORM VARYING CNT FROM 1 BY 2 UNTIL CNT > ISBN-CNT ADD FUNCTION NUMVAL(ISBN-TMP(CNT:1)) TO ODD END-PERFORM. *ISBN-TMPを左から偶数桁の数字を合計×3する。 PERFORM VARYING CNT FROM 2 BY 2 UNTIL CNT > ISBN-CNT ADD FUNCTION NUMVAL(ISBN-TMP(CNT:1)) TO EVEN END-PERFORM. COMPUTE EVEN = EVEN * WAIT-3-1. *合計÷モジュラス10=余り *→モジュラス10−余り=チェックデジット を算出する。 *結果が10なら0、それ以外なら余り値がチェックディジット。 COMPUTE TOTAL = ODD + EVEN. DIVIDE MOD-10 INTO TOTAL GIVING Q REMAINDER R. COMPUTE CDIGIT = MOD-10 - R. DISPLAY "ISBN-13 は " ISBN-TMP CDIGIT " です。" UPON CONSOLE. STOP RUN.
ISBN チェックディジット算出サンプル。
プログラミング教える用で書いてみたやつなのでそのまま業務で使うにはベタ過ぎるかもです。
つか、COBOL 知らない俺が COBOL 説いてるってのがまず訳解らんのですがねぇ…。
ISBN13.COB
IDENTIFICATION DIVISION. PROGRAM-ID. ISBN13-VER001. AUTHOR. DUMBO. DATE-WRITTEN. 11.09.2013. DATA DIVISION. WORKING-STORAGE SECTION. 01 ISBN-IN PIC X(12). 01 ISBN-CNT PIC 99 VALUE 12. 01 MOD-10 PIC 9(3) VALUE 10. 01 WAIT-3-1 PIC 9(3) VALUE 3. 01 ODD PIC 9(3) VALUE ZEROS. 01 EVEN PIC 9(3) VALUE ZEROS. 01 TOTAL PIC 9(3) VALUE ZEROS. 01 Q PIC 9(3). 01 R PIC 9(3). 01 CDIGIT PIC 9. 01 CNT PIC 99. 01 FLG PIC 9 VALUE ZERO. PROCEDURE DIVISION. MAIN. DISPLAY "ISBN13 チェックディジット算出プログラム ver0.01" UPON CONSOLE. PERFORM UNTIL FLG >= 1 DISPLAY "チェックディジットを調べる ISBN(12桁) を" - "入力してください。" UPON CONSOLE ACCEPT ISBN-IN FROM CONSOLE DISPLAY "入力した ISBN(12桁) = " ISBN-IN UPON CONSOLE IF ISBN-IN IS NUMERIC THEN * DISPLAY "入力は正しいです。" UPON CONSOLE MOVE 1 TO FLG ELSE DISPLAY "入力に誤りがあります。" UPON CONSOLE END-IF END-PERFORM. *ISBN-INを左から奇数桁の数字を合計する。 PERFORM VARYING CNT FROM 1 BY 2 UNTIL CNT > ISBN-CNT ADD FUNCTION NUMVAL(ISBN-IN(CNT:1)) TO ODD END-PERFORM. *ISBN-INを左から偶数桁の数字を合計×ウェイト3する。 PERFORM VARYING CNT FROM 2 BY 2 UNTIL CNT > ISBN-CNT ADD FUNCTION NUMVAL(ISBN-IN(CNT:1)) TO EVEN END-PERFORM. COMPUTE EVEN = EVEN * WAIT-3-1. *合計÷モジュラス10=余り *→モジュラス10−余り=チェックデジット を算出する。 *結果が10なら0、それ以外なら余り値がチェックディジット。 COMPUTE TOTAL = ODD + EVEN. DIVIDE MOD-10 INTO TOTAL GIVING Q REMAINDER R. COMPUTE CDIGIT = MOD-10 - R. DISPLAY "チェックディジットは " CDIGIT " です。" UPON CONSOLE. STOP RUN.
ISBN10.COB
IDENTIFICATION DIVISION. PROGRAM-ID. ISBN10-VER001. AUTHOR. DUMBO. DATE-WRITTEN. 11.09.2013. DATA DIVISION. WORKING-STORAGE SECTION. 01 ISBN-IN PIC X(9). 01 ISBN-CNT PIC 99 VALUE 9. 01 MOD-11 PIC 9(3) VALUE 11. 01 WAIT-10-2 PIC 9(3) VALUE 10. 01 TEMP PIC 9(3) VALUE ZEROS. 01 TOTAL PIC 9(3) VALUE ZEROS. 01 Q PIC 9(3). 01 R PIC 9(3). 01 CDTEMP PIC 9. 01 CDIGIT PIC X. 01 CNT PIC 99. 01 FLG PIC 9 VALUE ZERO. PROCEDURE DIVISION. MAIN. DISPLAY "ISBN10 チェックディジット算出プログラム ver0.01" UPON CONSOLE. PERFORM UNTIL FLG >= 1 DISPLAY "チェックディジットを調べる ISBN(9桁) を" - "入力してください。" UPON CONSOLE ACCEPT ISBN-IN FROM CONSOLE DISPLAY "入力した ISBN(9桁) = " ISBN-IN UPON CONSOLE IF ISBN-IN IS NUMERIC THEN * DISPLAY "入力は正しいです。" UPON CONSOLE MOVE 1 TO FLG ELSE DISPLAY "入力に誤りがあります。" UPON CONSOLE END-IF END-PERFORM. *ISBN-INを左桁の数字から順に×10、×9…×2と乗算して、 *その結果を合計する。 PERFORM VARYING CNT FROM 1 BY 1 UNTIL CNT > ISBN-CNT COMPUTE TEMP = FUNCTION NUMVAL(ISBN-IN(CNT:1)) COMPUTE TOTAL = (WAIT-10-2 - CNT + 1) * TEMP + TOTAL END-PERFORM. *合計÷モジュラス11=余り *→モジュラス11−余り=チェックデジット を算出する。 *結果が10ならX、11なら0、それ以外なら余り値がチェックディジット。 DIVIDE MOD-11 INTO TOTAL GIVING Q REMAINDER R. COMPUTE TEMP = MOD-11 - R. MOVE TEMP TO CDTEMP. EVALUATE TEMP WHEN 10 MOVE "X" TO CDIGIT WHEN 11 MOVE 0 TO CDIGIT WHEN OTHER MOVE CDTEMP TO CDIGIT END-EVALUATE. DISPLAY "チェックディジットは " CDIGIT " です。" UPON CONSOLE. STOP RUN.
COBOL でゲームプログラミングとか。
出向先で OpenCOBOL 入れてくれって頼まれついでに簡単なプログラム書いてみた。
変数の考え方にクセがあるとか1つの処理に機能盛り過ぎとか、
エクセルIF関数の如く入れ子しないと else if 相当のことが出来ないとか。
色々言いたいところもあるけれど、割と嫌いじゃない言語です。
KAZUATE.COB
IDENTIFICATION DIVISION. PROGRAM-ID. KAZUATE-VER001. AUTHOR. DUMBO. DATE-WRITTEN. 11.07.2013. DATA DIVISION. WORKING-STORAGE SECTION. 01 ANS PIC 99 VALUE ZEROS. 01 USR PIC 99 VALUE ZEROS. 01 FLG PIC 9 VALUE ZERO. PROCEDURE DIVISION. MAIN. ACCEPT ANS FROM TIME. DISPLAY "KAZUATE GAME" UPON CONSOLE. PERFORM UNTIL FLG >= 1 DISPLAY "GUESS(0-99)?" UPON CONSOLE ACCEPT USR FROM CONSOLE IF USR = ANS THEN DISPLAY "IT'S CORRECT!!" UPON CONSOLE MOVE 1 TO FLG ELSE IF USR = ANS - 1 OR USR = ANS + 1 THEN DISPLAY "IT'S NEAR!" UPON CONSOLE ELSE IF USR > ANS THEN DISPLAY "IT'S SMALLER." UPON CONSOLE ELSE IF USR < ANS THEN DISPLAY "IT'S LARGER." UPON CONSOLE END-IF END-IF END-IF END-IF END-PERFORM. STOP RUN.
JANKEN.COB
IDENTIFICATION DIVISION. PROGRAM-ID. JANKEN-VER100. AUTHOR. DUMBO. DATE-WRITTEN. 11.07.2013. DATA DIVISION. WORKING-STORAGE SECTION. 01 DSP. 03 HND PIC N(3) OCCURS 3. 01 USR PIC 99 VALUE ZEROS. 01 USR2 PIC 99 VALUE ZEROS. 01 COM PIC 99 VALUE ZEROS. 01 TMP PIC 99 VALUE ZEROS. *ユーザーの勝ち数をカウントする変数を初期化する。 01 WIN PIC 9 VALUE ZERO. * PROCEDURE DIVISION. MAIN. *手を表す変数を初期化する。 MOVE "グー " TO HND(1) MOVE "チョキ" TO HND(2) MOVE "パー " TO HND(3) *起動メッセージを表示する。 DISPLAY "じゃんけんゲーム Ver.1.00 by DumBo" UPON CONSOLE. *5回勝負する。 PERFORM 5 TIMES *ユーザーの手を入力する。 DISPLAY "0:グー、1:チョキ、2:パー" UPON CONSOLE ACCEPT USR FROM CONSOLE *コンピュータの手を現在時間うち1/10秒2桁を種として決める。 ACCEPT COM FROM TIME DIVIDE 3 INTO COM GIVING TMP REMAINDER COM *出した手を表す文字列を作成する。 DISPLAY "ユーザー:" HND(USR + 1) "、コンピュータ:" HND(COM + 1) *勝敗を判定し、結果を表示する。 IF USR = COM THEN DISPLAY "・・・あいこです!" ELSE COMPUTE USR2 = USR + 1 DIVIDE 3 INTO USR2 GIVING TMP REMAINDER USR2 IF COM = USR2 THEN DISPLAY "・・・ユーザーの勝ちです!" UPON CONSOLE ADD 1 TO WIN ELSE DISPLAY "・・・コンピュータの勝ちです!" UPON CONSOLE END-IF END-IF END-PERFORM. *ユーザーの勝ち数を表示する。 DISPLAY "ユーザーの勝ち数:" WIN UPON CONSOLE. STOP RUN.