Пользователь
0,0
рейтинг
31 декабря 2013 в 21:10

Вам календарик 2014

В этом году мой брат anatoly_rr не смог выложить новую версию своего календарика. Чтобы не нарушать традицию взял на себя ответственность и выложил за него:



Добрые традиции — это здорово! Календарик!

В карман (100×70мм):
pdf, eps, ps, svg или png (1185×829, 300dpi)

На стенку (A4):
pdf, eps, ps, svg или png (3512×2483, 300dpi)

Сделай сам:
Генератор календариков (Python, CC-BY)



Не забывайте про генератор календарей, который сделал Антон passerby!.

С Новым годом!


Андрей Буров @BuriK666
карма
55,9
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (31)

  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    Уже сделал себе додекаэдр
  • +3
    В заголовке не хватает интервала в unix time. В шестнадцатеричной форме, разумеется.

    То есть 0x7DE(0x52c32240 — 0x54a455bf)
  • +1
    Ждал этот пост в 12:00. С Новым годом!
    • +3
      Это сложная задача, поскольку полночей на Земле происходит за день из-за часовых поясов довольно много.
      • +2
        Ну вы поняли, о чем я.
        • 0
          Я тоже ждал, я даже брату напомнил мол «где календарик.»,
  • 0
    Ура! Спасибо! С наступившим 7DE!
    Творческих успехов в новом году!
  • 0
    Что у меня не работает :(
    PNG и PDF файлы нулевого размера…
    • 0
      Странно! Проверил, все должно отлично качаться.
      • 0
        Я пытался через генератор календаря сделать свой календарь и скачать.
        А эти 16-ричные календарики в топике, да, качаются.
    • +3
      Сделал для вас зеркала:
      Yandex.Disc
      Mail.Cloud

      Добра и удачи в Новом году!
  • +1
    Скажите, а нищебродам с лазерными принтерами полагается удобочитаемая ч/б версия?
    • +5
      Нищебродов с 3d-принтерами вообще обделили.
    • +17
      Версия для ч/б принтера :)
      • 0
        Сделал что-то подобное.
    • 0
      Можно взять python-скрипт и раскрасить календарь как хочется, в частности и под чб-принтер=)
  • +1
    Спасибо, повесил на стену. Будет повод наконец довести 16-ричный счёт до автоматизма :)
  • +3
    Вот версия на tikz: PDF.
    Скрытый текст



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

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

    ps: хочу сделать версию для белорусов
    • +1
      на питоне 2.x работает.
      PS: а чем версия для белорусов будет отличатся?
      • +1
        с питоном 2.7 получилось
        разные праздники :)
        • 0
          вот версия скрипта для белорусов yadi.sk/d/xbx6OpPvFKXZv
          или заменить строку 77 на
          self.holidays = [ (1,1),(1,2),(1,6),(1,7),(3,8),(4,29),(4,30),(5,1),(5,9),(7,3),(7,4),(11,7),(12,25),(12,26)]
  • +2
    универсальная версия скрипта (работает с питоном 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())
    
    
  • –1
    Этот календарик делал не программист а дизайнер
    Мне кажется или надо было начинать с 00 а не с 01
    А то так получается по 15 комбинаций
    • 0
      если делать с 0x00 то неудобно, например, первые дни месяца считать. 0x05 это будет шестое, а не пятое и т.п.
      • +1
        Но мы же не о удобности здесь говорим, для удобности было бы стандартно в 10-й системе
        А вроди бы как для программистов, а то что сделано это не тру

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.