読者です 読者をやめる 読者になる 読者になる

ご無沙汰してました。

■ブログ再開

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

はてなブログへ引越し

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

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

ノーホビー・ノーライフ

駄文


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


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


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


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

今年入ってからのヲレ。

駄文


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


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


進撃の社畜


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


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


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

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

執筆 開発 プログラミング ExcelVBA


以前のエントリで書いた、フリーバーコードフォント用文字列書き出しプログラムの続きです。
JANコード標準13桁、短絡8桁とチェックディジット算出に対応まで。
まだExcelマクロの標準モジュールでしか動いていないので、次はVBSに対応させる予定です。


BarFont.bas

'
'   BarFont(JAN)補助モジュール
'
'   version 0.02
'   Jan 05, 2014
'
'   by REGEKATSU
'
'   release
'
'   version 0.02
'   JANコード標準なら12〜13桁、短絡なら7〜8桁での入力に対応しています
'   (チェックディジットの計算機能が備わっています。)。
'
'   version 0.01
'   JANコード13桁のみ対応しています。12桁での入力には対応していません
'   (チェックディジットの計算機能はありません。)。
'

'入力ボックスに指定されたJANコード標準13桁又は短絡8桁に対するバーコード表示用文字列を、
'同じく入力ボックスに出力します。
'入力無しかキャンセルボタンをクリックすることで、処理が終了します。
Public Sub JanCodeToFontChar()
    
    Const DEFAULT_PROMPT As String = "JANコード標準13桁又は短絡8桁を入力してください。"
    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 "############" Or inputCode Like "#############" Or _
            inputCode Like "#######" Or inputCode Like "########" 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 <> ""
    
End Sub

'指定したJANコード標準13桁又は短絡8桁に対する、チェックディジットを返します。
'
'パラメータ janCode:        バーコードの文字列。
'                           標準なら12〜13桁、短絡なら7〜8桁で指定
'戻り値     チェックディジット1桁の文字列。
'           指定に誤りがあれば空白スペースを返す
'
Public Function CalcCheckDigit(janCode As String) As String
    Dim i, j As Integer
    Dim checkOdd As Integer
    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文字列を返す
'
Public Function ConvertFontChar(janCode As String, noUseLongBar As Boolean) As String
    
    '変換文字列用変数。
    Dim janConv As String
    janConv = ""
    
    'JANコード13桁用、パリティビット算出用テーブル。
    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)
    Dim i As Integer
    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 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)
    '指定に誤りがあった場合。
    Case Else
        janConv = ""
    End Select
    '右ガイドバーをセットする。
    If janConv <> "" Then janConv = janConv & Chr$(&H29 - noUseLongBar - 1)
    
    '変換文字列を返す。
    ConvertFontChar = janConv
    
End Function

今更ですが、あけましておめでとうございます。

雑記


とあるシリーズ観ていたらあっという間に休日消化の、とても素敵な正月を過ごしてしまいました。


つまりあれです、コミケ後のやる気出ない感は半端無いということです(?)。

同人誌にバーコードを付ける。

執筆 開発 プログラミング ExcelVBA


同人誌に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