さくらのレンタルサーバで直近1週間分だけmysqlのバックアップを取っておく

  • さくらインターネットのレンタルサーバを使っている。
  • 毎日mysqlのバックアップを自動的に取りたい。
  • 一週間分だけ取っておきたい(一週間以上前のバックアップは消えてほしい)。

と、聞かれたので、書いておく。

  • mysqldumpでダンプする。
  • bzip2で圧縮する。
  • dateで取得した曜日をファイル名に含めて毎日上書きする。

という方針でいく。
続きを読む

Windows ファイルの関連付け変更バッチ

OpenOffice.orgを2.3にバージョンアップした。

インストール自体はファイルサーバ上に一度だけで完了。ただ、ファイルの関連付けを変更するにはインストーラを動かさないといけない。

何台もあるサーバで関連付けを変えるためだけにインストーラを動かすのは面倒だなあ、ということで、ファイルの関連付けだけを登録、変更するバッチを作って移行完了。力技。


change user /install
pause
assoc .odb=opendocument.DatabaseDocument.1
assoc .odf=opendocument.MathDocument.1
assoc .odg=opendocument.DrawDocument.1
assoc .odm=opendocument.WriterGlobalDocument.1
assoc .odp=opendocument.ImpressDocument.1
assoc .ods=opendocument.CalcDocument.1
assoc .odt=opendocument.WriterDocument.1
assoc .otg=opendocument.DrawTemplate.1
assoc .oth=opendocument.WriterWebTemplate.1
assoc .otp=opendocument.ImpressTemplate.1
assoc .ots=opendocument.CalcTemplate.1
assoc .ott=opendocument.WriterTemplate.1
pause
ftype opendocument.CalcDocument.1="Z:\OpenOffice.org 2.3\program\scalc.exe" -o "%%1"
ftype opendocument.CalcTemplate.1="Z:\OpenOffice.org 2.3\program\soffice.exe" -o "%%1"
ftype opendocument.DatabaseDocument.1="Z:\OpenOffice.org 2.3\program\sbase.exe" -o "%%1"
ftype opendocument.DrawDocument.1="Z:\OpenOffice.org 2.3\program\sdraw.exe" -o "%%1"
ftype opendocument.DrawTemplate.1="Z:\OpenOffice.org 2.3\program\soffice.exe" -o "%%1"
ftype opendocument.ImpressDocument.1="Z:\OpenOffice.org 2.3\program\simpress.exe" -o "%%1"
ftype opendocument.ImpressTemplate.1="Z:\OpenOffice.org 2.3\program\soffice.exe" -o "%%1"
ftype opendocument.MathDocument.1="Z:\OpenOffice.org 2.3\program\smath.exe" -o "%%1"
ftype opendocument.WriterDocument.1="Z:\OpenOffice.org 2.3\program\swriter.exe" -o "%%1"
ftype opendocument.WriterGlobalDocument.1="Z:\OpenOffice.org 2.3\program\soffice.exe" -o "%%1"
ftype opendocument.WriterTemplate.1="Z:\OpenOffice.org 2.3\program\soffice.exe" -o "%%1"
ftype opendocument.WriterWebTemplate.1="Z:\OpenOffice.org 2.3\program\soffice.exe" -o "%%1"
pause

Windows ショートカット作成VBスクリプト

全員のデスクトップのショートカットを揃えたほうが電話でサポートしやすいね、ということで。
VBスクリプトを使ってショートカット作成スクリプトを作ってみた。

使い方は、こんな感じ。

C:\>create-shortcuts.vbs shortcut.conf

create-shortcuts.vbs

'#####################################################
' ショートカット作成スクリプト
' 設定ファイル複数受付版
'#####################################################
Const FOR_READING = 1
Const COL_FOLDER = 0
Const COL_SUB_FOLDER = 1
Const COL_TITLE = 2
Const COL_PATH = 3
Const COL_WORK = 4

Set objArgs = WScript.Arguments
'Wscript.Echo objArgs(0)
'Wscript.Echo objArgs.length

For arg_index = 0 to objArgs.length-1

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile(objArgs(arg_index), FOR_READING)

Do Until objTextFile.AtEndOfStream
  strNextLine = objTextFile.Readline
  if strNextLine <> "" then
    conf = Split(strNextLine , ",")
    if conf(COL_FOLDER) <> "" then
        Set Shell = CreateObject("WScript.Shell")
        CreatePath = Shell.SpecialFolders(conf(COL_FOLDER))
        if CreatePath = "" then CreatePath = conf(COL_FOLDER)
        if conf(COL_SUB_FOLDER) <> "" then
          CreatePath = CreatePath & "\" & conf(COL_SUB_FOLDER)
          if not objFSO.FolderExists(CreatePath) then
          	objFSO.CreateFolder(CreatePath)
          end if
        end if
        Set link = Shell.CreateShortcut(CreatePath & "\" & conf(COL_TITLE) &".lnk")
        link.Description = conf(COL_TITLE)
        link.HotKey = ""
        link.IconLocation = conf(COL_PATH)
        link.TargetPath = conf(COL_PATH)
        '通常のウインドウ
        link.WindowStyle = 1
        link.WorkingDirectory = conf(COL_WORK)
        args = ""
        For i = COL_WORK+1 to Ubound(conf)
          args = args & " " & conf(i)
        Next
        link.Arguments = args
        ret = link.Save

'デバッグ情報
'        Wscript.Echo "タイトル:" & conf(0)
'        Wscript.Echo "パス:" & conf(1)
'        Wscript.Echo "作業ディレクトリ:" & conf(2)
'        Wscript.Echo "引数:" & args
'        Wscript.Echo ret
    end if
  end if
Loop
Next

shortcut.conf

,********************************************
, カンマで始まる行はコメント行
,********************************************

,カンマで区切って、作成場所、タイトル,パス,作業ディレクトリ,引数1,引数2,引数3,...の順に書いておくと
,作成場所(デスクトップなど)にショートカットを作る

,作成場所に指定できるのは次のものだけ
, AllUsersDesktop
, AllUsersStartMenu
, AllUsersPrograms
, AllUsersStartup
, Desktop
, Favorites
, Fonts
, MyDocuments
, NetHood
, PrintHood
, Programs
, Recent
, SendTo
, StartMenu
, Startup
, Templates

,****************************************************************
, ここからが実際のデータ
,****************************************************************
Programs,,Excel,C:\Program Files\Microsoft Office\Office11\excel.exe,H:\,
Programs,,Word,C:\Program Files\Microsoft Office\Office11\winword.exe,H:\,
Programs,,PowerPoint,C:\Program Files\Microsoft Office\Office11\powerpnt.exe,H:\,
Programs,,Visio,C:\Program Files\Microsoft Office\Visio10\visio.exe,H:\,
Programs,,Access,C:\Program Files\Microsoft Office\Office11\msaccess.exe,H:\,

Desktop,,Excel,C:\Program Files\Microsoft Office\Office11\excel.exe,H:\,
Desktop,,Word,C:\Program Files\Microsoft Office\Office11\winword.exe,H:\,
Desktop,,PowerPoint,C:\Program Files\Microsoft Office\Office11\powerpnt.exe,H:\,
Desktop,,Visio,C:\Program Files\Microsoft Office\Visio10\visio.exe,H:\,
Desktop,,Access,C:\Program Files\Microsoft Office\Office11\msaccess.exe,H:\,

Pythonでモジュラス10ウエイト3とisbn10to13

Guidelines For Shipping Container Labeling http://www.bisg.org/docs/shipping_label_guidelines_09-2005.pdf
こんなのをやるにあたって、ちゃんとしたモジュラス10ウエイト3のチェックデジットを計算する必要があったので作った。

ついでに、isbnlib.pyよりもシンプルに10桁ISBNを13桁にする関数も。

Python版

#!/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))

Delphi版は関数だけ

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;

最新版はgithubをどうぞ。
Python版Delphi版

トラックバック入門

今頃といえば今頃だけど、直近の仕事で使えそうなので。

はてなのトラックバックを使ってCGIを作って練習してみた。

tb.py

#!/usr/bin/env python2.4
# -*- coding: utf-8 -*-
"""トラックバックを受けて、テキストファイルに出力する。
"""
import os
DB='/tmp/tb.txt'
if not os.path.exists(DB):
	f = file(DB,'w')
	f.write('--- trackbacks ---\n')
	f.close()

def resp(error_code=0,message=None):
  s = "%d" % error_code
  if message:
    s += "%s" % message
  return s

def xml_resp(s):
  return """
  
  %s
  
  """ % s

class TrackbackRequest(object):
  title = ""
  url = ""
  blog_name = ""
  excerpt = ""
  def __init__(self,form):
    if form.has_key('title'):self.title = form['title'].value
    if form.has_key('url'):self.url = form['url'].value
    if form.has_key('blog_name'):self.blog_name = form['blog_name'].value
    if form.has_key('excerpt'):self.excerpt = form['excerpt'].value

    if not self.url:
      raise Exception,"url should exists."

  def save(self,file_name):
    f = file(file_name,'a')
    f.write('%s\t%s\t%s\t%s\n' % (self.url,self.title,self.blog_name,self.excerpt))
    f.close()

import cgi
print "Content-type: text/xml\n"
try:
  tb = TrackbackRequest(cgi.FieldStorage())
  tb.save(DB)
  print xml_resp(resp(0,str(tb)))
except Exception,msg:
  print resp(1,msg)