LINUX.ORG.RU

Сообщения Olegymous

 

Отдебажить где именно произошла ошибка разыменования ссылки в perl

Предположим есть такой код (добавил нумерацию строк для наглядности)

1:  use strict;
2:
3:  my %a = (
4:     a => 12,
5:     b => '',
6:     x => { z => 22 },
7:     l => 'sd'
8:  );
9:
10: my %c = (
11:    f => 'test',
12:    b => $a{b}{c},
13:    g => $a{a},
14:    d => $a{x}{z},
15: );

он выдает такую ошибку: Can't use string ("") as a HASH ref while "strict refs" in use at /tmp/t.pl line 15. Из него совершенно неочевидно где именно произошла ошибка. Если структура %c будет ещё сложнее и длиннее, то поиск ошибки вообще превратится в боль. Можно ли как-то сделать, чтобы perl явно показал, что проблема в данном случае в $a{b}{c}?

 ,

Olegymous
()

Периодические проблемы TCP соединения на IP роутера изнутри локальной сети

Есть роутер на mips с Linux прошивкой

# uname -a
Linux MI-3 3.4.113 #1 Sat Sep 23 20:08:45 MSK 2017 mips GNU/Linux

Роутер имеет IP 192.168.1.1. Я добавил на интерфейс ещё несколько IP:

ip address add "192.168.1.2/24 dev br0
ip address add "192.168.1.3/24 dev br0
ip address add "192.168.1.4/24 dev br0
...

на каждый из этих IP забиндил nginx на определённом порту.

И вот теперь при попытке соединения на эти ip и порт nginx с устройства внутри сети то по одному IP, то по другому происходит либо ошибка соединения по таймауту, либо через n секунд соединение всё же происходит (на другие соединяется мгновенно). При этом во время затупа не получается соединиться на любой прослушиваемый порт на этом IP, а на те которые не слушаются получаю мгновенный connection refused. Сам nginx не при делах, т.к. если заменить его на простейший скрипт висящий на порту, то ничего не меняется, соединение до скрипта не доходит. Во время всего этого ip-шник нормально пингуется. Помимо этого во время когда одно устройство из сети не может соединиться с этим IP другое успешно соединяется. Спустя пару минут IP вновь становится доступен с устройства, с которого только что не получалось соединиться.

Выглядит так буд-то сам роутер блокирует соединения по IP на каком-то рандоме. Но никаких настроек iptables я не делал. Так выглядит выхлоп iptables на роутере сейчас:

# iptables -L -v -n 
Chain INPUT (policy ACCEPT 126K packets, 19M bytes)
 pkts bytes target     prot opt in     out     source               destination         
 560K  190M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT 44087 packets, 15M bytes)
 pkts bytes target     prot opt in     out     source               destination         
1392K  545M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT 1056K packets, 278M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain bfplimit (0 references)
 pkts bytes target     prot opt in     out     source               destination         

Chain logdrop (0 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            state INVALID,NEW LOG flags 6 level 4 prefix "DROP "
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain upnp (0 references)
 pkts bytes target     prot opt in     out     source               destination         

Chain vpnlist (0 references)
 pkts bytes target     prot opt in     out     source               destination

Так выглядит это в wireshark, когда достучаться до 192.168.1.2 так и не вышло: https://pasteboard.co/YNZOWqAgRmCP.png

И да, все попытки соединения происходят по Wi-Fi.

Что это может быть и как попытаться исправить?

 , ,

Olegymous
()

Bash цикл чтения из файла прерывается непонятным образом

Есть файл commands.sh

rabbitmqctl list_exchanges
echo "--------------------"
rabbitmqctl list_exchanges
echo "--------------------"

Затем я в cmd запускаю цикл

while read c; do eval "$c"; done < commands.sh

отрабатывает первый rabbitmqctl list_exchanges, а до echo уже дело не доходит. Это что за магия? Подобное наблюдается только с rabbitmqctl.

В оригинале мне нужно было удалить кучу очередей через rabbitmqctl delete_queue. Я сгенерировал несколько десятков строчек с этой командой с разными названиями очередей и вставил в терминал. Выполнилась только первая. Потом решил вот попробовать через такой цикл и выполняется тоже только первая. А вот bash commands.sh работает нормально.

 

Olegymous
()

Пикселизация на внешнем мониторе

Есть ноутбук Dell Vostro 5401, подключённый к внешнему монитору 21.5'' AOC i2276Vw через dvi-hdmi кабель. И если на экране ноута все изогнутые линии гладкие и приятные глазу, то на мониторе видны торчащие пиксели, образующие эти линии. Наблюдается как в шрифтах, так и в тех же видосах с youtube и иконках.

С другим предыдущим ноутом и этим же монитором не замечал такого эффекта, но перепроверю если он вернётся из ремонта. В предустановленной на ноуте винде эффект тот же. Я же работаю на Debian stable и kde.

Что это такое и лечится ли?

Сделал фото на телефон: Ноут Монитор

 ,

Olegymous
()

Вопрос по совместимости памяти

Имею такую motherboard в ноутбуке

$ sudo dmidecode -t 2                
# dmidecode 3.0
Getting SMBIOS data from sysfs.
SMBIOS 2.8 present.

Handle 0x0002, DMI type 2, 15 bytes
Base Board Information
        Manufacturer: Intel Corp.
        Product Name: WhiteTip Mountain1 Fab2
        Version: Fab2
        Serial Number: 1
        Asset Tag: Base Board Asset Tag
        Features:
                Board is a hosting board
                Board is replaceable
        Location In Chassis: Part Component
        Chassis Handle: 0x0003
        Type: Motherboard
        Contained Object Handles: 0

Сейчас установлена одна плашка памяти на 8гб (https://www.dns-shop.ru/product/17ffba1dfd973120/operativnaa-pamat-sodimm-kin...)

Смотрим кол-во поддерживаемой памяти

$ sudo dmidecode -t 16
# dmidecode 3.0
Getting SMBIOS data from sysfs.
SMBIOS 2.8 present.

Handle 0x0043, DMI type 16, 23 bytes
Physical Memory Array
        Location: System Board Or Motherboard
        Use: System Memory
        Error Correction Type: None
        Maximum Capacity: 16 GB
        Error Information Handle: Not Provided
        Number Of Devices: 2
$ sudo dmidecode -t 17
# dmidecode 3.0
Getting SMBIOS data from sysfs.
SMBIOS 2.8 present.

Handle 0x0044, DMI type 17, 34 bytes
Memory Device
        Array Handle: 0x0043
        Error Information Handle: Not Provided
        Total Width: 64 bits
        Data Width: 64 bits
        Size: 8192 MB
        Form Factor: SODIMM
        Set: None
        Locator: ChannelA-DIMM0
        Bank Locator: BANK 0
        Type: DDR3
        Type Detail: Synchronous
        Speed: 1600 MHz
        Manufacturer: Kingston
        Serial Number: 6918CC52
        Asset Tag: 9876543210
        Part Number: KHX1600C9S3L/8G   
        Rank: 2
        Configured Clock Speed: 1600 MHz

Handle 0x0045, DMI type 17, 34 bytes
Memory Device
        Array Handle: 0x0043
        Error Information Handle: Not Provided
        Total Width: Unknown
        Data Width: Unknown
        Size: No Module Installed
        Form Factor: DIMM
        Set: None
        Locator: ChannelB-DIMM0
        Bank Locator: BANK 2
        Type: Unknown
        Type Detail: None
        Speed: Unknown
        Manufacturer: Not Specified
        Serial Number: Not Specified
        Asset Tag: Not Specified
        Part Number: Not Specified
        Rank: Unknown
        Configured Clock Speed: Unknown

Пишет 16 гб и что якобы у меня есть два слота. Но при снятии крышки я вижу только один. Но желание увеличить до 16-ти гб есть. Вопрос: заработает ли этот модуль памяти от Crucial на 16 гб одной плашкой https://www.dns-shop.ru/product/6c46d0680d1c3330/operativnaa-pamat-sodimm-cru... ?

 

Olegymous
()

Apache и basic auth на fast cgi url

Веб приложение на perl запущено как fastcgi (mod_fcgid) под apache. Нужно на /admin сделать http авторизацию.

Пытаюсь так:

<Location "/admin">
        AuthType Basic
        AuthName "private area"
        AuthUserFile    /usr/local/apache/conf/.htpasswd
        Require         valid-user
        Order allow,deny
        Allow from all
</Location>

/usr/local/apache/conf/.htpasswd создал с помощью утилиты htpasswd.

Модуль тоже подгружен

apachectl -M | grep auth_basic
 auth_basic_module (static)

При этом в ответ на запрос /admin такие заголовки

HTTP/1.1 200 OK
Server: Apache/2.4.18 (Unix) OpenSSL/1.0.1e-fips mod_bwlimited/1.4 mod_fcgid/2.3.9
WWW-Authenticate: Basic realm="private area"
Content-Length: 7292
Connection: close
Content-Type: text/html; charset=utf-8

и страница админки как есть. В браузере админка отображается без всяких запросов паролей.

Что я делаю не так? Можно ли добавить http авторизацию средствами apache?

 ,

Olegymous
()

На флешке с ext2 меньше места, чем на ней же с fat32

Есть флешка офторматированная в винде в fat32.

$ df
Файловая система 1K-блоков Использовано Доступно Использовано% Cмонтировано в
/dev/sdc1         15662080            8 15662072            1% /media/oleg/90CD-2417

Форматирую под debian в ext2: mkfs.ext2 /dev/sdc

$ df
Файловая система 1K-блоков Использовано Доступно Использовано% Cмонтировано в
/dev/sdc          15433168        38264 14610932            1% /media/oleg/2a77fb10-05b1-4156-ba90-a38e237202b7

Куда пропал 1 гб места?

 , ,

Olegymous
()

Разделяемая библиотека и thread safety

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

#include <pthread.h>
#include <assert.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void *_thread(void *arg) {
	int i;
	struct addrinfo *res;
	
	for (i=0; i<1; i++) {
		if (getaddrinfo("localhost", NULL, NULL, &res) == 0) {
			if (res) freeaddrinfo(res);
		}
	}
	
	pthread_mutex_lock(&mutex);
	printf("Just another thread message!\n");
	pthread_mutex_unlock(&mutex);
	
	return NULL;
}

void make_thread() {
	pthread_t tid[10];
	int i, rc;
	
	for (i=0; i<10; i++) {
		rc = pthread_create(&tid[i], NULL, _thread, NULL);
		assert(rc == 0);
	}
	
	void *rv;
	for (i=0; i<10; i++) {
		rc = pthread_join(tid[i], &rv);
		assert(rc == 0);
	}
}

И такая главная программа, которая использует библиотеку

#include <stdio.h>
#include <dlfcn.h>
#include <netdb.h>

int main() {
	void *mylib_hdl;
	void (*make_thread)();
	
	mylib_hdl = dlopen("./libmy.so", RTLD_NOW|RTLD_GLOBAL);
	if (mylib_hdl == NULL) {
		printf("dlopen: %s\n", dlerror());
		return 1;
	}
	
	make_thread = (void (*)()) dlsym(mylib_hdl, "make_thread");
	if (make_thread == NULL) {
		printf("dlsym: %s\n", dlerror());
		return 1;
	}
	
	(*make_thread)();
	return 0;
}

И такой Makefile

all:
	cc -pthread -g -fPIC -c mylib.c
	cc -pthread -g -shared -o libmy.so mylib.o
	cc -g -o main main.c -ldl

clean:
	rm *.o *.so main

Заметьте главная программа скомпилирована без линковки с pthread, но при этом всё работает хорошо за счёт флага RTLD_GLOBAL для dlopen(). Если оставить только RTLD_NOW то будут сегфолты, т.к. внутри нашей библиотеки будут использованы не потокобезопасные версии функций libc, загруженные главной программой.

Но теперь поменяем главную программу немного

#include <stdio.h>
#include <dlfcn.h>
#include <netdb.h>

int main() {
	void *mylib_hdl;
	void (*make_thread)();
	
	struct protoent *proto = getprotobyname("tcp");
	
	mylib_hdl = dlopen("./libmy.so", RTLD_NOW|RTLD_GLOBAL);
	if (mylib_hdl == NULL) {
		printf("dlopen: %s\n", dlerror());
		return 1;
	}
	
	make_thread = (void (*)()) dlsym(mylib_hdl, "make_thread");
	if (make_thread == NULL) {
		printf("dlsym: %s\n", dlerror());
		return 1;
	}
	
	(*make_thread)();
	return 0;
}

В главной программе появился вызов getprotobyname() и теперь флаг RTLD_GLOBAL не помогает. В программу приходит сегфолт.

Как я понял этот вызов окончательно и безповоротно подгрузил непотокобезопасную часть libc и внутри библиотеки уже нет возможности использовать потокобезопасную версию.

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

 ,

Olegymous
()

socketpair() создаёт сокет с непустым буфером

Собственно subj. В программе активно используется системный вызов socketpair(), в один ужасный момент socketpair() создаёт сокет, в котором уже есть какие-то данные. Естественно на данные в этом сокете завязана некоторая логика, которая никак не ожидает получить оттуда, то что во второй конец не отправляли. В этой же программе активно используется вызов getaddrinfo(). И такое ощущение, что в качестве непридвиденных данных в сокете от socketpair() оказывается то, что писал в свой сокет getaddrinfo(). В частности там виден домен (без точки) и еще несколько нечитаемых байт. Гарантированно, что в этот сокет пишу не я.

Гарантирует ли вообще socketpair(), что буфер вновь созданных сокетов будет пустым? Может ли баг в программе вызвать такое поведение (если учесть что записи этих данных в сокет точно не производится), например из-за повреждения памяти?

 

Olegymous
()

Простая реализация map int -> *ptr

Потребовалась, значит, такая структура данных, отобржающая int в указатель. Для pure C. Значений в среднем предполагается от 0 до 1000. Требуются операции добавления, удаления и получения по ключу int указателя.
Что можете порекомандовать, чтобы относительно быстро и несложно в реализации? Ну или может готовое что-то есть небольшое, однофайловое?

 ,

Olegymous
()

Создать дескриптор недоступный для записи

Как создать дескриптор, натравливая на который select(), select() будет сообщать, что дескриптор не готов для записи? Можно конечно создать неблокирующий сокет и сделать connect() на какой-нибудь хост и порт куда коннект не идёт (google.com:81), но это немного костыльно. Может есть какое-то устройство в /dev/ с таким свойством? Хотя неплохо бы какое-то портабельное решение nix/windows.

 

Olegymous
()

Инициализация переменной, до передачи в родительский конструктор

Есть такой класс

class PerlFunctionData : public PerlObjectData {
private:
    SV *rv;
    Local<Value> thisWrapped;

public:
    PerlFunctionData(V8Context* context_, SV *cv)
        : thisWrapped(External::Wrap(this)), PerlObjectData(
              context_,
              Handle<Object>::Cast(
                  context_->make_function->Call(
                      context_->context->Global(),
                      1,
                      &thisWrapped
                  )
              ),
              cv
          )
       , rv(cv ? newRV_noinc(cv) : NULL)
    { }
};
Возникает вопрос: передастся ли в context_->make_function->Call() уже инициализированная переменная thisWrapped или нет? По моим наблюдениям передаётся неинициализированная. Есть ли способ инициализировать её не меняя родительский класс?

Изначально было такое
context_->make_function->Call(
    context_->context->Global(),
    1,
    &External::Wrap(this)
)
Но компилятор ругается, что брать адрес временной переменной нельзя.

 

Olegymous
()

for ArrayList и thread safety в Java

Скажем есть такой класс

class Test {
	private ArrayList<String> mList;
	
	Test() {
		mList = new ArrayList<String>();
		mList.add("Foo");
		mList.add("Bar");
		mList.add("Baz");
	}
	
	public ArrayList<String> search(String what) {
		ArrayList<String> res = new ArrayList<String>();
		
		for (String str : mList) {
			if (str.indexOf(what) != -1) {
				res.add(str);
			}
		}
		
		return res;
	}
}

Является ли метод search() потокобезопасным? А именно беспокоит одновременное итерирование по mList из разных потоков. Является ли эта операция безовасной при учёте того, что модификации mList не производится во время итерирования?

 

Olegymous
()

ipv6 и bind address

Имею такой выхлоп ifconfig на сервере

eth0      Link encap:Ethernet  HWaddr 00:16:3e:c4:39:48  
          inet addr:38.109.219.15  Bcast:38.109.219.255  Mask:255.255.255.0
          inet6 addr: fe80::216:3eff:fec4:3948/64 Scope:Link
          inet6 addr: 2605:6f00:877::5a76:9e62/128 Scope:Global
          inet6 addr: 2605:6f00:877::2782:9ba2/128 Scope:Global
          inet6 addr: 2605:6f00:877::6e0f:b383/128 Scope:Global
          inet6 addr: 2605:6f00:877::ac2d:917f/128 Scope:Global
          inet6 addr: 2605:6f00:877::19e7:78b0/64 Scope:Global
          inet6 addr: 2605:6f00:877::a318:36c2/128 Scope:Global
          inet6 addr: 2605:6f00:877::fcfe:8540/128 Scope:Global
          inet6 addr: 2605:6f00:877::4bd:94b1/128 Scope:Global
          inet6 addr: 2605:6f00:877::606:db80/128 Scope:Global
          inet6 addr: 2605:6f00:877::fa97:8fd4/128 Scope:Global

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

wget http://whatismyv6.com/ -O- --bind-address=2605:6f00:877::fa97:8fd4
Только те что указаны здесь с препиской Scope:Global или еще пачка как-то вычисляется?

 

Olegymous
()

SIGPIPE и write() на сокетах

Есть приложение (а точнее модуль), которое открывает tcp сокет и затем чередует запись и чтение из сокета. Есть ненулевая вероятность, что на той стороне в любой момент сокет может быть закрыт, соответственно при очередном write() есть вероятность получить sigpipe. Понятно что на sigpipe можно поставить обработчик или заигнорить его, но делать так в модуле плохо, потому как обработчик глобальный. Можно заюзать send() вместо write() с параметром MSG_NOSIGNAL. Кстати, насколько это переносимо?
А есть ли способы, оставив write() и не делая глобавльный обработчик, гарантировать, что приложение не свалится от SIGPIPE?
Схема работы такая:

  • открыть сокет
  • запись
  • чтение
  • запись
  • чтение
    ...

 ,

Olegymous
()

Perl разработчик, возможно начинающий (Новосибирск)

Ищем перловика или человека готового изучить Perl (но хорошо владеющего любым другим ЯП). Из задач в основном обработка текста (много регулярных выражений), но также есть задачки из разряда network programming и немного веба.

Офис находится в Новосибирске, в 5 минутах от метро пл. Маркса.
Информацию о себе и вопросы можно присылать на o.gavrin<>2gis.ru

 ,

Olegymous
()

Постоянное GPS соединение при низком заряде батареи на Android

Заметил на своем телефоне, что при низком заряде батареи (меньше половины, или около того) GPS работает с перерывами. Используется приложение записывающее трек и вместо того чтобы держать GPS соединение постоянным оно где-то раз в 30 секунд определяет местоположение и тут же выключает GPS. Соответственно трек получается не очень точным. Такое же поведение в гугл-картах и паре других приложений. Единственное из тех, что пробовал нормально работает в Яндекс-картах, т.е. GPS соединение не обрывается.
Это известная фича или сталкивался кто-нибудь еще? И возможно ли пофиксить?
Android 2.3.5

 ,

Olegymous
()

Кастомизация QWebInspector

Есть ли способы для допиливания QWebInspector под свои нужды? Например хотелось бы добавить кнопочку для раскрытия всех узлов при просмотре DOM дерева. Интерфейс описанный в документации какой-то скудный, похоже с его помощью мало что можно сделать.

 qwebkit

Olegymous
()

Узнать сетевой интерфейс через который произойдет обращение к хосту

Есть ли утилита для сабжа? Что-нибудь типа

$ routeface 10.10.1.2
eth1
Или придётся парсить выхлоп /sbin/route и производить вычисления?

Olegymous
()

[Qt] подскажите виджет

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

Какой из встроенных виджетов лучше подойдет для реализациии или может есть нечто готовое?

 

Olegymous
()

RSS подписка на новые темы