Blog

Main posts for this site

Решение проблемы медленого wifi на Ubuntu

Category: howto

Симптомы проблемы: в 11.04 При подключении к инетернету медленно или вообше не работает соединение, при этом выделяется IP и с виду все должно быть нормально и без ошибок.

Решение: Убрать режим 11n

sudo modprobe iwlagn 11n_disable=1

gksudo gedit /etc/modprobe.d/iwlagn-disable11n.conf

options iwlagn 11n_disable=1

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

sudo modprobe iwlwifi 11n_disable=1

gksudo gedit /etc/modprobe.d/iwlagn-disable11n.conf

options iwlwifi 11n_disable=1

Кроме того для некоторых срабатывает решение:

в файле /etc/nsswitch.conf

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

заменить на

hosts:          files dns

Mongohub клиент для mongodb

Category: tools

Клиент под OSX для MongoDB - MongoHub

MongoHub logo

MongoHub это менеджер mongo баз данных. Он позволяет полностью управлять базами и структурами
mongo.

  • Нативное приложение на Cocoa
  • Прямой доступ как к локальным так и удаленным узлам mongo
  • Открытй код можно найти на github

Ниже немного скринов, ну и ссылка на офф сайт чуть выше

Perl one liner

Category: dev
perl -ne 'm/^([^#][^\s=]+)\s*(=.*|)/ && printf("%-35s%s\n", $1, $2)'
#postgresql

PostgreSQL recursive procedure

Category: howto
WITH RECURSIVE supplytree AS
 
(SELECT id, username, parent_user_id, CAST(username AS VARCHAR(1000)) AS username_fullname
FROM users
WHERE parent_user_id =1 
UNION ALL
SELECT si.id, si.username,
        si.parent_user_id,
        CAST(sp.username_fullname || '->' || si.username AS VARCHAR(1000)) AS username_fullname
FROM users AS si
        INNER JOIN supplytree AS sp
        ON (si.parent_user_id = sp.id)
)
SELECT id, username_fullname
FROM supplytree
ORDER BY username_fullname;

На выходе получим:

 id | username 
 1  | user1
 2  | user1->user2
 3  | user1->user2->user3
 4  | user1->user2
#python, #math

Python differential

Category: dev
#!/usr/bin/python  from scipy import linspace, array from scipy.integrate import odeint,ode from pylab import plot, show import matplotlib.pyplot as plt from numpy import arange import random as rand def dotu(r,t0): x,y = r d = [0,1] d[0] = y d[1] = x-x**2-y return d def dplot(s, color="green"): t = linspace(0,55, 700) print t u=odeint(dotu,s,t) u=array(u).transpose() plot(u[0], u[1], color) for x in arange(-1.52,2, 0.25): print x dplot([x,3]) plt.grid(True) show()

Дифференциальные исчесления в python реализовываются с помощью библиотек:

http://www.scipy.org/
http://ru.wikipedia.org/wiki/SciPy

http://numpy.scipy.org/
http://ru.wikipedia.org/wiki/NumPy

Графки рисуются с помощью http://matplotlib.sourceforge.net/

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

Все баги к этому моменту починили...

Antitrust - спецэффекты в фильмах про программистов

Category: review

Все наверно смотрели этот фильм Antitrust, в русской локализации "Программист", дык вот в этом фильме главный герой Майло Хоффман (Milo Hoffman) со своими друзьями по сюжету весь фильм пытается скомпилировать пример из документации по Java на сайте Sun : WebServer.java именно этот файл фигурирует в сценах с монитором. Снимки и продолжение под катом...

Скриншоты кода - три разных сцены

void listDirectory(File dir, PrintStream ps) throws IOException {
        ps.println("
\n");
        ps.println("Parent Directory
\n");
        String[] list = dir.list();
        for (int i = 0; list != null && i < list.length; i++) {
            File f = new File(dir, list[i]);
            if (f.isDirectory()) {
                ps.println(""+list[i]+"/
");
            } else {
                ps.println(""+list[i]+"


" + (new Date()) + "");
    }



 /* are we doing a GET or just a HEAD */
            boolean doingGet;
            /* beginning of file name */
            int index;
            if (buf[0] == (byte)'G' &&
                buf[1] == (byte)'E' &&
                buf[2] == (byte)'T' &&
                buf[3] == (byte)' ') {
                doingGet = true;
                index = 4;
            } else if (buf[0] == (byte)'H' &&
                       buf[1] == (byte)'E' &&
                       buf[2] == (byte)'A' &&
                       buf[3] == (byte)'D' &&
                       buf[4] == (byte)' ') {
                doingGet = false;
                index = 5;
            } else {
                /* we don't support this method */
                ps.print("HTTP/1.0 " + HTTP_BAD_METHOD +
                           " unsupported method type: ");
                ps.write(buf, 0, 5);
                ps.write(EOL);
                ps.flush();
                s.close();
                return;
            }



Обьяснения под катом

Shorewall - фреймворк для построения фаерволла

Category: tools

Настройка роутинга с двумя провайдерами через shorewall. И так дано машинароутер с установленным shorewall, задача сделать на ней 2 канала. Немного о самом shorewall, - это такой framework для работы c iptables, если вам надоелj вручную писать правила, то этот инструмент решит почти все ваши проблемы.

Конфигурация shorewall

	$ ls /etc/shorewall
	  
	|-- Makefile
	|-- README.txt
	|-- accounting
	|-- actions
	|-- blacklist
	|-- capabilities
	|-- continue
	|-- ecn
	|-- hosts
	|-- init
	|-- initdone
	|-- interfaces
	|-- ipsec
	|-- ipsecvpn
	|-- maclist
	|-- masq
	|-- modules
	|-- nat
	|-- netmap
	|-- params
	|-- policy
	|-- providers
	|-- proxyarp
	|-- route_rules
	|-- routestopped
	|-- rules
	|-- shorewall.conf
	|-- start
	|-- started
	|-- stop
	|-- stopped
	|-- tcclasses
	|-- tcdevices
	|-- tcrules
	|-- tos
	|-- tunnel
	|-- tunnels
	`-- zones

Продолжение внутри …

#linux, #dev

Архитектура moskva.com

Category: legacy

Проект москва.ком представял из себя главный городской портал Москвы. С посещамостью 100к-300к хостов в день.

Используемые технологии Debian Linux (etch), Nginx 0.4-0.6, Apache 2.X, PHP 5, MySQL 5.0, Memcache, Xdebug, DRBD.

Теперь по порядку

Изначально сайт работал на 3-х серверах, каждый из которых выполнял свою роль, frontend, backend, database + backups, для организации fail-over решения, этого было недостаточно, точнее fail-over решение вообше отсутствовало в каком либо виде. По скольку планировалось обслуживать большой трафик посетителей, было решено пересмотреть мощности и реализовать highload и failover систему.

Hardware

Было приобретено:

  • 2 x Dell SC1435 (2 x Duo Core AMD 2200Mhz / 2GB RAM / 70GB SATA) Спецификация
  • 4 x Dell PowerEdgeTM 2950 (4 x Core Duo Intel(R) Xeon(TM) MP CPU 3.16GHz / 16GB RAM / 300GB SCSI) Спецификация
  • 2 x SuperMicro (4 x Intel(R) Xeon(R) CPU 5130 @ 2.00GHz / 3GB RAM / 16 x 750GB SCSI Дисков + RAID 50 / 60 )

  • 2 x KVM ALTUSEN 16 ports
  • 2 x POWER CONTROL ALTUSEN 16 ports

Всего получилось 10 серверов и еще один маршрутизатор cisco express 500, и все это железо предстояло подключить и настроить. подробнее об этом дальше.

Highload n Failover

10 делились на 3 логические группы (уровни):

На каждом уровне было как минимум 2 сервере, для обеспечения отказоустойчивости 99,9% (3 уровень отказоустойчивости)

1. Уровень Loadbalance и статический контент

Это балансировщик нагрузки, в качестве которого выступал nginx(тогда еще версии 0.3) и failover демон heartbeat который следил за серверами и в случае отказа, переключал нагрузку на доступный сервер.

2. Уровень Backend workers and database

На этом уровене было 4 сервера. 2 из которых были чистыми application серверами на apache для php, и принимали запросы только с первого уровня. 2 другие сервера это Mysql база данных с Master-Slave репликацией и резервным копированием со...

Установока linux на Palm LD(Life Drive)

Category: howto

Необходимые файлы

Загрузчик CocoBoot

Образ rootfs с OPIE

Замечание

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

Swap file

Важно Чтобы не качать пустой swap файл размером 90 мегобайт, почему бы не сделать его самомy

# dd if=/dev/zero of=swap bs=1k count=96k # mkswap swap

Конфиг ядра

Там две строчки:

SWAP_DEV=$FILES_MNT/swap ROOT_DEV=$FILES_MNT/opie-image-v0.8.4-palmld.rootfs.ext2
Расположение swap файла и rootfs соответсвенно, от корневой директории.

Процесс установки

1)Включаем на Palm'e Drive Mode, и монтируем диск,

# mount /dev/sda1 /mnt/palm
Копируем файлы swap, linux.boot.cfg, и opie-image-v0.8.4-palmld.rootfs.ext2 в корень palm диска, демонтируем устройство и запускаем CocoBoot на palm'e. Жмём естественно Boot.

Получаем следущую картину:

Загружается ядро... и далее графическая оболочка OPIE:

Всё установлено и готово к использованию, на момент написания статьи доступна новая сборка linux для Palm LD

http://builds.hackndev.com/builds/Marex/TP1-20070717.tar.bz2
Подробнее о OPIE http://opie.handhelds.org/cgi-bin/moin.cgi/News


cat /proc/cpuinfo

Модули ядра

PIM

Тесты системы

Рабочий стол настроек

OpieMediaPlayer
- музыка так и незаиграла

root shell

Итоги

Итоги видны табличке номер один на в начале статьи Система работает стабильно - непадает, segfault'ов ненаблюдалось. Собственно есть всё тоже самое что и в стандартной PalmOS, единственную проблему которую я вижу это мало софта, во остальном всё готово к употреблению.


Ссылки по...