JANコードからバーコードフォント用文字列を生成する

同人誌にバーコードを付ける。2の続き。

同人誌にバーコードを付ける。2 - DumBo さんの Homebrew 観察日記

前回から3年ぐらい経ってしまっているが
気にしないで公開。

ソースをVBS対応に修正。
久しぶりに読むチェックディジット算出処理は
正直見辛いと感じたが…手直しするの面倒なんでこのまま。

ExcelVBAなんかの標準モジュールに貼り付ければ
Officeでも使えますよーと。

バーコードフォント(サンプル版)
http://www.vector.co.jp/soft/data/writing/se293727.html
※記載のVBSを活用するのに必要

BarFontVer1.00.vbs

Option Explicit
'
'   BarFont(JAN)補助モジュール
'
'   version 1.00
'   2017/04/12
'
'   by REGEKATSU
'
'   release
'
'   version 1.00
'   同一コードによるVBA/VBScriptでの実行に対応
'
'   version 0.02
'   JANコード標準なら12~13桁、短絡なら7~8桁での入力に対応しています
'   (チェックディジットの計算機能が備わっています。)。
'
'   version 0.01
'   JANコード13桁のみ対応しています。12桁での入力には対応していません
'   (チェックディジットの計算機能はありません。)。
'

'VBAでは下記1行をコメントアウトすること
Call JanCodeToFontChar


'サブルーチン

'入力ボックスに指定されたJANコード標準13桁又は短絡8桁に対するバーコード表示用文字列を、
'同じく入力ボックスに出力します。
'入力無しかキャンセルボタンをクリックすることで、処理が終了します。
Sub JanCodeToFontChar()
    
    Dim RE
    Set RE = CreateObject("VBScript.RegExp")
    RE.Pattern = "^([0-9]{12,13}|[0-9]{7,8})$"
    
    Const DEFAULT_PROMPT = "JANコード標準13桁又は短絡8桁を入力してください。"
    Dim prompt
    prompt = DEFAULT_PROMPT
    Dim promptNoUseLongBar
    Dim inputNoUseLongBar
    Dim inputCode
    inputCode = ""
    
    Do
        inputCode = InputBox(prompt, "バーコードフォント、表示用変換マクロ", inputCode)
        If RE.Test(inputCode) Then
            prompt = DEFAULT_PROMPT & vbCrLf & vbCrLf & "前回入力JANコード: " & 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 <> ""
    
    Set RE = Nothing
End Sub

'指定したJANコード標準13桁又は短絡8桁に対する、チェックディジットを返します。
'
'パラメータ janCode:        バーコードの文字列。
'                           標準なら12~13桁、短絡なら7~8桁で指定
'戻り値     チェックディジット1桁の文字列。
'           指定に誤りがあれば空白スペースを返す
'
Function CalcCheckDigit(janCode)
    Dim i, j
    Dim checkOdd
    Select Case Len(janCode)
        '短絡8桁の場合。
        Case 7, 8
            For i = 1 To 7
                '奇数桁が何文字目か調べる
                '(チェックデジットを除いた1番右側より奇数桁、右から2番目を偶数桁…と数える。)。
                If i Mod 2 = 1 Then
                    checkOdd = 1
                Else
                    checkOdd = 0
                End If
                '奇数桁の数を3倍に、偶数桁の数を1倍にして全てを合計する。
                j = j + (Asc(Mid(janCode, i, 1)) And &HF) * (1 + 2 * checkOdd)
            Next
            '合計の1の位を10から引いた数がチェックディジットなので、戻り値として返す。
            CalcCheckDigit = Chr(48 + (10 - (j Mod 10)) Mod 10)
        '標準13桁の場合。
        Case 12, 13
            For i = 1 To 12
                '奇数桁が何文字目か調べる
                '(チェックデジットを除いた1番右側より奇数桁、右から2番目を偶数桁…と数える。)。
                If i Mod 2 = 0 Then
                    checkOdd = 1
                Else
                    checkOdd = 0
                End If
                '奇数桁の数を3倍に、偶数桁の数を1倍にして全てを合計する。
                j = j + (Asc(Mid(janCode, i, 1)) And &HF) * (1 + 2 * checkOdd)
            Next
            '合計の1の位を10から引いた数がチェックディジットなので、戻り値として返す。
            CalcCheckDigit = Chr(48 + (10 - (j Mod 10)) Mod 10)
        '標準13桁又は短絡8桁以外の桁数だった場合。
        Case Else
            '指定に誤りがあるので空白スペースを、戻り値として返す。
            CalcCheckDigit = " "
    End Select
End Function

'BarFont(JAN)を利用した、バーコード描画関数です。
'指定したJANコード標準13桁又は短絡8桁、及びロングバーの有無に対する、
'バーコード表示用文字列を返します。
'
'JANコード標準なら12~13桁、短絡なら7~8桁での入力に対応しています
'(チェックディジットの計算機能が備わっています。)。
'
'パラメータ janCode:        バーコードの文字列。
'                           標準なら12~13桁、短絡なら7~8桁で指定
'           noUseLongBar:   ロングバーを使わない場合True
'戻り値     バーコードで表現される文字列
'           指定に誤りがあればNULL文字列を返す
'
Function ConvertFontChar(janCode, noUseLongBar)
    
    '変換文字列用変数。
    Dim janConv
    janConv = ""
    
    'JANコード13桁用、パリティビット算出用テーブル。
    'Dim combiTable(2 To 7)
    Dim combiTable(7)
    combiTable(2) = 32
    combiTable(3) = 16
    combiTable(4) = 8
    combiTable(5) = 4
    combiTable(6) = 2
    combiTable(7) = 1
    Dim prifixTable(9)
    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)
    Dim i
    Select Case Len(janCode)
    '短絡8桁の場合。
    Case 7, 8
        janCode = Mid(janCode, 1, 7) & CalcCheckDigit(janCode)
        '左側4桁に対する、キャラクタをセットしていく。
        For i = 1 To 4
            janConv = janConv + Chr(Asc(Mid(janCode, i, 1)) + &H20)
        Next
        'センターバーをセットする。
        janConv = janConv & Chr(&H2B - noUseLongBar - 1)
        '右側6桁に対するキャラクタをセットする。
        janConv = janConv & Mid(janCode, 5, 4)
    '標準13桁の場合。
    Case 12, 13
        janCode = Mid(janCode, 1, 12) & CalcCheckDigit(janCode)
        '左側7桁に対する、パリティビットに基づいたキャラクタをセットしていく。
        Dim parityCheck, x
        '左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)
    '指定に誤りがあった場合。
    Case Else
        janConv = ""
    End Select
    '右ガイドバーをセットする。
    If janConv <> "" Then janConv = janConv & Chr(&H29 - noUseLongBar - 1)
    
    '変換文字列を返す。
    ConvertFontChar = janConv
    
End Function

オレオレ蔵書管理システム(仮)の用件定義

用件定義という名の、ただ要望を羅列しただけのもの。
既に出来ている部分や、まだ未実装の機能だったり、
技術的な検証が済んでいない、希望的観測で綴ったもの等
まちまちっす。

◇◇◇

■機能面

家でも外でも使えるもの。検索、登録、修正、削除、etc…
(家=WindowsPC, 外=スマホ(Android) or タブレット(Kindle)

特に蔵書の検索に効果を発揮するUIであること
(文字列検索は基本として、作家、サークル、カテゴリ、タグは
一覧表示した上で、1アクションで所有作品が絞り込めること)

画像で管理、確認が出来ること
(本の書影、CD、DVDのジャケット等を持ち、
本棚(ブクログ)やスライダー(iTune)のようなGUIを備えていること)

画像無し一覧表示も備えていること
(軽さ、視認性を優先した表形式での表示)

電子書籍、自炊PDF等、手持ちデジタルデータとリンクしている
(家でも外でもデータにアクセスが可能)

登録作業の効率化(自動登録、自動取得)
(API公開されていればそれを使用、無ければスクレイピングで対応。
なお、サムネイル画像の自動保存をも含む)

本以外の物品管理にも対応出来ること
(音楽、ビデオ、アプリ、ハード等)

自動、半自動以外の、登録、修正、削除作業が造作無く行えること

同人作品についても手間なく登録出来ること
(ショップ委託されていればその情報を取得、利用)
・WebAPIを提供している大手ECサイト
Amazon楽天、Yahoo、DMM、Google Books
・大手同人ショップサイト
とらのあなメロンブックスComic ZIN
・大手同人DL販売サイト
DLsite、メロンブックスDL、DL.Gechu.com
・大手中古ネットショップ
駿河屋、らしんばんまんだらけ

同人誌即売会で活用出来る仕組みがあること
(サークルチェックリストとの連携、
出展サークルから現在所有の作品を絞り込み
→所有作品を確認して未所有作品を購入する等、
配置マップの動的生成、サークル一覧-配置マップ間の行き来)

■運用面

ストレージ系クラウドサービス活用による、デジタルデータの冗長化
(ローカルで冗長化しつつクラウドでもバックアップを取る)

理想はローカルデータのバックアップを除く部分において、
サーバレス運用出来る仕組みを持たすこと
(サーバ立てる or レンタルサーバ借りる等をしないで済むこと)

運用コストを伴わない構成とすること
(人的労力を極力無くす)

◇◇◇

道半ばにすら及んでいないのはご愛嬌(苦笑)。

オレオレ蔵書管理システム(仮)の現在

書いては捨ててを繰り返しているオレオレ蔵書管理システム(仮)の、
現在までの変遷を残しておきたいと思ったので唐突且つ此処に記載。

◇◇◇

1.Excelワークブックを使った管理
登録とカード目録の作成が不便

dumbo001.hatenablog.com

2.Excelマクロによる管理
外で使えない。
ノートPC運用も試すが、Windowsを外でユルく使うには
難儀なOS(GUI的な意味)だったこと

dumbo001.hatenablog.com
dumbo001.hatenablog.com
dumbo001.hatenablog.com
dumbo001.hatenablog.com
dumbo001.hatenablog.com
dumbo001.hatenablog.com

2.5.自宅サーバ+PHP+MySQLという案
構想だけ。DB設計だけでお腹いっぱいになった

3.Evernote+Googleスプレッドシート+EvcelVBA+C#(登録用)
外で登録出来ない、Windows専用且つExcelが必要、
Amazonスクレイピングの改修が億劫(HTML構造が月1ペース(体感)で変わる)

3.5.Google Apps Script+同スプレッドシート+同HTMLServive(Webアプリ)
使い辛い、機能が不足している

dumbo001.hatenablog.com
dumbo001.hatenablog.com

4.Google Apps Script+同スプレッドシート+同HTMLServive(Webアプリ+サークルチェック機能)
見た目優先で組んで見たものの、DVDから抜いた
サークルカットをそのまま使うのは著作権的にマズイ気が…

5.Evernote+Google Apps Script+同スプレッドシート+GMail+Amazon API(自動登録)
Kindle本を購入したら自動で登録、
Amazon APIは便利だった(スクレイピング実装の手間と比較した場合)

そもそも…
未登録の蔵書が大量にある
多分5~6000冊持っているであろう(予想)うちの、
1000程度しか済んでない(登録済→キンドル本500冊、同人関連500種)

◇◇◇

納得行くシステムの完成が今も見えていない状態だが
本を買ったり読んだりする事自体は生活の一部だったりするので、
いっそライフラークのようなものだと開き直って向き合ってくのも
一興なのかも知れない。<戯言

ハドソン ジョイカードとか

昔持っていたんだけど引っ越したとき廃棄したっぽい。
仕方ないのでヤフオクで買い直した。

[FC]ハドソン ジョイカード
f:id:dumbo001:20170129131310j:plain:w480

ざっと見て回ったが回路図が見当たらないので作成。

[FC]ハドソン ジョイカード 回路図
f:id:dumbo001:20170129131401p:plain:w480

11月中旬までの雑記とか

▲EGマーカー Ver0.07(4)

EGマーカー Ver0.07(4)

※因みに IE8 等の古いブラウザだと以下英文が表示されて実行されない。

Your browser does not appear to support a security feature which is needed by this application.
Please upgrade your browser if you wish to use this application.

f:id:dumbo001:20161119233119p:plain:h600

Google が提供するサービスで作っている、
同人誌とかを蔵書管理するための Web アプリケーション。

昔作っていた ExcelVBA + Microsoft Excel のを
Google Apps Script + Google スプレッドシート
置き換えたようなやつ。

インストール不要でどこでも同じように所蔵同人誌の確認が出来て、
ダブリ購入を防ぎたいって所から始まっているのだが、
今のところ単なる蔵書目録としてしか使えないってのが
先のゲームレジェンドで得た感想。

サークルチェックしておいたデータと連携して、
パパっと目的の情報に辿り付けたりすると便利そうではあるが、
イデアを形として落とし込むまでには至っていない。

冬コミで実践投入という目標に、果たして到達出来るかどうか。

11月はじめの気になりとか

ポケモンGOプラス

第2出荷分が11/5より全国のポケモンセンターで販売開始するとのことで、
サンシャインはメガトーキョー店まで並んで来た。
無事にゲット出来たので早速ネットにあった改造を施す。

(シルク印刷されている型番は9月発売されたものと同じだし、
表面のパターンをざっと見る限り、初期ロットとの違いは多分無いんじゃないかと。)

・改
 自動操作用のジャンパを飛ばす。
 f:id:dumbo001:20161106231130j:plain:h480

・改二
 振動モーター除去による節電効果は如何に。
 f:id:dumbo001:20161106232339j:plain:h480

因みにBluetoothのペアリングをやたら繰り返していたら
ポケモンやポケスポットを発見しているにも関わらず
反応しない事態が発生し出し、仕舞いには一切反応しなくなった。

一旦 iOS 上から Bluetooth 項目よりデバイス削除して、
まっさらな状態から再度ペアリングしたら元通りの反応に戻ったけど。
てっきり改造対策始まったのかと思った。(杞憂)

●ゲームレジェンド25

開催回数1桁の頃以来の参加。
それなりに賑わっていると聞いていたけど、
まさか入場規制で中々入れない程とは露知らず。

写真はサークル「一人二人羽織」さんとこの展示(筐体プラモに液晶画面を載せた物とか)
f:id:dumbo001:20161106232936j:plain:w640

・買った、貰った、遊んだもの
 ・PONGはどうやって動く?(アーケード、PONG/同人誌/流線堂)
 ・くりいむレモン毒本・おかゆ(アニメ/同人誌/華ディスコ)
 ・ツクールエターナル 2号(Ver0.02)(ツクール/同人誌/ツクール同好会)
 ・超連打ボタン シリーズ 超連打えんどーさん(アーケード/同人ハード/いろいろや ひげねこ堂)
 ・にょきにょき(3DS/試遊台/コンパイルクラブちよだ)
  ぷよぷよの亜種かな?って遊び始めてみたけど違くて、けどこれはこれで面白いルールだし
  所見でもそこそこ遊ばせてくれるし、熟練者ともなればより凝ったプレイが生まれそうな、
  そんなゲーム性を伴ったタイトルだと感じた。

・売り切れ、気になり、見落としとか
 ・スーパーカセットビジョンHELLO WORLD(SCV/同人誌/流線堂)
  訪れたときには完売してた。ハンドアセンブルでプログラム作成とか、なんて稀有な…。
 ・スーパーリアル麻雀毒本・完全愛蔵版(アーケード/同人誌/華ディスコ)
  こちらも新刊しか残ってなかった…のかな?
  調べてみたらメロンブックスDLでPDF版売ってるようなのでそっちで済ますか。
 ・PS2専用ローリングスイッチ(PS2/同人ハード/呪術人形館)
  完全に見落としてた…。
 ・ローリングガンナーデモ
  攻略?委託?よく確認していなかった…。
   →デザイン担当の方のスペースで委託頒布していた模様
 ・うーぱーぐらふぃくす(PCE/同人ハード/UperGrafx DevTeam)
  PCエンジンの背面に接続してDVI出力を可能にするアダプタ。
 ・ピョコタンファミコン芸人フジタ、ジャンクハンター吉田からなる
  3名を被写体とした撮影会的な何か(という風に見えた)

▲趣味の開発とか

・EGマーカーWeb Ver0.07
 f:id:dumbo001:20161106234921p:plain:h640

 過去にも何度か日記に書いていた同人誌の蔵書管理なナンチャラ。
 Google の PaaS (Google App Engine) を利用して開発中。
 iOS の仕様上による制限か、iframe 内で position: fixed; が機能せず
 固定ナビゲーションが実現出来ない問題に頭を悩ませている。
 Android のブラウザだと普通に動くんだけどなぁ。

9月までの気になりとか。

デザエモン 隠しメッセージ (SFC/デザエモン)

http://415elm.blog50.fc2.com/blog-entry-2.html
https://tcrf.net/Kaite_Tsukutte_Asoberu_Dezaemon

コントローラポートを使ったセーブデータ通信機能が気になる。
つまり開発当時PCをターボファイルに見立ててデバッグとかしてたってことかな。
22年の時を経て世界同時多発発見された事にも驚き。

■misakiさんとこのファミコン関連 (FC/NES)

misakiさんいつの間にか 6502 たしなまれるようになっているんです?

■HVC-001 (FC/NESエミュ)
http://www.geocities.jp/g_lsluk/system_hvc-001.html

最近はアセンブラソースを直接実行出来るFCエミュレータなんてものがあるとは。

●C90お疲れ様でした(遅っ)

・Emu on PSP 不参加

冬を楽しみにしたい。

・CUBIC STYLE 新作無し

公表していないところで何やら面白げな事をされている様子。
つかそれをまとめて新刊出して欲しい。

・アケステ改造本 ~スティック取り外して取り回しをスッキリさせよう~ (アケコン/同人誌/半端工房)

公正中の版を頂いてしまった。ありがたや、ありがたや。

・いまいち萌えないプチコンプログラム6 (3DSプチコン/同人誌/まりも友の会)
プチコン3号 お絵かき入門 (3DSプチコン/同人誌/おちゃめくらぶ)
タコさん技術誌 第1号 ポケットプリンタArduino で扱えるようにしてみた。
 & 「PICO-8」でとりあえずゲーム(らしきもの)を数時間で作る話 (GB・ポケットプリンタ/同人誌/タコさん技術)

GBポケットプリンタからツイッターのTLが淡々と出力される様に感動した。

・ツクールエターナル No.1/2015.12 (ツクール/同人誌/ツクール同好会)
・DISK Sugar Candy Vol.12 (PC-88/同人CG集/なお・ぐらふぃっくす・らぼ’)
・まじゃべんちゃー・ねぎ麻雀 CALENDAR (PC-88/同人グッズ/なお・ぐらふぃっくす・らぼ’)
・ギアライブ! (GG/同人音楽/Magic Troffle)
・ギアライブ!3 (GG/同人音楽/Magic Troffle)
・ギアライブ!4 (GG/同人音楽/Magic Troffle)
・ギアライズ! (GG/同人音楽/Magic Troffle)

ゲームギア音源を使ったラブライブ!カバーCD

★買い物

・EVERDRIVE N8 (FC)
・キラキラスターナイトDX (FC)
大合奏!バンドブラザーズP (3DS)
新絵心教室 (3DS)
ポケモンアートアカデミー (3DS)

3DS本体はまだない。

▲趣味の開発とか

・Dir to HTML (VBScript, HTML, CSS, Javascript)
衝動的に先月後半から作り始めたファイル、フォルダ一覧出力ツール。
当初の想定から構想が膨らみ過ぎて、実装が終わらないというよくあるパターンに。
今月中にとりあえず使えるところまで目処立てたい。

・Todoist
https://ja.todoist.com/

タスク管理 Web サービス使い始め。
確かに使い易い!ってことで使い道の無かった Google Play 残高使ってプレミアム会員登録。
来年まで使い続けてるようなら延長も視野に入れる方向で。

ご無沙汰してました。

■ブログ再開

2年以上放置しといてなんですが。
どうぞよしなに。

はてなブログへ引越し

はてなダイアリーだと出来ることが限られてしまう、というのが理由。
もっと言えばAPI叩いて外部連携とか面白そうだったから。
…んで、軽く調べたらメール投稿もできるみたい。
トリガーでGASから記事生成してGmail経由で投稿とか夢が広がるなー。

因みに古い記事とかはそのまんま。
消そうかどうか迷ったが、気まぐれで見返すことも偶にあったので一応残した。

ノーホビー・ノーライフ


携わっている案件の担当分がようやく片付いた。これにてシステム開発部からシャバに戻れる。
得ることもままあったけど、ITブラックのこれは酷い!って片鱗を目の当たりにした感じ。
下の方にいるSIerの惨状って、脚色とかなかったんだなーと。


軽い気持ちで近づいたら痛い目見た典型。半年分の趣味リソース食い潰しやがって。
もう2度とシステム開発に関わろうなんて思わない。
俺はプログラミングという行為が好きなんじゃなくて、作りたいもの、欲しいものを作れるのが好きなんだと。
基幹システム作ってても、ちーっとも楽しくなかったし。


ただハンディターミナルのアプリケーション開発って部分はキツくはあったが新鮮だった。
縛り・制約・ブラックボックス・情報不足に加えトレードオフの嵐で、幾度となく心折れそうにはなったけど。


・気晴らしにライン関数で画像描画したり

今年入ってからのヲレ。


転属から4ヶ月で歌通りな有様ですよ。


「言わんこっちゃない。」
「奴等、加減ってものを知らないのか?」


進撃の社畜


それが仕事って言われたけど、ワーカーホリックな先輩方々と俺との価値観の相違なんだろう。
定時退社出来ないくらいのタスク割り当てられて、サービス残業はデフォだし、休みでも仕事の電話来たり、
休日出勤で予定潰されたりして、逆に家に持ち帰ってやらざるを得なかったりetc,etc…
それでいてオペレータ時代と同じ年俸で朝から終電前までこき使われるんじゃ、モチベなんて上がる訳がないと。


更に言えば、この業界知らない俺にOJTすら無い状態で中途採用と同じように仕事振られても、
ベテランIT戦士よろしくサクサクこなせるハズがないのに。
これはまあ、うちの会社の問題なのだが。


自由な時間が得られて趣味の研究に身を焦がせられるのなら、
食い扶持困らないくらいの賃金以上を求めていないのは今も変わらないし。
そろそろ潮時な感じ。