Pull to refresh

Comments 31

UFO just landed and posted this here
В заголовке не хватает интервала в unix time. В шестнадцатеричной форме, разумеется.

То есть 0x7DE(0x52c32240 — 0x54a455bf)
Ждал этот пост в 12:00. С Новым годом!
Это сложная задача, поскольку полночей на Земле происходит за день из-за часовых поясов довольно много.
Я тоже ждал, я даже брату напомнил мол «где календарик.»,
Ура! Спасибо! С наступившим 7DE!
Творческих успехов в новом году!
Что у меня не работает :(
PNG и PDF файлы нулевого размера…
Странно! Проверил, все должно отлично качаться.
Я пытался через генератор календаря сделать свой календарь и скачать.
А эти 16-ричные календарики в топике, да, качаются.
Скажите, а нищебродам с лазерными принтерами полагается удобочитаемая ч/б версия?
Нищебродов с 3d-принтерами вообще обделили.
Версия для ч/б принтера :)
Можно взять python-скрипт и раскрасить календарь как хочется, в частности и под чб-принтер=)
Спасибо, повесил на стену. Будет повод наконец довести 16-ричный счёт до автоматизма :)
Вот версия на tikz: PDF.
Скрытый текст



Начальный код был очень простым, таким и остался: tikz.tex
Но пришлось влезть в библиотеку pgfcalendar и добавить туда своё представление чисел.

Генерация календаря на следующий год требует лишь перекомпиляции файла в новом году =) или небольшой модификации кода.
Нужно будет добавить выходные, их я упустил.
Ещё интересно было бы число в 36-ричном формате, чтоб одной «цифрой». Я такой формат уже лет 15 употребляю…
А почему не в 32-ичном? Как раз хватает же.
Прикольно было бы версию в SVG (с JS), которая использует текущий год…
Решил сгенерить себе. Скачал Python33 (при установке прописал путь к python.exe в PATH)
Запускаю его (в cmd просто указываю имя py файла)
d:\>svg_calendar.py File "D:\svg_calendar.py", line 187 print c.render() ^ SyntaxError: invalid syntax

ps: хочу сделать версию для белорусов
с питоном 2.7 получилось
разные праздники :)
универсальная версия скрипта (работает с питоном 3.3 и 2.7):
Скрытый текст
__author__ = "Anatoly Rr Burov (me@anatolyrr.ru)"
__version__ = "2014"
__date__ = "2014-12-31"
__license__ = "CC-BY"


from calendar import Calendar  # used in render_month


class SvgCalendar:

    def __init__(self, year):

        self.year = year

        font = 'Consolas'

        self.style = {
            'units': 'mm',

            'width': 100,
            'height': 70,

            'border-color': '#ccc',

            'year-color': '#666666',
            'year-padding-top': 5,
            'year-padding-left': 2,
            'year-font-family': font,
            'year-font-size': 5,

            'month-width': 24,
            'month-height': 21,

            'day-width': 23.0 / 7.0,
            'day-height': 12.0 / 5.0,

            'month-margin-right': 0,
            'month-margin-bottom': 0,

            'month-font-family': font,
            'month-font-size': 3,
            'month-color': '#FF9525',
            'month-padding-top': 3,

            'month-offset-top': 5,

            'week-padding-top': 6,
            'week-font-family': font,
            'week-font-size': 1.5,

            'day-padding-top': 6,
            'day-font-family': font,
            'day-font-size': 2.5,

            'day-color': '#000000',
            'day-holiday-color': '#79B1D4',

            'week-color': '#999',
            'week-holiday-color': '#79B1D4',
        }

        self.year_name = "0x" + hex(year)[2:].upper()
        self.month_names = [
            '01', '02', '03', '04', '05', '06',
            '07', '08', '09', '0A', '0B', '0C']
        self.weekdays_names = ['001', '010', '011', '100', '101', '110', '111']
        # self.days_names = [ "%02x" % (i + 1) for i in range (32)]
        self.days_names = ["%02x" % (i + 1) for i in range(32)]

        # well, actually holidays depend on the production calendar
        self.holidays = []
        self.not_holidays = []

        if year == 2014:  # got dates for 2012
            # tuples (month, day)
            self.holidays = [(1, 1), (1, 2), (1, 3), (1, 4),
                             (1, 5), (1, 6), (1, 7), (1, 8),
                             (2, 23), (3, 8),
                             (5, 1), (5, 2), (5, 3), (5, 9), (5, 10),
                             (6, 12), (7, 4), (11, 4), ]

            self.holidays.append((4, 4))  # (4, 4) - Webmasters' Day

            # last Friday of July is Sysadmin's Day
            # Calculated for 2012 manually, have no time before publication to
            # implement general case
            self.holidays.append((7, 26))

            # self.not_holidays = [(3,11), (4, 28), (6, 9), (12, 29)]

            #  256th day of year is Programmers' Day
            # leap year, I didn't bother with %100 and %400 years, sorry ;) We
            # will not need them in the nearest 88 years anyway
            if year % 4 == 0:
                self.holidays.append((9, 12))
            else:
                self.holidays.append((9, 13))

    def is_holiday(self, month, day, day_of_week):
        if day_of_week in [5, 6]:
            return (month, day) not in self.not_holidays
        return (month, day) in self.holidays

    def render_day(self, x, y, month, day, day_of_week):
        svg = ''
        if self.is_holiday(month, day,  day_of_week):
            color = self.style['day-holiday-color']
        else:
            color = self.style['day-color']
        svg += ('<text x="%smm" y="%smm" font-family="%s" '
                'font-size="%smm" fill="%s" text-anchor="middle">') % (
                    x + 0.5 * self.style['day-width'], y,
                    self.style['day-font-family'],
                    self.style['day-font-size'], color)
        svg += '%s' % self.days_names[day - 1]
        svg += '</text>'
        return svg

    def render_week(self, x, y):
        svg = ''
        svg += '<g>'
        for i in range(7):
            if i < 5:
                color = self.style['week-color']
            else:
                color = self.style['week-holiday-color']
            svg += ('<text x="%smm" y="%smm" font-family="%s" '
                    'font-size="%smm" text-anchor="middle" fill="%s">') % (
                        x + (i + 0.5) * self.style['day-width'], y,
                        self.style['week-font-family'],
                        self.style['week-font-size'], color)
            svg += '%s' % (self.weekdays_names[i])
            svg += '</text>'
        svg += '</g>'
        return svg

    def render_month(self, x, y, month_no):
        svg = ''

        svg += '<g>'
        svg += ('<text x="%smm" y="%smm" font-family="%s" '
                'font-size="%smm" text-anchor="middle" fill="%s">') % (
                    x + self.style['month-width'] / 2,
                    y + self.style['month-padding-top'],
                    self.style['month-font-family'],
                    self.style['month-font-size'],
                    self.style['month-color']
                )
        svg += '%s' % (self.month_names[month_no - 1])
        svg += '</text>'
        svg += self.render_week(x, y + self.style['week-padding-top'])

        day_of_week = -1  # will start from Monday
        week_no = 0

        c = Calendar(0)
        for day_no in c.itermonthdays(self.year, month_no):

            day_of_week = (day_of_week + 1) % 7
            if day_of_week == 0:
                week_no += 1

            if day_no == 0:
                continue  # month not yet started

            xx = x + self.style['day-width'] * (day_of_week)
            yy = y + \
                self.style['day-padding-top'] + \
                week_no * self.style['day-height']

            svg += self.render_day(xx, yy, month_no, day_no, day_of_week)

        svg += '</g>'
        return svg

    def render_year(self, x, y):
        svg = ''
        svg += '<g>'
        svg += ('<text x="%smm" y="%smm" font-family="%s" '
                'font-size="%smm" text-anchor="middle" fill="%s">') % (
                    x + self.style['width'] / 2,
                    y + self.style['year-padding-top'],
                    self.style['year-font-family'],
                    self.style['year-font-size'],
                    self.style['year-color'])
        svg += self.year_name
        svg += '</text>'
        for i in range(12):
            xx = i % 4
            yy = i // 4
            svg += self.render_month(
                x + xx * self.style['month-width'] +
                xx * self.style['month-margin-right'],
                y + self.style['month-offset-top'] +
                yy * self.style['month-height'] +
                yy * self.style['month-margin-bottom'],
                i + 1
            )
        svg += '</g>'
        return svg

    def render(self):
        svg = ''
        svg += ('<?xml version="1.0" standalone="no"?>'
                '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" '
                '"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'
                '<svg width="%smm" height="%smm" version="1.1" '
                'xmlns="http://www.w3.org/2000/svg"><desc>Calendar '
                '2014</desc><g><rect x="0.25mm" y="0.25mm" '
                'width="%smm" height="%smm" rx="2.5mm" fill="#fff" '
                'stroke="%s" storke-width="0.5mm"/></g>') % (
                    self.style['width'], self.style['height'],
                    self.style['width'] - 0.75,
                    self.style['height'] - 0.75,
                    self.style['border-color'])
        svg += self.render_year(self.style['year-padding-left'], 0)
        svg += '</svg>'
        return svg


import sys

if __name__ == '__main__':

    c = SvgCalendar(2014)

    # normal, 100x70 mm
    if not 'a4' in sys.argv:
        print(c.render())

    # a4
    else:
        k = 3
        c.style.update({
            'units': 'mm',

            'border-color': '#fff',

            'width': 297,
            'height': 210,

            'year-padding-top': 6 * k,
            'year-padding-left': 2 * k,
            'year-font-size': 5 * k,

            'month-width': 21 * k,
            'month-height': 20 * k,

            'day-width': 22.0 * k / 7.0,
            'day-height': 10.0 * k / 5.0,

            'month-margin-right': 9,
            'month-margin-bottom': 1,

            'month-font-size': 3 * k,
            'month-padding-top': 5 * k,

            'month-offset-top': 6 * k,

            'week-padding-top': 9 * k,
            'week-font-size': 1.5 * k,

            'day-padding-top': 10 * k,
            'day-font-size': 2 * k,
        })
        print(c.render())

Этот календарик делал не программист а дизайнер
Мне кажется или надо было начинать с 00 а не с 01
А то так получается по 15 комбинаций
если делать с 0x00 то неудобно, например, первые дни месяца считать. 0x05 это будет шестое, а не пятое и т.п.
Но мы же не о удобности здесь говорим, для удобности было бы стандартно в 10-й системе
А вроди бы как для программистов, а то что сделано это не тру
Sign up to leave a comment.

Articles

Change theme settings