IT Образование

IT – это круто. by SimpleCode

Хотите научится программировать на языке ассемблера, но возникают трудности с компиляцией кода и с отладкой? Не знаете как начать? Попробуйте установить SimpleASM – удобный и легкий IDE для ассемблера.

SimpleASM

SimpleASM

Основные фишки:

  • Компиляция (Intel x86 tasm)
  • Разделение по проектам
  • Отладка
  • Информация о той или иной команде
  • Переносимость
    • Linux (x86 and x64)
    • Windows XP, 7, 8 (x86 and x64)
    • Mac OS
  • Open Source

В новых версиях будут добавлены:

  • Поддержка многих компиляторов
    • TASM
    • MASM
    • GAS
  • Поддержка языков
  • Поддержка сетевого контроля
  • Мультифайловые проекты
  • и другое

Скачать

Исходники на github: http://github.com/daffbit/simpleasm

Установка на Windows: http://goo.gl/NmTj3l

 

 

В этой статье напишем простой сервер, который получает целое число, а в ответ отправляет квадрат. И соответственно напишем клиент для этого сервера.

Что нам понадобится

  • GNU/Linux дистрибутив – любой (Арх Линукс на пример)
  • Компилятор – любой (я использовал G++)
  • Дополнительно другая машина для межсетевого тестирования
Клиент-Серверный сокет

Клиент-Серверный сокет

Разъяснения приведены в виде комментариев.
(Для дополнительной информации о функциях используйте man-pages Пример man 2 socket)

Для начала Сервер

 

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <cstdlib>
#include <cstring>
#include <cerrno>
using namespace std;

int main(){
   // порт для соединения
   int serverPort = 15679;
   // файловый дескриптор для сервера
   int serverFd;
   // файловый дескриптор для клиента
   int clientFd;
   // структура для хранения информации о сервере
   struct sockaddr_in serverAddr;

   /* initialize sockaddr_in */
   // инициализировать все байты в 0
   memset(&serverAddr, 0, sizeof(serverAddr));
   // домен соединения 
   serverAddr.sin_family = AF_INET; // ip v4
   // с какого адреса принимать (с лябого в данном случае)
   serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); // listen from all addresses
   // порт для приложения
   serverAddr.sin_port = htons(serverPort);

   /* creatig server socket */
   // создать серверный сокет
   serverFd = socket(AF_INET, SOCK_STREAM, 0); // create TCP socket

   // проверка удачного выполнения
   if(serverFd == -1){
       cerr << strerror(errno) << endl;
       exit(errno);
   }
   cout << "Created server socket ... OK" << endl;

    // привязать сокет к структуре описанной выше
   if(bind(serverFd, (const sockaddr*) &serverAddr, sizeof(serverAddr)) == -1){
       cerr << strerror(errno) << endl;
       exit(errno);
   }

   cout << "Binded to any address ... OK" << endl;

   /* ожидать соединения */
   if(listen(serverFd, 0) == -1){
       cerr << strerror(errno) << endl;
       exit(errno);
   }

   /* создать сокет для соединявшийся адреса */
   clientFd = accept(serverFd, 0, 0);
   if(clientFd == -1){
       cerr << strerror(errno) << endl;
       exit(errno);
   }
   cout << "Created client socket ... OK" << endl;

   // буфер для чтения
   int readFromClient; // buffer for client's info
   while(true){
       /* получить данные с клиента */
       int reciveSize = recv(clientFd, &readFromClient, sizeof(int), 0);
       if(reciveSize == -1){
           cerr << strerror(errno) << endl;
           exit(errno);
       }
       else {
           /* если передан  0 завершить (можно пропустить)*/
           if(readFromClient == 0) {
               break;
           }
           cout << "Recived from client: " << readFromClient << endl;

           /* подсчитать n^2 */
           int toSend = readFromClient*readFromClient;

           /* отправить значение клиенту  */
           int sendSize = send(clientFd, &toSend, sizeof(int), 0);
           if(sendSize == -1){
               cerr << strerror(errno) << endl;
               exit(errno);
           }
           cout << "Sent: " << toSend << endl << endl;
       }
   }

   // закрыть клиента
   shutdown(clientFd, SHUT_RDWR);
   close(clientFd);

   // закрыть сервер
   shutdown(serverFd, SHUT_RDWR);
   close(serverFd);

   return 0;
}

 
 

Теперь напишем клиента

 
 

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <cstdlib>
#include <cstring>
#include <cerrno>
using namespace std;

int main(){
   // порт нужен такой же как и у сервера
   int serverPort = 15679;
   // нужен только один сокет 
   int clientFd;
   // структура для хранения информации о клиенте
   struct sockaddr_in serverAddr;

   /* initialize sockaddr_in */
   memset(&serverAddr, 0, sizeof(serverAddr));
   serverAddr.sin_family = AF_INET; // ip v4
   // в данном случае сервер расположен на той же машине,
   // что и сервер, но адрес можно изменить
   serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // connect to
   serverAddr.sin_port = htons(serverPort);

   /* создаем сокет клиента */
   clientFd = socket(AF_INET, SOCK_STREAM, 0); // create TCP socket

   // проверка
   if(clientFd == -1){
       cerr << strerror(errno) << endl;
       exit(errno);
   }
   cout << "Created client socket ... OK" << endl;



   /* соединить клиентский сокет с сервером */
   if(connect(clientFd, (sockaddr*) &serverAddr , sizeof(serverAddr)) == -1){
       cerr << strerror(errno) << endl;
       exit(errno);
   }
   cout << "Connecting to server ... OK" << endl;

   // буфер для отправки
   int toSend; 
   while(true){
       cout << "Enter n (0 for exit): ";
       cin >> toSend; // ввод числа 
       // при значении 0 закрыть клиента
       if(toSend == 0)
           break;


       /* отправка числа для подсчета квадрата */
       int sendSize = send(clientFd, &toSend, sizeof(int), 0);
       // проверка
       if(sendSize == -1){
           cerr << strerror(errno) << endl;
           exit(errno);
       }
       cout << "Sent ... OK" << endl;

       /* буфер для чтения */
       int recivedData;
       // чтение в буфер
       int reciveSize = recv(clientFd, &recivedData,sizeof(int), 0);
       // проверка
       if(reciveSize == -1){
           cerr << strerror(errno) << endl;
           exit(errno);
       }
       // напечатать ответ
       cout << "N^2: " << recivedData << endl << endl;
   }

   // закрыть клиентский сокет
   shutdown(clientFd, SHUT_RDWR);
   close(clientFd);

   return 0;
}

Осталось скомпилировать из запустить
Выполним команды
g++ server.cpp -o server
g++ client.cpp -o client

Заметим, что надо запустить сервер, а потом клиента(ов).

Для более наглядного просмотра откройте два разных терминала.
В первом напишите ./server, а во втором ./client

Удачи!

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

Статья не представляет из себя полное сравнение разных аспектов двух ОС, а лишь показывает время выполнения одного и того же кода на двух системах, поставленных на одной и той же машине.

Положим есть код на c++, который выводит на экран консоли числа от 1 до 1 000 000. Нет ничего примитивнее – скажете вы. Для подсчета выполнения будем использовать стандартную библиотеку С++ (ctime).

Лично я тестировал на:

Samsung N145p, 2 GB RAM, Intel Atom

Linux: Ubuntu 13.04 (g++ no IDE)

Windows: Windows 8 (g++ MinGW no IDE)

Linux VS. Windows

 

Да да. Именно. Это не опечатка, не ошибка, не жульничество.

Выполнено на Windows: 569.918s

Выполнено на Linux: 1.15s

 

В итоге Линукс справился примерно 560 рас быстрее. Напоминаем, что это субъективный тест, но все же, маленький плюс в пользу линукс.

Удачи, тестируйте сами.

 

#include <iostream>
#include <ctime>
using namespace std;
int main (){

	clock_t time;
	time = clock();
	for (int i = 0; i < 1000001; i++)
		cout << i << " ";
	time = clock() - time;	

		cout << endl << ( (double) 
			time/CLOCKS_PER_SEC ) << endl;
	return 0;
}
Рубрики: C++, Linux [Ubuntu]

Статья написана в поддержку «Энциклопедии кино».

Для тех кто не знает - «Энциклопедии кино» представляет из себя веб ресурс на котором можно было найти кинофильмы, информацию об актеров, рейтинги и всякое, что нужно киноману. Фактический адрес ресурса - my-hit.ru.

My-hit

И так, ресурс закрыт. Вся информация (кинофильмы и т.д) была изъята сотрудниками МВД г. Киев.Казалось бы, очередное дело о закрытие пиратского ресурса, но не все так просто.

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

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

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

И вот недавно был замечен свет в конце тоннеля. Официальный пресс-релиз утверждает, что дело движется вперед, и в скором времени, возможно, ресурс восстановит работу.

Активисты уверены, данное дело только начало. В скором времени, будет закрыто много ресурсов,а некоторые будут внесены в реестр запрещенных сайтов.

Информационный портал PcLenta.ru, а также команда SimpleCode Development призывает не переставать требовать восстановления ресурса, и продолжать активно затрагивать эту тему, пока вся информация не будет возвращена.

 

 

Следите за страницей http://my-hit.ru/, чтобы узнать чем все закончится.

 

Рубрики: Новости

Если вы только начали пользоваться системами на ядре Linux (Ubuntu, Linux Mint, OpenSUSE, Debian) или на OS X (MAC), то скорее всего, вас заинтересует вопрос прокрутки страниц в обозревателе. 

Наверно, все заметили, что страницы, например, в Google Chrome не прокручиваются автоматически, то есть если нажать среднюю кнопку мыши и провести вверх-вниз ничего не произойдет.

Это крайне не удобно и надо эту проблему как-то решать.

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

 

AutoScroll

AutoScroll

 

Установите расширение из магазина по этой ссылке goo.gl/r9e86.

 

* Если у вас есть вопросы касательно системы Linux, в частности Ubuntu пишите в комментариях.

Недавно была задача написать программу для вычисления детерминанта матрицы. Для этого мне нужно было решить еще парочку задач одна из которых была построение всех перестановок. Алгоритм достаточно прост для применения, и, не смотря на то, что она предназначена для цифр, ее также можно применить для символов (составив массив из символов).

 

Алгоритм перестановок

Алгоритм перестановок

 

Будем рассматривать случай когда цифры от 1 до n лежат в массиве в порядке возрастания, в противном случае можно просто переставить с помощью переставить.

 

Предположим имеем числа 1234. Очевидно, что количество перестановок равно 4!=24. Если мы начнем просто переставлять всякие два элемента то будет огромное кол.-во повторений, которых не избежать.

Для этого сделаем так, чтобы каждая новая перестановка поэлементно была больше предыдущего. К примеру для 1234 следующий будет 1243 и так далее.

 

Алгоритм

1. Выберем число начиная с конца, элемент где нарушается порядок убывания. То есть для 12345 выберем 4, а для 12354 выберем 3 (точнее индекс i где а[i]=3). Назначим индекс этого элемента m.

2. Выберем наименьшее число после m-ой. Например 12354 m=2 (начинается с нуля) после 2-ого элемента наименьшее число 4, у которого индекс равен 4 (k=4).

3. Меняем местами m-ый  и k-ый элемент.

4. Осталось упорядочить все элементы после m-ого по возрастанию (поскольку они упорядочены по убывания, надо просто повернуть их).

 

Пример

a[4] = {1,2,3,4}, m=2 (a[m]=3), k=3 (a[k]=4). Меняем местами a[m] и a[k]. Получилось {1,2,4,3} и поскольку после m-ого элемента только один элемент повернуть ничего не нужно.

a[4] = {1,2,4,3}, m=1 (a[m] = 2), k=3 (a[k]=3). Меняем местами a[m] и a[k]. Получилось {1,3,4,2}, перевернем все после m-ого индекса получим {1,3,2,4}. И так далее.

 

Решение на C++

Функции для использования

 

#include <iostream> // библиотека ввод/вывод
using namespace std; // именная зона std
int fac(int a) // функция факториала (нужно для подсчета кол.-во перестановок)
{
if(a==1) return 1; 
return a*fac(a-1);
 }

void swap(int *a,int i,int j) // функция для того, чтобы переставить элементы с индексами i и j в массиве a;
{
int t;
t = a[i];
a[i]=a[j];a[j]=t;
}

int get_m(int *a,int N) // функция выбора m, где m индекс первого с конца элемента,
// с которого нарушается порядок убывания
{
int i;
for(i=N-1; i>=1; i--) 
        if(a[i]>a[i-1]) 
             return i-1;  
return 0; }

int get_k(int *a, int fixed_m, short N) // Найти k, где k индекс наименьшего элемента после m-ого. 
{
int temp_index = fixed_m+1;
for (int i=fixed_m+1;i<;N;i++)
        if(a[i]<a[temp_index] && a[i]>a[fixed_m]) temp_index=i;
return temp_index;
}

Тело программы

 

int main()
{
int n, i, j, m,k, temp, kol_vo;
cin >> n; // ввод числа n (длина массива)
kol_vo = fac(n); // кол.-во перестановок
short *c = new short[n]; // массив для хранения перестановок
for(i=0;i<n;i++) c[i]=i+1; // заполнение от 1 до n

for(i = 0; i<kol_vo;i++)
{
	for(j=0;j<n;j++)cout << c[j] << " "; // вывод нынешнюю перестановку на экарн
	cout << endl; // новая строка
m = get_m(c, n); // выбор m
k=get_k(c,m, n); // выбор k
swap(c, m, k); // переставить a[m] и a[k]
if(n-1-m > 1) // если после m-ого есть более 1 элемента
for(short j=0;j<(n-m-1)/2;j++) // перевернуть 
{
tt = c[m+1+j];
c[m+1+j]=c[n-1-j];
c[n-1-j]=tt;
} 

}

delete [] c;   // очистить память 
system("pause"); // задержка экрана
return 0; // выход из программы
}

Примечание

Если имеется символьная строка то можно просто создать массив для индексов например index[] и работать с ним так c[index[i]].

Если что-то было не понятно или вы где-то обнаружили ошибку - пишите комментарий.

На новом сайте pclenta.ru открыта рубрика ([Code]) статей по программированию. В рубрике найдете как уроки для новиков, так и серьезно написанные коды из разных программ и приложений.
Задача: Ввести число и программно определить является ли введенное число числом Фибоначчи.

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

Задачи по C++

Задачи по C++

 

Решение на C++:


#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int number,prev1, prev2, summ, stop;
cin >> number;
int prev1 = 1;
int prev2 = 2;
while(prev2 < number)
{
summ = prev1 + prev2;
prev1 = prev2;
prev2 = summ;
}
if(prev1+prev2 == number) cout << "YES" << endl;
else cout << "NO" << endl;
cin >> stop;
return 0;
}

Первые несколько строк не нуждаются в комментириях.

#include "stdafx.h" //в новых версиях Visual Studio (Win32 Console)
#include <iostream> //библиотека ввода/вывода
using namespace std; //именная зона std
int main() {} //точка входа в приложение
int number,prev1, prev2, summ, stop; // необходимые переменные
// вводимое число (number), первый/второй член последовательности (prev1/prev2)
// сумма двух предыдущих членов (stop)
// stop - чтобы заставить приложение не закрыватся

Для начала введем число командой cin:

 cin >> number; 

Присвоем переменным prev1 и prev2 начальные значения:

 
int prev1 = 1;
int prev2 = 2;
 

Чтобы получить кождый следующий член сумма двух предыдущих тоесть чтобы узнать является ли наше число членом последовательности нужно получить каждый член пока последний не превысит наше число:

 

while(prev2 < number) // цикл работает пока prev2 меньше number 
{
summ = prev1 + prev2; // переменной summ присвоить сумму prev1 и prev2
prev1 = prev2; //prev1 присвоить значение следующего члена (prev2)
prev2 = summ; // prev2 присвоить значение summ
}

Теперь проверим результат:

 
if(prev1+prev2 == number) cout << "YES" << endl; // Если да вывести YES
else cout << "NO" << endl; //или же вывести NO
//теперь вводим перепенную stop, чтобы не дать программе закрытся
cin >> stop;
return 0;

[Crex] Chrome Remote Desktop в alpha режиме.

admin в Октябрь - 30 - 2012

После года ожиданий, наконец, разработчики Google доделали дополнение к браузеру Chrome под названием Chrome Remote Desktop. Как можно догадаться из названия дополнение может удаленно управлять компьютерами, к которым открыт доступ. Конечно, на платформе Windows есть много альтернатив данного приложения, например Team Viewer, Radmin Viewer и т.д., но на платформе приложений Chromium оно единственное в своем роде.

 

Приложение, конечно, работает и на девайсах на базе Chromium OS (Chrome OS), о чем сообщалось в официальном блоге компании.

 

 

Chrome Remote Desktop

Chrome Remote Desktop

 

Chrome Remote Desktop

Chrome Remote Desktop

Chrome Remote Desktop

Chrome Remote Desktop

Chrome Remote Desktop

Chrome Remote Desktop

 

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

 

Приложение, конечно, бесплатное.

Для установки зайдите в Chrome Webstore: http://goo.gl/X75ar

 

*Заметка: отметкой [Crex] (Chrome Extensions) будут отмечаться статьи посещенные приложением на платформе Chrome.

Первая статья в рубрике Интернет Компании [К #1]

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

Qnet (quest net) “лидирующая компания в своей сфере“, которая занимается прямыми продажами в сети и сетевым маркетингом. Сотрудники компании обычные люди, которые занимаются обычными продажами и получают за это много-много денег.

 

На самом деле все немного сложнее.

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

 

В чем заключается обман.

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

 

Большой заработок – иногда заработок может достигать до нескольких тысяч долларов, которые вы все равно не сможете снять с клиентского счета. Они будут утверждать, что вы можете вывести эти деньги через тот или иной банк, в котором вам откажут. Заработанные средства вы потратите на те продукты которые предлагает компания Qnet. В итоге получается, что сотрудники являются потенциальными покупателями, которые способны привлечь все больше покупателей.

 

Свободный график работы, которую вам гарантируют при поступлении на должность подразумевает 4-5 встреч в день плюс семинары (промывание мозгов и обучение методов продажи) которые длятся иногда по 5-7 часов.

 

Методы продажи которым вас научат

В основе продаж лежит самый простой метод “впаривания”, то есть игра с человеческими комплексами и использование желаний покупателя для убеждения надобности приобретения.

 

Все выше приведенные доводы основаны на обзорах бывших сотрудников и мнениях на сайтах которые составляют списки работодателей.

Чуть больше недели назад на конференции Google IO была представлена новая версия андроид Android 4.1 (Jelly Bean). Сейчас только некоторые устройства поддерживают эту версию ОС. Также планируется обновления для таких гигантов, как Samsung Galaxy S 2, Galaxy S3, по неофициальным данным Sony обновит линию Xperia до Android версии 4.1.

 

Jelly Bean

Jelly Bean

 

Но как же устройства с более слабыми параметрами, которые даже не получили обновление Ice Cream Sandwich (4.0)? Официального ответа на данный вопрос еще нет, но по данным некоторых источников, новые версии ОС для них останутся недоступны.

 

Таким образом владельцы ‘слабых’ смартфонов могут только надеется на неофициальные сборки новых версий андроид таких как CyanogenMod.

 

В Google Play уже много тем и ланчеров с обоями и значками Jelly Bean, которые вы можете установить и хоть как-то почувствовать красоту использования Android 4.1.

 

Одна из них Jelly Bean Go Theme, которая максимально похожа на настоящий. Ниже представлены скриншоты и ссылки для установки.

 

 

 

Тема предназначена для ланчера GO Launcher EX и GO Locker.

Ссылка на Google Play: http://goo.gl/oxILf

Ссылка на форум 4pda: http://goo.gl/9sGB4

Рубрики: Android