akry: (16 tons)

Долго-долго искал плавающего жука в программе и попутно обнаружил следующую особенность php: он весьма криво обрабатывает вложенные функции.

Например,

function foo ()
{
function callback_fn() {  }

$str = preg_replace_callback ($pattern, $replacement, 'callback_fn', $str);
}

запросто может вызвать ошибку типа 'Fatal error: Cannot redeclare callback_fn'. Особенно если foo() внутри класса.

Процитировать пост: Процитировать в LiveJournal! Процитировать в LiveInternet! Facebook Share Процитировать в Twitter! Добавить блог в GoogleReader!
akry: (16 tons)

 

10 случайных картинок из фотогалереи
кликните для увеличения  кликните для увеличения  кликните для увеличения  кликните для увеличения  кликните для увеличения  кликните для увеличения  кликните для увеличения  кликните для увеличения  кликните для увеличения  кликните для увеличения  

 

Насколько всё-таки продуман и удобен интерфейс к Гугл-штучкам вроде Picasa Web Albums. Даже ЖЖ есть чему у гугла поучиться, а про Лиру мы будем или хорошо, или ничего.

Трудозатраты:

  • 2 часа, чтобы сделать скрипт, выкачивающий все заголовки постов с ЖЖ.
  • 4 часа, чтобы сделать скрипт, выкачивающий все заголовки постов с Лиру.
  • 15 минут, чтобы сделать скрипт, выкачивающий все заголовки постов с WordPress. Локальная БД рулит :)
  • 1 час, чтобы сделать скрипт, который умеет искать соответствия ссылок в ЖЖ-Лиру-WP.
  • 4 часа, чтобы выкачать все фотки из покойной галереи в Лиру. Через грёбаный HTML и regexps.
  • 20 минут, чтобы написать скрипт, заливающий их все на Picasa Web Albums. 20 минут, тудыть их! При том, что я начинал с нуля, вообще не был знаком с Гугл-API. 
  • 3 часа, чтобы скрипты выкачали фотки, а потом залили их на пикасу. 350 мегов, 2200 фоток. С сохранением названий и бэклинков.

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

В общем, вот поисковик, мало ли кому кроме меня пригодится. Скажем, если хочется ответить на пост не в ЖЖ (ЛиРу), а в ЛиРу (в ЖЖ). Или быстренько найти пост по ключевому слову/заголовку.

Осталось только доделать плагин к вордпрессу для автоматической трансляции постов. Никак руки пока не доходят. А может быть ещё сделать робот, который все фотки из самих постов переместит куда-нибудь в пикасовский альбом. Чтобы быть независимым от лиру.

 

 

footnotes

1 В 99% случаев компьютер/компилятор не виноват, виновата ушастая прокладка между стулом и монитором. Но каждый раз почему-то кажется, что сейчас именно тот 1% случаев, когда виноват компьютер. Чем скорее ушастая прокладка откажется от этой мысли и начнёт искать баг в собственном коде, тем быстрее всё заработает. 

2  Если переменная используется больше, чем на протяжении трёх строчек кода, нужно давать ей внятное имя. Даже в циклах. Никаких «$i». Иначе через какое-то время случится катастрофа.

3 Быстрое грубое работающее решение лучше, чем многомесячная разработка невероятно красивого фреймворка. Особенно когда за это не платят денег. Лучше, но при условии что потом будет хоть какой-то вежливый рефакторинг.

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

-1 Перечитал и ужаснулся. Я — бизнес-консультант и фотограф, а пост программиста. Да, кто-то ищет работу в сфере IT, а я, чем ни занимаюсь, у меня выходит IT в сфере работы.

Mirrored from тайный блог aKry.

akry: (16 tons)

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

1. Налажена синхронизация ссылок на посты в ЖЖ, Лиру и WP. Оно само, в зависимости от того, куда шлётся пост, заменяет внутренние ссылки на другие посты. В ЖЖ все ссылки на посты в ЖЖ, в ЛиРу — на посты в ЛиРу. Я долго возился со всякими XML API, потом плюнул и за полчаса написал парсер, который все посты вытаскивает из обычного HTML. Посты синхронизированы по хешу из имени статьи и года, чтобы отличать статьи с одинаковыми названиями. Их немного, но вдруг. В принципе можно подумать о меньшем зазоре, скажем, размером дней в 15. Больший зазор маловероятен, а пара недель однажды была. UPD. Сделал. Обнаружилось много постов с информативным именем «***».

2. Ссылки на юзеров автоматом преобразуются в то, что нужно — в зависимости от блога, куда они шлются. Например,  <lj user=”username”> в ЖЖ таким и остаётся, в WP он превращается в ссылку с картинкой, а в ЛиРу он становится . Соответственно, Лирушный [user=имяюзера] при отсылке поста в Лиру таким и остаётся, а в WP и ЖЖ он превращается в ссылку на дневник юзера. Причём даже с мужской или женской иконкой, в зависимости от пола юзера. А ещё появился [xuser=LiRu_Username, LJ_Username], для обозначения тех, кто, как и я, имеет счастье быть зарегистрированным в обоих блогсервисах. Нужный код для ссылки на юзера выбирается автоматически при экспорте.

Надо сказать, что программисты Лиру не очень позаботились об удобстве для тех, кто хочет доступа к дневнику с помощью программных клиентов. API кривое, глючное, местами нерабочее, нет необходимого функционала. На этом фоне заявление ValeZ, что «у нас больше API чем у ЖЖ» выглядит смешно — доведите до ума хотя бы одно, не гонитесь за количеством. Что конкретно не так, здесь писать не буду, чтобы не отвлекаться от хвастовства.

3. Написал постыдную библиотеку доступа к постам в Лиру. Постыдную, потому что доступ идёт через HTML, а это некрасиво и чревато. Но всё-таки о ней напишу, потому что она позволяет делать то, чего я не смог добиться ни от каких API. А именно — получение/изменение назначенных посту категорий, ключевых слов, видимости поста и комментариев. Мог бы добавить и загрузку картинок, но пока не уверен, что мне это надо. Если кто-нибудь сейчас снисходительно засмеётся и скажет: «Бууу! Так это же элементарно сделать через (например) MT API!», пожалуйста, скажите это в комментариях. Я буду чрезвычайно благодарен тому, кто избавит меня от доступа через HTML.

Вот.

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

Вдогонку: хорошая статья с рекомендациями по оформлению программ на PHP. Без фанатизма, с обоснованиями, почему и зачем.

Mirrored from тайный блог aKry.

akry: (Default)

Кто знает, как в PHP в cURL справиться с печеньками без оранж-соды?

Сразу говорю:

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);

curl_setopt($ср, CURLOPT_HEADER, 1);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

а до этого файл $cookie_file_path был создан и освящён заклинанием chmod 0777.

Но файл пуст, несмотря на то, что cURL точно получает cookies. Вот хоть тресни. Радио «Радонеж» не помогло.

Какие тут подводные камни?

akry: (Default)

Потянуло поупражняться по мелочи. Вот задачка. Как сделать ротацию картинок в профайле ЖЖ, если там не поддерживается javascript?

Очевидно, через внешний скрипт, который подсовывает разные картинки. Желательно через «302 Moved Temporarily», и с какой-нибудь припиской к ссылке, чтобы не кешировалась.

А как сделать картинки кликабельными? И чтобы ссылки вели именно на показываемые картинки?

Ну, как-то так…

http://akry.livejournal.com/profile

akry: (Default)

«Процитировано 3 раз». «Тры раз — нэ пидораз». «Этот надпис рэжет глаз».

Специально для тех, кто оформляет интерфейсы, не повторяйте оплошности ValeZ. Образовать множественное число очень просто. Вот для этого кусок кода на PHP:

code:
function ru_lang_plural ($num, $str0, $str1, $str2)
{
 if ($num == 0 || ($num > 4 && $num < 21)) {
  return $str0;   // 0 цитат, 5 цитат
 } else {
  if ($num > 10) $n = $num % 10;
   else $n = $num;
  
  if ($n == 1) return $str1;      // 1 цитата
  if ($n > 1 && $n < 5) return $str2;     // 2 цитаты
 };
}

Если строки хранятся в отдельном файле или в БД (а они должны храниться отдельно в любом серьёзном проекте), можно работать с ними например так:


code:
$lang = array (
  'str1' => 'В вашей корзине {%0, товар}, благослави вас Господь!',
  'str2' => 'У нас есть {%0; отличная причина} чтобы выпить!'
);

$plurals = array (
 // ноль, одно, два
  'товар' => array ('товаров', 'товар', 'товара'),
  'отличная причина' => array ('отличных причин', 'отличная причина', 'отличные причины')
);

function ru_lang_plural ($num, $plurals)
{
 if ($num == 0 || ($num > 4 && $num < 21)) {
  return $plurals[0];   // 0 цитат, 5 цитат
 } else {
  if ($num > 10) $n = $num % 10;
   else $n = $num;
 
  if ($n == 1) return $plurals[1];      // 1 цитата
  if ($n > 1 && $n < 5) return $plurals[2];     // 2 цитаты
 };
}

function parse_lang_str ($strName, $vars = array ())
{
  global $lang;
 
  // всякие проверки, разделы и т. п. опущены для краткости
  $str = $lang[$strName];
  if ($vars) {
   foreach ($vars as $N => $value) {
    $GLOBALS['_value'] = $value;
    $str = preg_replace_callback
         (
          "/\{%($N)[,;](.+?)\}/",
          create_function(
                 '$matches',
                 'global $plurals, $_value;
                  return $_value . '&nbsp;' . ru_lang_plural($_value, $plurals[trim($matches[2])]);'
            ),
          $str
         );
   };
  };
 
  return $str;
}

for ($n = 0; $n < 12; ++$n) {
 echo $n . "<Br>";
 echo parse_lang_str ('str1', array (0=> $n)) . '<Br>';
 echo parse_lang_str ('str2', array (0=> $n)) . '<Br>';
 echo "<br>";
};




Код упрощённый, но вполне рабочий.

Да пребудет с нами русский язык.

++ интересно, зачем здесь в текстовом редакторе стиль «code», если он всё равно на это чихает в итоговой публикации?

April 2017

S M T W T F S
      1
2345678
9101112131415
16171819202122
23242526272829
30      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 6th, 2025 02:00 pm
Powered by Dreamwidth Studios