dil: (Default)
Sunday, April 14th, 2019 04:20 pm

Утром посмотрел на свой предыдущий пост в LJ, опубликованный вчера, а там почему-то картинка пропала. Зашёл в Edit, там url картинки не поменялся. А когда попробовал посмотреть саму эту картинку, firefox сказал, что небезопасно.. Оказалось, что SSLный сертификат на моём веб-сайте сегодня рано утром закончился.

Хотя у меня там в cron приделана команда “certbot-auto renew” для обновления сертификата, выданного Let’s Encrypt, и раньше она успешно работала, а сегодня почему-то нет.
Попробовал запустить эту команду вручную, но она ругнулась на ошибочный код возврата команды “python -m pip –version”, и до обновления сертификата так и не дошла.
Типа, питон не может запустить модуль pip, потому оно и не работает.
Скачал этот скрипт certbot-auto заново с certbot.eff.org, но он точно такой же, ничего не менялось.

Погуглил, оказалось, в нём стОит заменить “python -m pip –version” на “pip –version”, и далее “python -m pip install –no-index –no-deps -U” заменить на “pip install –no-index –no-deps -U”.
Заменил, и тогда “certbot-auto renew” сработал, успешно обновив сертификат на очередные 3 месяца.

Но отчего такое могло случиться – не понимаю, раньше же этот скрипт успешно обновлял сертификат. А в старом Debian 7 (wheezy) уже давно ничего не обновляется, так что и питон не мог поменяться.

Потом ещё посмотрел на свой домашний сервер, где всё ещё использую тот же Debian 7, и оказалось, что и там сертификат не обновляется из-за такой же ошибки. Подправил и там certbot-auto точно так же, и он тоже стал работать.

Оригинал этой записи в личном блоге.

dil: (Default)
Tuesday, August 21st, 2018 08:55 pm

Когда я первоначально тестировал свой скрипт для замены http-ссылок в постах ЖЖ на https, вроде всё нормально работало. Но когда я его запустил на полный набор своих постов, то обнаружилась фигня – у большинства исправленных постов почему-то пропал Subject.
Оказалось, что в описании API действительно написано, что при изменении поста Subject должен быть обязательно указан. Но ведь без него же функция обновления постов вполне работает.. А ещё там написано, что надо обязательно указывать дату и время поста – но без них тоже работает, и прежние даты и время не пропадают. И тэги тоже не пропадают.

Короче, я слегка обновлил скрипт, чтобы Subject передавался, теперь вроде всё нормально. Кому интересно, можете его скачать по прежней ссылке: https://dil.pp.ru/tmp/replace_links_in_lj.py

Оригинал этой записи в личном блоге.

dil: (Default)
Friday, August 3rd, 2018 11:13 am

в своих постах ЖЖ, про что я писал в предыдущем посте, можете использовать мой скрипт: https://dil.pp.ru/tmp/replace_links_in_lj.py
Написан на питоне. Для запуска надо в него подписать свой логин и пароль.

Если надо проверять не все посты, а ограничить по датам, то подписать даты и время в startfrom и stopat. Но у постов при этом используются не явно указанные в них даты, а время последних изменений.

В replacefrom подписать регулярное выражение – что надо заменить, например, <img src="http://(адрес_сайта/) , а в replacewith – на что заменить, типа <img src="https:\1
\1 там используется для подстановки того, что в первом выражении было в первых круглых скобках, то есть, адрес сайта/ .

Если в процессе обработки постов встречается ошибка “You’ve exceeded a posting limit…”, то скрипт останавливается на 10 минут, а потом пробует ещё раз. Если опять та же ошибка, то опять останавливается, и т.д. При внесении изменений в мой журнал он останавливался иногда на 50 минут, иногда на 40, а иногда всего на 10. Но в целом он работал около 6 часов.

Оригинал этой записи в личном блоге.

dil: (Default)
Monday, July 9th, 2018 06:52 pm

Обнаружилось, что в питоне стандартно поддерживаются не только обычные числа, но и комплексные. Я раньше об этом совершенно не знал. Только в качестве суффикса мнимой части вместо обычного i (означающего квадратный корень от -1) используется j или J:

$ python
Python 2.7.13 (default, Nov 24 2017, 17:33:09) 
>>> a=1+2j
>>> b=3+5J
>>> a
(1+2j)
>>> b
(3+5j)
>>> a+b
(4+7j)
>>> a*2
(2+4j)
>>> a*b
(-7+11j)
>>> a/b
(0.3823529411764706+0.029411764705882346j)

Оригинал этой записи в личном блоге.

dil: (Default)
Friday, May 25th, 2018 06:30 pm

Моя первая разработка на django – система поиска производителей сетевых адаптеров по MAC-адресам: mac.dil.pp.ru .
А некоторое время назад сайт почему-то перестал работать, выдавал ошибку

uWSGI Error
Python application not found

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

Traceback (most recent call last):
  File "./mac/wsgi.py", line 10, in 
    import os
ImportError: No module named os

Потому веб-сервер и не мог прицепиться к этому неазпускающемуся приложению:

unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***

Запустил питон в консоли, там import os нормально работает. Запустил программу через джанговский manage.py runserver – тоже работает, а в uwsgi почему-то нет..

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

Ну, похоже, что uwsgi пытался использовать старый python 2.6, а он уже проапдейтился до 2.7. Так что грабельки удалось обойти, вписав в uwsgi’шный ini-файл plugin = python27. Теперь вроде нормально работает.

Оригинал этой записи в личном блоге.

dil: (Default)
Wednesday, April 19th, 2017 09:13 am

Эта программа поможет их подправить: https://github.com/nvbn/thefuck
Причём не только в линуксе, а ещё и в macOS..

Оригинал этой записи в личном блоге.

dil: (Default)
Saturday, June 11th, 2016 03:25 pm

В ru_linux дискуссия на тему Разработка ядра с помощью Bash on Ubuntu on Windows..
Один товарищ предложил сразу на питоне. Я, было, подумал, что это шутка, но ВНЕЗАПНО оказалось, что уже правда так можно: http://www.kplugs.org/

Оригинал этой записи в личном блоге.

dil: (Default)
Wednesday, November 11th, 2015 10:19 pm

Гугл решил раздать свою разработку по имени TensorFlow всем желающим.. В виде библиотеки для C++ и питона.

Оригинал этой записи в личном блоге.

dil: (Default)
Saturday, December 6th, 2014 09:46 pm
# pip uninstall future
Uninstalling future:
  /usr/local/bin/futurize
  /usr/local/lib/python2.7/dist-packages/future
  /usr/local/lib/python2.7/dist-packages/future-0.9.0.egg-info
  /usr/local/lib/python2.7/dist-packages/libfuturize
Proceed (y/n)?  y
  Successfully uninstalled future

Такая вот командочка..

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

dil: (Default)
Wednesday, August 14th, 2013 06:23 pm

Теперь в него добавили генераторы в стиле питона..
via

Оригинал этой записи в личном блоге.

dil: (Default)
Monday, August 27th, 2012 09:54 pm

В процессе освоения питона эта азбучная истина всплыла в очередной раз в не очень очевидной ситуации.

Понадобилось мне вручную поизвлекать объекты из итератора. Поначалу я написал так:

while True:
  obj = container.__iter__().next()
  ... обработка obj

и.. получил зацикливание. Немного подумав, я понял, что это вполне логично. Ибо __iter__() не просто возвращает итератор, а сначала создаёт его. Каждый раз заново. Соответственно, next() каждый раз возвращает из итератора первый объект, а до второго вообще никогда не доходит.

Вынос инварианта за пределы цикла эту проблему сразу же решил:

iterator = container.__iter__()
while True:
  obj = iterator.next()
  ... обработка obj

Оригинал этой записи в личном блоге.

dil: (Default)
Monday, December 19th, 2011 03:50 pm

# env | grep PYTHON
# python --version
Python 2.7.1+
# python
ValueError: Empty module name
#

И всё. Питон есть, но не работает. Соответственно, ни один пакет, который в preinst/postinst/prerm/postrm использует питон, невозможно нормально ни поставить, ни удалить. Ибо там внутри везде set -e, скрипты вылетают по первой ошибке, а dpkg, увидев ошибку, решает, что что-то сломалось, и оставляет пакет в прежнем состоянии:

dpkg: error while cleaning up:
 subprocess installed post-installation script returned error exit status 1

Вот такая фигня. И главное — совершенно непонятно, отчего это. Я её в конечном итоге вылечил шаманскими танцами, но что это было — загадка…

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

dil: (Default)
Sunday, June 20th, 2010 10:05 pm

Да, и в Гугле тоже.

Начал смотреть видеоуроки по питону . Уроки хорошие, ориентированы на людей, имеющих некоторый опыт в программировании, но не знающих питона. Для меня самое то.

Но субтитры… Наклюкавшаяся ключница что ли делала? Урок первый:
9:45: лектор: “primitive Emacs editor”, субтитры: “primitive EmEx editor”
12:45: лектор: “you have the execute bit set”, субтитры: “you have the XQ bit set”

Ну это ладно, ключница неграмотная, терминов не знает. Но она ещё и смысл искажает:
41:14: лектор: “These strings essentially are just series of bytes”, субтитры: “These strings essentially are just serious and bites”
44:27: лектор: “So this is a very handy syntax”, субтитры: “So this is a very heavy syntax”

Это только то, что мне при просмотре в глаза бросилось. Наверняка при внимательном анализе ещё что-нибудь найдётся.

Кто-нибудь знает, куда им про это можно написать? Это вроде как лекции для внутреннего пользования, которые просто выложили для всех желающих, поэтому отсутствия ошибок никто не обещал, но не до такой же степени..

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

dil: (Default)
Sunday, April 11th, 2010 08:50 pm

Особенно это касается софта. Ну вот попробовал я поставить byteflow. В целом хорошая вещь, но…

Подключаешь модуль livejournal – отваливается постинг. Всё остальное в админ-режиме работает, а вместо формы для нового поста вылетает странный exception из глубин Django. И  главный разработчик, которому я про это рассказал,  в глубоком недоумении сказал, что не понимает, отчего это вообще может быть. Ну ладно, потратил я два дня, с моими-то отсутствующими знаниями питона, нашёл, как сделать, чтоб работало, но причину так и не понял.

Подключил этот livejounal, всё кросспостится, но.. настройки скрининга комментариев и приватности самого поста до ЖЖ не доходят. Покопался в коде, подправил, заработало. Завтра отправлю разработчикам патчи.

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

Оригинал этой записи в личном блоге.

dil: (Default)
Monday, January 18th, 2010 12:31 pm

А есть где-нибудь tutorial по программированию для CUDA?
На официальный сайт не посылайте, я там уже был, там есть отличный reference manual, programming guide и best practices guide, я их почитал, и понял, что мне для погружения нужно не это, а пошаговый вводный курс с примерами. Типа “нейрохирургия для чайников за 10 дней”. А подробности я потом изучу.

Есть такое в природе? Говорят, был курс на сайте Иллинойсского университета http://courses.ece.illinois.edu/ece498/al1/, но там уже нет. Update: оно там таки есть, спасибо [info]alextutubalin за ссылку.

И второе. Есть ли хорошая библиотечка для парсинга TLV (tag-length-value) с несколькими уровнями вложенности для C и/или питона? Хорошая в моём понимании – это которая на кривых данных не вылетает и не выдаёт фигню, а разумно сообщает о найденных ошибках и выдаёт максимально возможное количество корректно извлечённых данных.

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

dil: (Default)
Thursday, October 8th, 2009 03:13 pm

Читаю книжку про Django. Встретил там один интересный пример. Вопрос к профессионалам: есть ли в таком способе решения _данной конкретной задачи_ глубокий смысл, которого я не вижу, или это чисто понты для демонстрации возможностей питона? Подробности под катом, не-программистам будет неинтересно.

Read the rest of this entry » )

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

dil: (Default)
Tuesday, September 22nd, 2009 03:25 pm

Коллеги, а вы видите сайт byteflow.su?

Я его несколько дней назад нашел, только было собрался почитать, и тут йок – оба его авторитетных NSа (ns0.omsf.ru и eth0.net.ua) перестали отвечать на запросы. Это у меня одного так, или что?

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

Tags:
dil: (Default)
Saturday, September 5th, 2009 02:46 pm

Читаю официальное руководство от питона.

The actual parameters (arguments) to a function call are introduced in the local symbol table of the called function when it is called; thus, arguments are passed using call by value (where the value is always an object reference, not the value of the object).

Я чего-то не понимаю, или как раз такой метод передачи параметров и называется “передачей по ссылке”?

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

dil: (Default)
Sunday, August 16th, 2009 08:26 pm

Поскольку оба перловых milter-модуля  оказались непригодными к употреблению, пришлось поставить python-milter и осваивать питон. В целом он мне нравится – очень читабельный код. Из синтаксиса больше раздражает отсутствие явного обозначения  концов блоков, чем само оформление блоков отступами.

А вот отсутствие типизированных объявлений сыграло со мной злую шутку.  Написал маленький фрагмент:

  def body(self,chunk):
    self.log("body chunk")
    self.body += chunk
    return Milter.CONTINUE

и потом три часа пытался понять, почему во время выполнения оно вылетает с exception’ом “str is not callable”.

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

dil: (Default)
Friday, August 1st, 2008 05:12 pm
Сколько пробелов питон считает за один уровень отступа?
4? 8? Сколько встретит в первый раз?
А что будет, если пробелов будет некратное число, кажем, 3 или 5?
А если они будут перемешаны с табуляциями?

Вопрос относится не к тому, как надо писать, а к тому, как будет восприниматься уже написанный и криво отформатированный код.