LINUX.ORG.RU
решено ФорумTalks

Часов много не бывает

 , , , ,


4

1

Так как сегодня пятница и похвальной является любая шизофрения в рамках почти здравого смысла, представляю вашему вниманию часы!

clockrip
██████ ██████    ██████ ██████
    ██     ██ ██     ██ ██    
██████ ██████    ██████ ██████
██         ██ ██ ██         ██
██████ ██████    ██████ ██████

clockrip -f O -s
OOOOOO OOOOOO    OOOOOO OOOOOO    OOOOOO OOOOOO
    OO     OO OO     OO OO  OO OO     OO OO  OO
OOOOOO OOOOOO    OOOOOO OOOOOO    OOOOOO OOOOOO
OO         OO OO OO     OO  OO OO OO     OO  OO
OOOOOO OOOOOO    OOOOOO OOOOOO    OOOOOO OOOOOO

clockrip -f ▓ -s
▓▓▓▓▓▓ ▓▓▓▓▓▓    ▓▓▓▓▓▓ ▓▓▓▓▓▓    ▓▓▓ ▓▓▓▓▓▓
    ▓▓     ▓▓ ▓▓     ▓▓     ▓▓ ▓▓  ▓▓     ▓▓
▓▓▓▓▓▓ ▓▓▓▓▓▓    ▓▓▓▓▓▓ ▓▓▓▓▓▓     ▓▓ ▓▓▓▓▓▓
▓▓         ▓▓ ▓▓     ▓▓ ▓▓     ▓▓  ▓▓ ▓▓    
▓▓▓▓▓▓ ▓▓▓▓▓▓    ▓▓▓▓▓▓ ▓▓▓▓▓▓     ▓▓ ▓▓▓▓▓▓

Эта элегантная утилита позволит вам выводить время в виде больших букф чисел в разнообразном цвете и стиле, а элегантное название подчеркнёт туннельный синдром кистей ваших рук при наборе в эмуляторе терминала.

Теперь каждому найдётся своё место в этом мире и времени. Если вы клоун, то можете подчеркнуть свою самобытность выводя часы из клоунских улыбок, дарящих счастье людям во всём мире.

Суть, мне нужны были часы как tty-clock нравится какой у них вывод, но только мне нужно было иметь возможность просто выводить время в таком виде в файл, а не держать обновляющееся время в терминале с виду дурацкая идея, но так надо, в этом вся суть.

  • clockrip

  • Аргументы опциональные

    • -h Отобразить справку
    • -u Выводить мировое UTC время, а не локальное
    • -s Отображать секунды
    • -f Установить символ заполнитель (одно знакоместо)
    • -ft [TEXT] Установить символ заполнитель (одно знакоместо)
    • -fw [TEXT] Установить символ заполнитель (два знакоместа)
    • -c [COLOR] Установить цвет заливки
    • -b [COLOR] Установить цвет заливки фона
    • -d Включить эффект мигания для точек разделителей
    • -t [TEMP] Установить цвет через значение температуры в Цельсиях
    • -bt [TEMP] Установить цвет фона через значение температуры в Цельсиях
    • -k [TEMP] Установить цвет через значение температуры в Кельвинах
    • -bk [TEMP] Установить цвет фона через значение температуры в Кельвинах

Ключи -t -k -bt -bk отменяют значение ключей -c -b
Ключи -t -k переопределяют друг друга, какой задан последним тот и задаёт значение
Ключи -bt -bk переопределяют друг друга, какой задан последним тот и задаёт значение

Цвет заливки может быть названием цвета из списка

  black |  red |  green |  yelow |  blue |  purple |  cyan |  gray
 bblack | bred | bgreen | byelow | bblue | bpurple | bcyan | bgray

Цвет заливки может быть кодом цвета от 0 до 256 или от 000000 до FFFFFF Если вместо времени отображается белиберда можно попробовать заменить -fw на -ft и наоборот, утилита работает только с заливкой символами шириной 1 или 2 знакоместа от любого иного варианта отображаемое форматирование поедет.

Может кому надо тоже, эта супер пупер утилита на все времена UnixWay ультраортодоксальна и не умеет сама обновлять время, а тупо её выводит, поэтому

  • watch -tcn 60 clockrip -c green Будет вызывать скрипт и обновлять время раз в минуту
  • watch -tcn 1 clockrip -s -c green Будет вызывать скрипт и обновлять время раз в секунду
  • watch -tcn 1 clockrip -s -fw 😊 Будет вызывать скрипт и обновлять время раз в секунду

Негодники

Вишенка на торте, в этом описании текста больше чем кода в утилите

★★★★★

Последнее исправление: LINUX-ORG-RU (всего исправлений: 13)

Ответ на: комментарий от LINUX-ORG-RU

Чего-то ты перешёл на картинки. :)
Я хотел просто:

-t   --temp     [℃] Set foreground RGB color accorded to a degree Celsius // знатоки английского поправят :)
-bt  --btemp    [℃] Set background RGB color accorded to a degree Celsius // --"--"--"--"--"--"--"--"--"--

Кстати, https://ru.wikipedia.org/wiki/Цветовая_температура.

dataman ★★★★★
()
Ответ на: комментарий от dataman

Так яж добавил O_O, только ключи другие. Но да потом начал картинки делать и меня переклинило, даже про часы забыл

UDP: Тьфу, я не запушил. Сейчас бекап идёт, с проверкой хеш сумм и прочими проверками после отключения света (пробки вышибло). Попозже обновлю.

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от dataman

Так! Я откатил то что делал, суть -> я не хочу отдельные ключи для этого, так как у меня внутри родился когнитивный диссонанс от

clockrip -c red -t 25000

Это херня, сама конструкция предполагает что мы задам красный цвет, а потом меняем температуру красного цвета на холодный красный что на самом деле не имеет смысла без указания коэффициента тонирования и всего вот этого вот, если такая конструкция возможна для записи то это подразумевает не установку цвета от температуры, а коррекцию цвета температурой, я на 146% уверен что ты не это имел в виду, а ты имел в виду просто задать цвет часам просто температурой да?

Если да, то давай лучше переиспользуем ключи -c и -b так, чтобы можно было задать цвет температурой через них

  • -c red имя цвета
  • -c 102 код цвета
  • -c 0FAC3F RGB цвет как есть
  • -c k:1600 ????? температура в кельвинах, так норм? Иной вариант?
  • -c c:1327 ????? температура в цельсиях, так норм? Иной вариант?

Тема серьёзная, о нас зависит многое, судьба планеты в наших руках, так что нужны идеи.
Если честно я бы уже залил неглядя ваниант с указанием префикса к значению, по которому можно легко отличить температуру от остальных вариантов, но на всяких случай притормозил.

Ещё на всякий случай, вдруг метеорит у падёт на Марс (я не знаю причём тут это, но ладно) были подготовлены реализации температура в цвет на лува, сишечке и джиэлеселе

Подумал что пока буду делать приму решение, закончил вот, спать пора, так что давай свои мысли в слух пожалуйста по поводу как задать температуру для ключей -c и -b чтобы это было и удобно и наглядно, по аналогии с RGB именами и кодами, удобно же что не надо 8 разных ключей, а всего два, вот это хотелось бы сохранить.

Пока я тактически пребываю в бессознательном состоянии, выскажи свои мысли пожалуйста :D

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

давай свои мысли в слух пожалуйста по поводу как задать температуру для ключей -c и -b чтобы это было и удобно и наглядно, по аналогии с RGB именами и кодами

Если число дробное, то считать температурой?


Есть отличная библиотека на Nim: https://github.com/treeform/chroma.

Chroma - Everything you want to do with colors.

Код легко читается.

src/chroma/temperature.nim:

import colortypes, math

proc slopeUp(k, a, b, c, d, e: float): float =
  let kp = k + e
  a + b * kp.pow(3) * exp(c*kp) + d * ln(k)

proc slopeDown(k, a, b, c, d, e: float): float =
  let kp = k + e
  a + b * kp.pow(c) + d * ln(k)

proc fromLinear(v: float): float =
  if v > 0.0031308:
    ((1.055 * pow(v, 1/2.4)) - 0.055)
  else:
    v * 12.92

proc fromTemperature*(kelvin: float): Color =
  ## Compute color from temperature of "ideal black-body radiator".
  ## Used in applications in lighting, photography, videography, publishing,
  ## manufacturing, astrophysics, horticulture, and other fields.
  ## See: https://en.wikipedia.org/wiki/Color_temperature

  result.a = 1
  let temperature = kelvin / 10000.0

  # Calculate red
  if kelvin <= 6600:
    result.r = 1.0
  else:
    result.r = fromLinear(slopeDown(
      temperature,
      0.32068362618584273,
      0.19668730877673762,
      -1.5139012907556737,
      -0.013883432789258415,
      -0.21298613432655075
    ))

  # Calculate green
  if kelvin <= 6600:
    result.g = fromLinear(slopeUp(
      temperature,
      1.226916242502167,
      -1.3109482654223614,
      -5.089297600846147,
      0.6453936305542096,
      -0.44267061967913873
    ))
  else:
    result.g = fromLinear(slopeDown(
      temperature,
      0.4860175851734596,
      0.1802139719519286,
      -1.397716496795082,
      -0.00803698899233844,
      -0.14573069517701578
    ))

  # Calculate blue
  if kelvin >= 6600:
    result.b = 1
  elif kelvin <= 1900:
    result.b = 0
  else:
    result.b = fromLinear(slopeUp(
      temperature,
      1.677499032830161,
      -0.02313594016938082,
      -4.221279555918655,
      1.6550275798913296,
      -1.1367244820333684
    ))

Твоя kelvin_to_rgb:

local function kelvin_to_rgb(t)
    local max,min,log = math.max, math.min, math.log
    local r,  g,  b
    ---------------------------------------------------------------
    t = min(max(t,1000),40000) / 100
    ---------------------------------------------------------------
    r = t <= 66 and 255 or 329.698727446 * (t - 60 ^ -0.1332047592)
    r = min(max(r,0),255)
    ---------------------------------------------------------------
    g = t <= 66 and 99.47080258610 * log(t) - 161.1195681661 or
                    288.1221695283 * ((t - 60) ^ -0.0755148492)
    g = min(max(g,0),255)
    ---------------------------------------------------------------
    if t >= 66 then
       return r,g,255
    end
    ---
    if t <= 19 then
       return r,g,0
    end
    ---
    b = 138.5177312231 * log(t - 10) - 305.0447927307
    b = min(max(b,0),255)
    return r, g, b
end
dataman ★★★★★
()
Ответ на: комментарий от dataman

Конкретно по коду, там вся суть в константах и заданных границах, без чтения статьи код читать просто бесполезно, никто ничего в нём не поймёт. А после прочтения статьи и понимания каким образом генерируются приближённые к нужным значениям, константы по месту их применения смотрятся понятнее чем будучи вынесенными во вне именно поэтому я везде навтыкал ссылку на источник дабы если кому надо поправили под себя, либо вовсе написали сами. Так и я написал для себя и поправил под себя, включая README ибо через пол года вернусь и не растеряюсь :D

Ну и у меня цель была написать типовой код одинаковый по сути для трёх языков и компактный чтобы если что менять его везде сразу просто влоб. А так, просто разные реализации и всё. Это ладно =)

Если число дробное, то считать температурой?

Во первых спасибо, тут баг, разное поведение в lua и С коде реализаций clockrip если параметрам -c/-b передаётся просто число то это подразумевает код от 0 до 255 и если оно дробное то дробная часть должна отсекаться, в сишке отсекается sscanf, а в lua косяк был, исправил на данный момент.

Но я так понял ты предлагаешь для указания температуры использовать дробное число? Ну фиг знает если честно, стоит подумать, а вариант с префиксом или постфиксом к числу тебе не нравится? Типа -c 1600:F или -c 1376:C или -c F:1600 или -c C:1376 ? Если бы не RGB значения то можно было бы просто -c 1376C сделать и всё было бы понятно и красиво, тупо указываешь температуру, но уже нельзя так как есть варианты неразличимых пересечений с HEX значениями.

Почему я склоняюсь к префиксам и постфиксам, цветовую температуру особенно если её откуда-то копировать в 99% случаев получится взять в виде кельвинов и мне это больше нравится, но ты как человек запросивший фичу хочешь цельсии и поэтому я подумал что в идеале это ни тебе ни мне :D, в том плане что нужно указать явно вот число и оно кельвин или вот число и оно цельсий иначе это просто номер цвета. Вот как-то так, готов внести изменения с постфиксов или префиксов, разубеди меня если кажется что это неправильно

Варианты формата указания температуры

Постфиксная запись удобна при редактировании и имеет естественную запись температуры как есть, но с ньюансом, должен быть, удобный в записи символ благодаря которому можно гарантированно отличить значение от просто числа и от HEX числа.

Тут кажется наиболее подходящим вариант с точкой, выглядит естественно, удобно для записи и понятно

  • 1600:C 1600:F

  • 1600.C 1600.F

Но, так как температура априори может быть дробной то для такой записи должно быть возможно это, и тут уже обязательная точка перед типом температуры выглядит излишней, но она всё ещё нужна, и вариант с двоеточием уже выглядит более адекватным

  • 1600.689:C 1600.989:F

  • 1600.689.C 1600.689.F

Ещё момент, так как в рамках цветовой температуры дробные значения просто проглотятся, и никак не повлияют на выводимый цвет ибо 1600 и 1600.99 в рамках преобразования температуры в цвет выдадут одно и тоже r=255 g=114 b=0 и поэтому несмотря на сказанное выше, нет смысла использовать дробные числа от слова совсем. И тут вернётся можно к тому что если разрешить лишь целые то вариант 1600.689.C тупо игнорить как неправильный, а вариант 1600.C уже обрабатывать, но тут точка может вводить в заблуждение именно относительно дробных чисел и как альтернативный варант можно использовать всё опять формат вида

  • 1600:C 1600:F как пока что единственный лишённый каких либо проблем и неоднозначностей восприятия

Как-то так, вроде мелочь и я раздуваю из мухи слона, но к такому сверхважному делу как вывод часов в цвете температуры цвета свечения лампочки требует очень ответственного подхода! Ваше мнение коллега?

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Но я так понял ты предлагаешь для указания температуры использовать дробное число?

Да.

а вариант с префиксом или постфиксом к числу тебе не нравится?

Да, не нравится. :)

вариант с двоеточием уже выглядит более адекватным

Shift изнашивается. :)

dataman ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

готов внести изменения с постфиксов или префиксов

Тогда уж лучше дополнительные ключики для температуры.

dataman ★★★★★
()
Ответ на: комментарий от dataman

Да.

С этим проблемы что я выше описал, ну и нельзя указать кельвин/цельсий таким образом, я не хочу только цельсий

Да, не нравится. :)

:(

Shift изнашивается. :)

:)

Тогда уж лучше дополнительные ключики для температуры.

Ладно, можно поступить так

Добавить варианты формата

  • для -c и -b вида 1600.C и 1600.K

Добавить отдельные ключи для температуры (только для цельсия)

  • -t 1600 --temp 1600
  • -bt 1600 --btemp 1600

Получается и тебе и мне, но в таком случае, что ты ожидаешь от этого, какое подразумеваешь поведение

  • clockrip -c green -t 1600 ?

Указание температуры (которая преобразуется в цвет) игнорирует явно заданный цвет?
Указание явно заданного цвета игнорирует температуру (которая преобразуется в цвет)?
Что указано последним то и будет назначено? Что указано первым то и будет назначено? Температура корректирует цвет?

Это основная проблема дополнительных ключей так как тут либо замена цвета и нужен приоритет ключей (что само по себе плохо так как нужно это помнить) либо совместная их работа если указаны и те и те что вводит механизм цветокоррекции, а оно надо? Основная то суть как я понимаю получить цвет из температуры, а не задать температуру для уже заданного цвета

Видишь как всё сложно если

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

что ты ожидаешь от этого, какое подразумеваешь поведение clockrip -c green -t 1600?

Сообщение об ошибке – либо то, либо другое.

dataman ★★★★★
()
Ответ на: комментарий от dataman

Получите, распишитесь ✅

    -t  --temp      [°C]    Set foreground color accorded to a degree Celsius
    -bt --btemp     [°C]    Set background color accorded to a degree Celsius

    -k  --ktemp     [°K]    Set foreground color accorded to a degree Kelvin
    -bk --bktemp    [°K]    Set background color accorded to a degree Kelvin

Ключи температуры отменяют значение ключей цвета, вне зависимости от своего положения в аргументах, то есть имеют более высокий приоритет. Ключи для разных типов температур переопределяют друг друга, если используются -t и -k вместе (что не имеет никакого смысла по логике) что последнее задано, то и в дамках, аналогичная история с -bt и -bk ну это по логике должно быть и так понятно. Вроде всё.

Суть проста, ты либо задаёшь цвет, либо температуру, либо в кельвинах либо в цельсиях.

Не зря я булки мял к слову, в lua был баг, скобочки не поставил

-    r = t <= 66 and 255 or 329.698727446 * (t - 60 ^ -0.1332047592)
+    r = t <= 66 and 255 or 329.698727446 * ((t - 60) ^ -0.1332047592)

А самое смешное что я минут 30 искал ошибку и нет не тут, а в Сишной реализации, я думал у меня там что-то не то и там значения не верные. Кек

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от LINUX-ORG-RU

Получите, распишитесь ✅

╔══╗─╔═══╗╔══╗╔╗╔╗╔══╗╔══╗╔══╗╔══╗╔╗──╔╗╔══╗╔╗
║╔╗║─║╔═╗║║╔╗║║║║║╚╗╔╝║╔═╝║╔═╝╚╗╔╝║║──║║║╔╗║║║
║╚╝╚╗║╚═╝║║╚╝║║║║║─║║─║╚═╗║╚═╗─║║─║╚╗╔╝║║║║║║║
║╔═╗║║╔╗╔╝║╔╗║║╚╝║─║║─╚═╗║╚═╗║─║║─║╔╗╔╗║║║║║╚╝
║╚═╝║║║║║─║║║║╚╗╔╝╔╝╚╗╔═╝║╔═╝║╔╝╚╗║║╚╝║║║╚╝║╔╗
╚═══╝╚╝╚╝─╚╝╚╝─╚╝─╚══╝╚══╝╚══╝╚══╝╚╝──╚╝╚══╝╚╝

в lua был баг

Поэтому остался отладочный вывод? ;)

$ ./clockrip -t 300

300 255 12 0

dataman ★★★★★
()
Ответ на: комментарий от dataman

Поэтому остался отладочный вывод? ;)

Ой! Ага :D

LINUX-ORG-RU ★★★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.