Поиск по этому блогу

понедельник, 31 августа 2009 г.

Как я MySQL-сервер на FreeBSD7.1 ставил

Как будто уже и не в первый раз на MySQL ставлю, а с таким еще не сталкивался.
Как обычно обновляю порты, захожу в порт с мускулом:

#cd /usr/ports/databases/mysql51-server

Далее как обычно:

#make

#make install

#mysql_install_db

Устанавливаю на базу юзера и группу как mysql:mysql

Пытаюсь стартануть сервер:

#/usr/local/etc/rc.d/mysql-server start

И пусто, нет привычной строки Starting mysql.

Запускаю клиент:

#mysql

И получаю:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

Тоесть сервер не запущен.

Аналогично себя повел и mysqltest:

# mysqltest
mysqltest: Could not open connection 'default' after 500 attempts: 2002 Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
not ok

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

Запускаю скрипт запуска MySQL, чтобы посмотреть на праметры:

# /usr/local/etc/rc.d/mysql-server
Usage: /usr/local/etc/rc.d/mysql-server [fast|force|one](start|stop|restart|rcvar|status|poll)
Заинтересовал параметр rcvar

Пробую:

# /usr/local/etc/rc.d/mysql-server rcvar
# mysql mysql_enable=NO

На всякий случай добавляю в /etc/rc.conf строку mysql_enable="YES"

Опять пробую:

# /usr/local/etc/rc.d/mysql-server rcvar

# mysql
mysql_enable=YES

Да, подтянуло параметр из /etc/rc.conf

После чего мистика :) - сервер запустился:

# /usr/local/etc/rc.d/mysql-server start
Starting mysql.

Как все просто оказалось на самом деле

понедельник, 3 августа 2009 г.

Преобразование числа в строку и обратно на C++ под Linux

По непонятной мне причине(или я ошибаюсь) в Linux отсутствует функция itoa - пробразование числа в строку,
хотя и реализована atoi - преобразование строки в число.
Для пробразования числа в строку рекомендутся использовать sprintf, как описано тут http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

/* sprintf example */
#include <stdlib.h>
int main ()
{
char buffer [50];
int n, a=5, b=3;
n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
printf ("[%s] is a %d char long string\n",buffer,n);
return 0;
}

Но мне этот метод не очень нравится из-за громоздкости и надобности помнить кучю параметров.
Поэтому для себя сделал простенький файл, из найденного на просторах инета:

(листинг stringconvert.h)

#ifndef _STRINGCONVERT_H
#define _STRINGCONVERT_H
#include <string>
#include <sstream>

template <typename T>
std::string toString(T val)
{
std::ostringstream oss;
oss<< val;
return oss.str();
}

template <typename T>
T fromString(const std::string& s)
{
std::istringstream iss(s);
T res;
iss >> res;
return res;
}

#endif /* _STRINGCONVERT_H */

А использовать его очень просто:

(листинг main.cpp)

#include <stdlib.h>
#include "stringconvert.h"
#include <string.h>
#include <iostream>
/*
*
*/
using namespace std;

int main(int argc, char** argv)
{
//convert numbers to string
int i = 1234;
float f = 1234.12;
double d = -345.67;

string s_i = toString(i);
string s_f = toString(f);
string s_d = toString(d);

//print numbers converted to strings
cout << "Integer to string: " << s_i << endl;
cout << "Float to string: " << s_f << endl;
cout << "Double to string: " << s_d << endl << endl;

//convert string to numbers

string s_ii = "456";
string s_ff = "456.678";
string s_dd = "-890.45";

int ii = fromString<int>(s_ii);
float ff = fromString<float>(s_ff);
double dd = fromString<double>(s_dd);

//print strings converted to numbers
cout << "String to integer: " << ii << endl;
cout << "String to float: " << ff << endl;
cout << "String to double: " << dd << endl;

return (EXIT_SUCCESS);
}

Вывод программы:

Integer to string: 1234
Float to string: 1234.12
Double to string: -345.67

String to integer: 456
String to float: 456.678
String to double: -890.45

Преобразование происходит при помощи шаблонов
функций(о том, что это такое можно глянуть тут http://programmersclub.ru/29/ )

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