суббота, 28 апреля 2012 г.

Иногда возникает непонятное желание получить дату в Юлианском стиле.
Если у кого-то вдруг это желание возникает при написании XSLT преобразования, то ему - я думаю - облегчит жизнь следующий скрипт (julian-1600.xsl):


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template name="julian">
    <!--Construct Julian value for the Date-->
    <xsl:param name="date"/>
    <xsl:param name="add" select="0"/>
    <xsl:param name="year"/>
    <xsl:param name="month"/>
    <xsl:param name="day"/>
    <xsl:param name="jul_year"/>
    <xsl:param name="jul_month"/>
    <xsl:param name="jul_day"/>
    <xsl:choose>
      <xsl:when test="number($add) != $add">
        <xsl:call-template name="julian">
          <xsl:with-param name="date" select="$date"/>
          <xsl:with-param name="add" select="0"/>
          <xsl:with-param name="year" select="$year"/>
          <xsl:with-param name="month" select="$month"/>
          <xsl:with-param name="day" select="$day"/>
          <xsl:with-param name="jul_year" select="$jul_year"/>
          <xsl:with-param name="jul_month" select="$jul_month"/>
          <xsl:with-param name="jul_day" select="$jul_day"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:when test="string-length($date) &gt;= 10">
        <xsl:call-template name="julian">
          <xsl:with-param name="year" select="substring-before($date,'-')"/>
          <xsl:with-param name="month" select="substring-before(substring-after($date,'-'),'-')"/>
          <xsl:with-param name="day">
            <xsl:choose>
              <xsl:when test="contains($date,'T')">
                <xsl:value-of select="substring-before(substring-after(substring-after($date,'-'),'-'),'T')"/>
              </xsl:when>
              <xsl:otherwise>substring-after(substring-after($date,'-'),'-'))</xsl:otherwise>
            </xsl:choose>
          </xsl:with-param>
          <xsl:with-param name="jul_year" select="1600"/>
          <xsl:with-param name="jul_month" select="1"/>
          <xsl:with-param name="jul_day" select="1"/>
          <xsl:with-param name="add" select="2305448 + $add"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:when test="number($jul_year) + 400 &lt;= number($year)">
        <xsl:call-template name="julian">
          <xsl:with-param name="year" select="$year"/>
          <xsl:with-param name="month" select="$month"/>
          <xsl:with-param name="day" select="$day"/>
          <xsl:with-param name="jul_year" select="$jul_year+400"/>
          <xsl:with-param name="jul_month" select="$jul_month"/>
          <xsl:with-param name="jul_day" select="$jul_day"/>
          <xsl:with-param name="add" select="$add + 365*400 + 97"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:when test="number($jul_year) + 4 &lt;= number($year)">
        <xsl:call-template name="julian">
          <xsl:with-param name="year" select="$year"/>
          <xsl:with-param name="month" select="$month"/>
          <xsl:with-param name="day" select="$day"/>
          <xsl:with-param name="jul_year" select="$jul_year+4"/>
          <xsl:with-param name="jul_month" select="$jul_month"/>
          <xsl:with-param name="jul_day" select="$jul_day"/>
          <xsl:with-param name="add" select="$add + 365*4 + 1"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:variable name="bis_sextus">
          <xsl:value-of select="1 * (number($jul_year) mod 400 = 0 or (number($jul_year) mod 4 = 0 and number($jul_year) mod 100 != 0))"/>
        </xsl:variable>
        <xsl:variable name="month_days">
          <xsl:value-of select="31 - (number($jul_month)=4 or number($jul_month)=6 or number($jul_month)=9 or number($jul_month)=11) * 1 - (number($jul_month)=2)*(3-number($bis_sextus))"/>
        </xsl:variable>
        <xsl:choose>
          <xsl:when test="number($jul_year) &lt; number($year)">
            <xsl:call-template name="julian">
              <xsl:with-param name="year" select="$year"/>
              <xsl:with-param name="month" select="$month"/>
              <xsl:with-param name="day" select="$day"/>
              <xsl:with-param name="jul_year" select="$jul_year+1"/>
              <xsl:with-param name="jul_month" select="$jul_month"/>
              <xsl:with-param name="jul_day" select="$jul_day"/>
              <xsl:with-param name="add" select="$add + 365 + $bis_sextus"/>
            </xsl:call-template>
          </xsl:when>
          <xsl:when test="number($jul_month) &lt; number($month)">
            <xsl:call-template name="julian">
              <xsl:with-param name="year" select="$year"/>
              <xsl:with-param name="month" select="$month"/>
              <xsl:with-param name="day" select="$day"/>
              <xsl:with-param name="jul_year" select="$jul_year"/>
              <xsl:with-param name="jul_month" select="$jul_month + 1"/>
              <xsl:with-param name="jul_day" select="$jul_day"/>
              <xsl:with-param name="add" select="$add + $month_days"/>
            </xsl:call-template>
          </xsl:when>
          <xsl:when test="number($jul_day) &lt; number($day)">
            <xsl:call-template name="julian">
              <xsl:with-param name="year" select="$year"/>
              <xsl:with-param name="month" select="$month"/>
              <xsl:with-param name="day" select="$day"/>
              <xsl:with-param name="jul_year" select="$jul_year"/>
              <xsl:with-param name="jul_month" select="$jul_month"/>
              <xsl:with-param name="jul_day" select="$day"/>
              <xsl:with-param name="add" select="$add + $day - $jul_day"/>
            </xsl:call-template>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="$add"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

Ну и ниже привожу пример трансляции xml файла с датой в её "Юлианское" представление.
root.xml:
<?xml version="1.0" encoding="UTF-8"?>
<root>2011-12-02T00:00:00</root>
root.xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:include href="julian-1600.xsl"/>
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="root">Julian (<xsl:value-of select="."/>): <xsl:call-template name="julian">
            <xsl:with-param name="date">
                <xsl:value-of select="."/>
            </xsl:with-param>
        </xsl:call-template>
    </xsl:template>
</xsl:stylesheet>

msxsl root.xml root.xsl:
Julian (2011-12-02T00:00:00): 2455898

P.S.> Единственное ограничение - дата не ранее 01.01.1600.

вторник, 13 декабря 2011 г.

Установка DD-WRT на Linksys E3000 (прошивка 17990 mega)

Собственно, по началу ничего не предвещает проблем, но -как оказалось - это поначалу...
На входе имеем Linksys E3000 с уже установленной прошивкой (прошивка была старая 14???, но можно было ставить и на родную Linksys-овскую).



К роутеру подключен WD Elements 2.5''. Разбит на 4 партиции: jffs (2Gb) (ext-3), swap (256Mb) (linux-solaris swap), mnt (293Gb) (ext-3), opt (2Gb) (ext-3). Тип разбивки не готов сказать - либо dos, либо - что скорее всего - linux-овый.
Прошивка взяда с ftp-ddwrt ресурса и устанавливалась в два этапа: сначала 17990_NEWD-2_K2.6_mini-e3000.bin, после чего делался rest (30/30/30) и далее - устанавливался dd-wrt.v24-17990_NEWD-2_K2.6_mega-nv60k.bin (тоже с reset после него).


Проблема номер раз: смонтировать JFFS
. Старая версия dd-wrt у меня монтировала первую партицию и всё было пучком. Новая - сначала монтирует первую как ext-3, а затем - по необъяснимым пока причинам - третью в ту же точку монтирования, но уже как ext-2 при том, что размечено всё под ext-3. Причём вторичное монтирование происходит уже после выполнения скриптов Startup и FireWall.
В комментах к прошивке DD-WRT 17967 было сказано, что имена партиций теперь поддерживаются в uppercase формате. Естественно - попробовал переименовать jffs в JFFS, плюс переформатировать её в ext2. Всё равно в некий момент времени происходило монтирование третьей партиции поверх первой. Я сделал ещё 2 предположения - что у меня не DOS разбивка, а Linux и что моя текущая разбивка отличается от новых "веяний", описанных на сайте dd-wrt, где JFFS стоит 3-ей.

Поскольку при подключении через роутер или VMWare Fusion скорость переноса данных ну ооочень маленькая, а ставить на iMac линукс или искать Ext-3 драйвера под Fuse мне не хотелось, то я принял решение забить на automount и сделать всё в manual режиме. Итак: первый шаг: отключаем automount на диск.
Далее - необходимо смонтировать данный диск. Для этого используем секцию Administration/Commands/Startup. Поскольку диск у нас не смонтирован, то взять файл скрипта неоткуда, а в данной секции можно лишь разместить набор шеловских команд. Поступаем следующим образом: командой echo создаём скрипт /tmp/mt, ставим ему атрибут исполнения и запускаем. Ну и далее - запускаем скрипт с нашего смонтированного диска: /jffs/etc/init.d/local.start, который уже выполняет все действия по настройке и запуску остальных процессов. Вот текст данного набора команд:
echo '#!/bin/sh'>/tmp/mt
echo insmod usb_storage>>/tmp/mt
echo insmod mbcache>>/tmp/mt
echo insmod jbd>>/tmp/mt
echo insmod ext2>>/tmp/mt
echo insmod ext3>>/tmp/mt
echo prt=\'sda1\'>>/tmp/mt
echo n=1>>/tmp/mt
echo 'while [ $n -lt 90 ] ; do'>>/tmp/mt
echo ' if [ -z "$p" ] ; then'>>/tmp/mt
echo ' p=`grep "$prt" /proc/partitions | awk '\''{print $4}'\'\`>>/tmp/mt
echo ' else'>>/tmp/mt
echo ' grep -q "/dev/discs/disc0/part1" /proc/mounts && break'>>/tmp/mt
echo ' mount -t ext2 -o noatime /dev/discs/disc0/part1 /jffs'>>/tmp/mt
echo ' fi'>>/tmp/mt
echo ' let n+=1'>>/tmp/mt
echo ' sleep 1'>>/tmp/mt
echo done>>/tmp/mt
chmod a+x /tmp/mt
/tmp/mt
/jffs/etc/init.d/local.start

Для наглядности ниже привожу текст получившегося скрипта /tmp/mt:
#!/bin/sh
insmod usb_storage # Загружаем модули
insmod mbcache
insmod jbd
insmod ext2
insmod ext3
prt='sda1' # Это наш диск в процессах
n=1 # Это счётчик итераций
while [ $n -lt 90 ] ; do # Пытаемся замаунтить полторы минуты
if [ -z "$p" ] ; then # Если диск не найден драйверами
p=`grep "$prt" /proc/partitions | awk '{print $4}'` # Проверяем нет ли уже
else # Если диск найден - монтируем, а если смонтирован - выходим из цикла
grep -q "/dev/discs/disc0/part1" /proc/mounts && break
mount -t ext2 -o noatime /dev/discs/disc0/part1 /jffs
fi
let n+=1
sleep 1 # Ждём секунду
done
Проблема номер два: не всё хорошо с ключами на SSH.
Собственно - при подключении по ssh после reboot роутера было озвучено клиентом, что сертификат хоста поменялся и клиент отказывается соединяться в связи с утерей доверия. Анализ показал, что  в nvram не содержатся rsa ключи. Собственно - в этом форуме подобная тема обсасывалась, но в моем случае workaround не прошёл - ключ rsa для хоста все-равно не создавался. Тогда я пошёл иным путём - я создал свои собственные ключи, разместил их на jffs и в скрипте local.start просто останавливаю ssh, копирую новые ключи и запускаю ssh с новыми параметрами (замечу - с ключиком длиной 4096 ssh сессия открывается около 6-8 секунд так что если нет терпения - делайте ключик покороче).

dropbear.sh:

#!/bin/sh
case "$1" in
start)
rm /tmp/root/.ssh/ssh_host_rsa_key # Удаляем старые ключи
rm /tmp/root/.ssh/ssh_host_dss_key
cp /jffs/root/.ssh/dropbear_dss_host_key /tmp/root/.ssh/dropbear_dss_host_key # Копируем новые ключи
cp /jffs/root/.ssh/dropbear_rsa_host_key /tmp/root/.ssh/dropbear_rsa_host_key
dropbear -b /tmp/loginprompt -r /tmp/root/.ssh/dropbear_rsa_host_key -d /tmp/root/.ssh/dropbear_dss_host_key -p 22  -a # Запускаем dropbear с новыми ключами
;;
stop)
killall dropbear # Прибиваем dropbear процессы
n=1
while [ $n -lt 30 ] ; do # Ожидаем пока есть dropbear процессы, но не более 30 секунд 
p=`ps | grep "dropbear" | grep "ssh_host_rsa_key" | grep -v "grep" | awk '{print $5}'`
if [ -z "$p" ] ; then
break;
fi
let
n+=1
sleep # Спим секунду
done
;;
esac
фрагмент local.start:
#!/bin/sh
/jffs/etc/init.d/dropbear.sh stop # Останавливаем демона ssh
mount -t ext3 -o noatime /dev/discs/disc0/part4 /opt # Монтируем /opt
/jffs/etc/init.d/dropbear.sh start # Запускаем демона ssh
...

Ну и на последок:
Если у вас запущен transmission на порту 53024, то в скрипт для firewall нужно добавить строчку:
iptables -I INPUT -p tcp --dport 53024 -j ACCEPT
Если вам надоело, что ваш ssh долбят DDoS-ом или подбором пароля с какого-то (в моем случае тайваньского) сайта :), можно добавить что-то вроде :
iptables -I INPUT 2 -p tcp -s 219.87.138.0/24 --dport 22 -j DROP
Удачи...

четверг, 28 октября 2010 г.

Сколько держит батарейка iPhone 4G

Добрый день, господа.

Задался тут вопросом определить время жизни моего iPhone 4G в обычном режиме, т.е. регулярные звонки, доступ к почте, загрузка с AppStore, небольшой серфинг по инету и т.д.

В процессе эксплуатации в звонках я себя не ограничивал, было загружено одно приложение с Apple Store по EDGE и 2 по wi-fi. Общий Internet-трафик составил порядка
50Mb, включая web-серфинг, twitter, почту и т.д.

Телефон выключился, проработав 2 дня и 23 часа (минуты не уточнялись, но я вынул его из зарядки при уходе с работы в 18:00, а выключение произошло уже после 17:45, так что до машины я брёл без связи... ).
Вся подготовка и отсылка скриншотов съела 2-3% ( численное значение заряда упало на 3 % ) батарейки в связи с проблемой сети на момент отправки почты, так что - при желании - можно было перевалить и за трое суток.

Данные цифры были достигнуты на следующей конфигурации:
 
  • Включена телефония
  • Включена передача данных. 
  • Выключен 3G (включался во время серфинга по 3 раза в день и выключался после использования)
  • Постоянно включен wi-fi. Точки доступа wi-fi в зоне досягаемости были 18-20 часов в сутки. (Так сложилось, что в эти 3 дня я был только дома, на работе, в дороге и пару раз в магазине).



  • Производилась синхронизация семи почтовых ящиков (объем около 30-40 сообщений в день, некоторые с word и pdf документами, некоторые с картинками). Все прочитаны. Время синхронизации - каждые 30 минут плюс порядка 20-ти ручных синхронизаций. 
  • Push-нотификация была отключена. 
  • Игры не использовались 
  • Камерой было сделано 9 снимков 
  • Видео не использовалось.




  • Cохранено 7 скриншотов.
  • Отправлено 12 e-mail
  • Принято/отправлено 24 sms
  • MMS не использовались










Собственно - как-то так.

За сим прощаюсь с вами, спасибо за потраченное на прочтение данного отчёта время, всего наибестрегардейшего, Андрей.