Показаны сообщения с ярлыком программирование. Показать все сообщения
Показаны сообщения с ярлыком программирование. Показать все сообщения

среда, 18 декабря 2013 г.

Perl - сложение строк (конкатенация)

В языке Perl (5) для сложения строк используется оператор ".", то есть обычная точка.
Выглядит это так:
#!/usr/bin/perl

my $a = "Двадцать";
my $b = " негритят";
my $c = $a . $b;
print "$c\n";
                 

Результат следующий:
> perl test.pl
Двадцать негритят
Вот и всё, всё очень просто.

понедельник, 31 января 2011 г.

Python - генерация случайного числа с заданной вероятностью

Представим, что нам потребовалось создать на Питоне генератор случайных чисел, который выводит 1 или 0, причем 1 он выводит с вероятностью 0,2.
Это можно сделать следующим образом:
>>> import random
>>> for i in range(20):
...     x = random.random()
...     if x <= 0.2:
...             print 1
...     else:
...             print 0
...
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
Что мы здесь сделали?
Во первых, первой строкой подключили модуль random, затем сгенерировали случайное число с плавающей точкой в пределах от 0 до 1. В зависимости от того, меньше это число 0.2, или больше, мы вывели 1 или 0. Таким образом, задачу можно считать выполненной.

Python - сложение строк или конкатенация

В питоне складывать строки очень просто, вот примеры, из которых все понятно:
Пример №1
>>>print 'Привет! ' + 'Как дела?'
Привет! Как дела?
Пример №2
>>> a = 'Хорошо'
>>> b = ' А у тебя как?'
>>> c = a + b
>>> print c
Хорошо А у тебя как? 
Пример №3 (c преобразованием числа  в строку)
 >>> x = 12
>>> y = 6
>>> print '12 * 6 = '+str(x*y)
12 * 6 = 72

четверг, 4 ноября 2010 г.

И снова о Java: что такое footprint?

Разбирался в работе Java Garbage Collector'а, и столкнулся с понятием footprint. Так вот:
Footprint (или Memory Footprint) - это количество всей памяти, используемой и относящейся к процессу (программе)
. Подробнее можно почитать на английской википедии.

пятница, 23 июля 2010 г.

воскресенье, 27 июня 2010 г.

Разработка Flash под Linux (Debian & Ubuntu)

Встал тут передо мной вопрос, возможно ли писать программы на Flash (т.е. Action Script) под Linux. В моем случае линукс - это Debian. Как оказалось, можно.
Во-первых, надо скачать и установитьFlex SDK.
Для этого переходим по этой ссылке и скачиваем Open Source Flex SDK. Соглашаемся с Mozilla Public License и нажимаем по кнопке Download zip.
Распаковываем скачаннный архив в какую либо директорию. В моем случае это /tmp/flex:
$ 7z x flex_sdk_4.1.0.16076_mpl.zip -o/tmp/flex/
Готово, Flex скачан и установлен.
Во-вторых, создаем наше hello-world'ное flash приложение. Создаем файл hello.as и открываем его в любимом редакторе, например, в vim:
$ vim hello.as
Пишем в нем следующее:
package {
import flash.display.*;
import flash.text.*;
public class hello extends Sprite{
public function hello (){
var t:TextField = new TextField();
t.text = "hello actionscript 3";
t.width = 300;
t.height = 200;
t.x = 50;
t.y = 20;
addChild(t);
}
}
}
В-третьих, надо скомпилировать этот файл:
$ /tmp/flex/bin/mxmlc hello.as
В директории, в которой мы находимся, появится скомпилированный swf-файл hello.swf.
И наконец, открываем его в любимом бразуре, например, в Google Chrome:
$ google-chrome hello.swf
И наслаждаемся результатом:)

пятница, 4 июня 2010 г.

Ruby ч.3 Работа с объектами в Ruby

Продолжение этой статьи.
Итак, у нас уже объявлен класс Greeter. Посмотрим на него в действии:
irb(main):035:0> g = Greeter.new("Pat")
=> #
irb(main):036:0> g.say_hi
Hi Pat!
=> nil
irb(main):037:0> g.say_bye
Bye Pat, come back soon.
=> nil
Итак, как вы видите, все работает, как задумано. Что же будет, если мы попытаемся обратиться к имени напрямую?
irb(main):038:0> g.@name
SyntaxError: compile error
(irb):52: syntax error
from (irb):52
Ага, он ругается.
Переменные класса всегда спрятаны от посторонних глаз. Спрятаны они не насовсем, вы можете их найти, когда инспектируете объект, и всякими другими способами. Однако Ruby придерживается объектно-ориентированного подхода по отношению к скрытию переменных.
Посмотрим, какие же методы существуют у объекта класса Greeter:
irb(main):039:0> Greeter.instance_methods
=> ["method", "send", "object_id", "singleton_methods",
"__send__", "equal?", "taint", "frozen?",
"instance_variable_get", "kind_of?", "to_a",
"instance_eval", "type", "protected_methods", "extend",
"eql?", "display", "instance_variable_set", "hash",
"is_a?", "to_s", "class", "tainted?", "private_methods",
"untaint", "say_hi", "id", "inspect", "==", "===",
"clone", "public_methods", "respond_to?", "freeze",
"say_bye", "__id__", "=~", "methods", "nil?", "dup",
"instance_variables", "instance_of?"]
Ого! Но ведь мы объявляли всего два метода, откуда же их столько?
Здесь перечислены все методы класса Greeter, в том числе и унаследованные от его предка. А теперь посмотрим методы, присущие только классу Greeter:
irb(main):040:0> Greeter.instance_methods(false)
=> ["say_bye", "say_hi"]
А теперь посмотрим, на какие методы откликается наш объект:
irb(main):041:0> g.respond_to?("name")
=> false
irb(main):042:0> g.respond_to?("say_hi")
=> true
irb(main):043:0> g.respond_to?("to_s")
=> true
Итак, как мы видим, Greeter не знает метода name.
Однако, что будет, если мы захотим увидеть или изменить name? Ruby предоставляет легкий способ для доступа к переменным класса:
irb(main):044:0> class Greeter
irb(main):045:1> attr_accessor :name
irb(main):046:1> end
=> nil
В Ruby всегда можно открыть класс заново и изменить его свойства. Итак, попробуем создать новый экземпляр класса Greeter и поиграть с свойством @name:
irb(main):047:0> g = Greeter.new("Andy")
=> #
irb(main):048:0> g.respond_to?("name")
=> true
irb(main):049:0> g.respond_to?("name=")
=> true
irb(main):050:0> g.say_hi
Hi Andy!
=> nil
irb(main):051:0> g.name="Betty"
=> "Betty"
irb(main):052:0> g
=> #
irb(main):053:0> g.name
=> "Betty"
irb(main):054:0> g.say_hi
Hi Betty!
=> nil
Действие :attr_accessor создало для нас 2 новых метода, name для получения значения переменной @name и name= для задания ее значения.
Однако, Greeter сейчас умеет приветствовать и прощаться только с одним человеком. Что, если нам захочется создать некий MegaGreeter, который сумел бы приветствовать весь мир, одного человека, или несколько человек сразу?
Давайте напишем следующие строки в отдельном файле, а не прямо в интерпретаторе:
#!/usr/bin/env ruby

class MegaGreeter
attr_accessor :names

# Create the object
def initialize(names = "World")
@names = names
end

# Say hi to everybody
def say_hi
if @names.nil?
puts "..."
elsif @names.respond_to?("each")

# @names is a list of some kind, iterate!
@names.each do |name|
puts "Hello #{name}!"
end
else
puts "Hello #{@names}!"
end
end

# Say bye to everybody
def say_bye
if @names.nil?
puts "..."
elsif @names.respond_to?("join")
# Join the list elements with commas
puts "Goodbye #{@names.join(", ")}. Come back soon!"
else
puts "Goodbye #{@names}. Come back soon!"
end
end

end


if __FILE__ == $0
mg = MegaGreeter.new
mg.say_hi
mg.say_bye

# Change name to be "Zeke"
mg.names = "Zeke"
mg.say_hi
mg.say_bye

# Change the name to an array of names
mg.names = ["Albert", "Brenda", "Charles",
"Dave", "Englebert"]
mg.say_hi
mg.say_bye

# Change to nil
mg.names = nil
mg.say_hi
mg.say_bye
end
Сохраним этот файл как "ri20min.rb", а затем выполним командой "ruby ri20min.rb":
Hello World!
Goodbye World. Come back soon!
Hello Zeke!
Goodbye Zeke. Come back soon!
Hello Albert!
Hello Brenda!
Hello Charles!
Hello Dave!
Hello Englebert!
Goodbye Albert, Brenda, Charles, Dave, Englebert. Come
back soon!
...
...
В следующей статье мы рассмотрим еще массу интересных действий!

Ruby ч.2: Продолжаем изучать Ruby

Как продолжение этой статьи, вольный перевод кусочка руководства Ruby за 20 минут.
Как заставить Ruby приветствовать нас, не напрягая при этом наши пальцы? Очень просто, надо всего лишь объявить метод, который будет это делать:
irb(main):010:0> def h
irb(main):011:1> puts "Hello World!"
irb(main):012:1> end
=> nil
Код "def h" обозначает собой объявление метода. Им мы говорим Ruby, что объявляем метод с именем h. Строка "end" означает, что мы закончили объявление метода. Между этими строками находится тело метода, то есть то, что он будет делать. В данном случае - говорить "Hello World!". Фраза "nil", которой ответил нам интерпретатор, означает, что он понял, что мы закончили объявление.
Итак, попробуем запустить этот метод пару раз:
irb(main):013:0> h
Hello World!
=> nil
irb(main):014:0> h()
Hello World!
=> nil
Видите, как это просто? Вызвать метод настолько же легко, как сказать его имя Ruby. Если метод не требует параметров, то это все, что вам нужно. Однако, если вы хотите, то вы можете добавить пустые круглые скобки.
Что, если мы захотим говорить "Привет" какому-то определенному человеку, а не целому миру сразу? Достаточно всего лишь переопределить этот метод так, чтобы они принимал имя, как параметр:
irb(main):015:0> def h(name)
irb(main):016:1> puts "Hello #{name}!"
irb(main):017:1> end
=> nil
irb(main):018:0> h("Matz")
Hello Matz!
=> nil
Итак, это работает. Однако, попробуем посмотреть, как это работает.
Для начала, что такое "#{name}"? Это способ вставить что либо в строку в Ruby. Данные, находящиеся в переменной, указанной в фигурных скобках, преобразуются в строку (если они уже ей не были), а затем вставляются во внешнюю строку в том самом месте, где мы написали это выражение. Так же мы можем реализовать проверку того, написано ли имя с большой буквы:
irb(main):019:0> def h(name = "World")
irb(main):020:1> puts "Hello #{name.capitalize}!"
irb(main):021:1> end
=> nil
irb(main):022:0> h "chris"
Hello Chris!
=> nil
irb(main):023:0> h
Hello World!
=> nil
Рассмотрим, что тут происходит:
Если мы вызываем метод без скобок или не указываем параметр, то в качестве name используется параметр по умолчанию, то есть "World". В противном случае, первая буква имени делается заглавной, и выводится приветственное сообщение.
Ну а если же мы хотим создать реального привратника, который будет запоминать наше имя и встречать и провожать нас, то, возможно, стоит создать объект:
irb(main):024:0> class Greeter
irb(main):025:1> def initialize(name = "World")
irb(main):026:2> @name = name
irb(main):027:2> end
irb(main):028:1> def say_hi
irb(main):029:2> puts "Hi #{@name}!"
irb(main):030:2> end
irb(main):031:1> def say_bye
irb(main):032:2> puts "Bye #{@name}, come back soon."
irb(main):033:2> end
irb(main):034:1> end
=> nil
Здесь появляется новое ключевое слово - "class". Оно означает, что мы создаем новый класс Greeter и несколько методов для него. Также вы наверняка заметили "@name" - это переменная, доступная всем методам класса. Как вы видите, она используется методами say_hi и say_bye. Рассмотрим это в действии в следующей статье.

понедельник, 31 мая 2010 г.

Ruby On Rails: Что это?

Итак, начнем знакомиться с Ruby On Rails.
Во-первых, открываем getting started и читаем:
Что такое Rails?
Rails - это фреймворк для разработки веб-приложений, написанный на языке Ruby. Он предназначен для облегчения программирования за счет допущений относительно того, что нужно каждому разработчику. Это приводит к тому, что программировать требуется намного меньше по сравнению с другими языками и фреймворками.
Rails делает предположение, что существует некий "лучший" путь разработки, и спроектирован таким образом, чтобы следовать этому пути. Как обещают разработчики, если мы выучим "путь Rails", то невероятно увеличим свою производительность. Если же попытаться применять какие-то другие пути к Rails, то ничего хорошего из этого не выйдет.
Философия Rails включает в себя несколько главных приципов:
1) DRY – “Don’t Repeat Yourself” - "Не повторяйтесь" - подразумевает, что писать один и тот же код снова и снова - плохо.
2) Convention Over Configuration - Соглашения превыше конфигурации - Rails делает предположения о том, что вы хотите сделать, и как, вместо того, чтобы заставлять вас править бесконечные файлы конфигурации.
3) REST - лучший подход для разработки веб-приложений. Организация приложения на стандартных возможностях http - лучший способ сделать дело.

суббота, 29 мая 2010 г.

Ruby ч1: Hello World, или знакомство с Ruby.

Захотелось мне узнать, что же за зверь такой фреймворк ROR. Но для того, чтобы это узнать, надо разобраться сначала с самим Ruby, как он хоть выглядит в принципе и как на нем писать:)
Итак, поехали.
У меня имеется тестовая виртуальная машина с Linux Debian.
Необходимо установить на нее Ruby. Для этого выполняем следующую команду:
aptitude install ruby libzlib-ruby rdoc irb
Что же мы ставим? Ruby - это сам язык ruby, libzlib-ruby - библиотека zlib для ruby, rdoc - инструмент для генерации документации на основе документов ruby, irb - коммандная строка ruby.
Когда все это установится, можно проверить работу ruby так, как написано здесь. Например, можно использовать Ruby как калькулятор:
irb(main):007:0> a = 3 ** 2
=> 9
irb(main):008:0> b = 4 ** 2
=> 16
irb(main):009:0> Math.sqrt(a+b) => 5.0
Или взглянем на то, как в Ruby определяются методы:
irb(main):010:0> def h
irb(main):011:1> puts "Hello World!"
irb(main):012:1> end
=> nil
Здесь мы определили метод h, который при своем вызове будет выводить на экран фразу "Hello World!",
Чтобы вызвать этот метод, достаточно всего лишь ввести h:
irb(main):013:0> h
Hello World!
=> nil
irb(main):014:0> h()
Hello World!
=> nil
На этом совсем предварительное знакомство с Ruby закончим. Если понадобится (а я уверен, что понадобится), то вернемся к этому в следующих статьях:)

пятница, 19 марта 2010 г.

Linux: Добавляем jar-файлы в CLASSPATH, или подключаем сторонние библиотеки

В этом блоге я уже писал о том, как вообще прописывать переменную CLASSPATH в Linux Debian.
Сейчас же в ходе разработки столкнулся с необходимостью подключить в свой проект библиотеку, созданную сторонним разработчиком. Библиотека представлена файликом вида name.jar.
Для начала я попытался положить этот файл в директорию, заданную в уже прописанном classpath. Однако, это не помогло, компилятор не находил классов из этой библиотеки.
Задача: Добавить библиотеку в виде name.jar в CLASSPATH.
Решение: Сделать это просто.
1) Создаем директорию, в которой будет храниться эта библиотека:
mkdir /home/username/libraries/
2) Кладем файл в эту директорию:
mv name.jar /home/username/libraries/
3) Добавляем в CLASSPATH следующее (Как добавлять, описано здесь)
/home/username/libraries/*
Готово:)

четверг, 4 марта 2010 г.

Java - сравнение строк

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

String str1 = new String("Test");
String str2 = new String("Test");
if (str1 == str2)
System.out.println("Строчки совпадают!");

Однако, сообщение "Строчки совпадают!" не появилось.
Казалось бы, как так может быть, строки-то ведь одинаковые.
Разгадка же проста: при сравнении с помощью "==" в реальности сравниваются указатели на строки, а, так как str1 и str2 указывают на строки, находящиеся в разных местах памяти, они не равны друг другу.
Спасибо юзеру incrab, указавшему на мою ошибку в первоначальном варианте поста.
Если бы мы делали следующее:

String str1 = "Test";
String srt2 = str1;
if (str1 == str2)
System.out.println("Строчки совпадают!");

то сообщение бы вывелось, так как и str1 и str2 указывают на одну и ту же строку. (Проверить это можно, изменив str1, например str1 = "New string". Тогда, при выводе str2 на экран выведется не "Test", а "New string".

Так как же все-таки сравнить то, что находится по указателям?
У класса String существует специальный метод equals, переопределенный из класса object , возвращает true , если аргумент obj не равен null , является объектом класса string , и строка, содержащаяся в нем, полностью идентична данной строке вплоть до совпадения регистра букв. В остальных случаях возвращается значение false.

Пользоваться им можно, например, так:
if (str1.equals(str2))
System.out.println("Строчки совпадают!");

четверг, 24 декабря 2009 г.

Java - установка сокета с таймаутом

Представим, что вы пишете программу, которая бы открывала сокет на какой-либо порт и ждала бы от него ответа. Например, у вас есть список серверов, на каждый из которых надо зайти. И вдруг какой-то из серверов выходит из строя. Если не установить таймаут на создания сокета, то ваша программа будет висеть до тех пор, пока сервер не починят. Вот для этого случая и написан этот пост.
//Установка socket используя timeout
import java.net.*;
import java.io.*;
String AddAsStr="yandex.ru"
try {
AddrAsIAdr = AddrAsIAdr.getByName(AddrAsStr);//Переводим адрес из строки в тип InetAddress
} catch (Exception e) {
System.out.println("Could not resolve IP-address");
return 1;
};
try {
socket = new Socket();
socket.setSoTimeout(1000);
socket.connect(new InetSocketAddress(AddrAsIAdr,80),1000);//открываем сокет на сервере yandex.ru на порт 80 с таймаутом 1000 миллисекунд
} catch (Exception e) {
System.out.println("Could not establish socket");
return 1;
};

Вот и все:) В случае, если IP адрес не известен или socket не откроется за 1 секунду, программа выдаст соотвествующее сообщение.
P.s. подробнее про технологию сокетов в Java рекомендую читать на официальном сайте Java Sun.

Java - как сравнить строку с регулярным выражением (regexp)

Здесь просто и кратко о том, как сравнить в Java строку с регулярным выражением. Точнее, про то, как проверить, есть ли данный регексп в строке.
Делается это так:
String regexp="a*b";//Задаем регулярное выражение
String string="aaabbb";//Задаем строку, в которой будем его искать
boolean ok = Pattern.matches(regexp,string);//сравниваем
/* Если регексп присутствует в строке, то ok будет равно true,
* если нет - то false.
* В рассмотренном случае ok= true
*/
System.out.println(b);//на экране появится true

regexp="cd";
string="dddccc";
System.out.println(b);//на экране появится false
Вот и все.
О том, из чего составляются регулярные выражения и т.п. лучше всего читать официальную документацию. Полнее и лучше, чем там, написать очень сложно.

понедельник, 30 ноября 2009 г.

Linux Debian (Ubuntu) - прописываем CLASSPATH для java

Как известно, CLASSPATH - это такая переменная, в которой содержатся пути, по которым компилятор и интерпретатор JAVA пытаются найти файлы и *.class для их обработки. Рассмотрим все это на примере.
Будем хранить все наши java проекты в директории /home/username/workspace. В моем случае username заменяется на alexwinner и эта директория выглядит так: /home/alexwinner/workspace. Конечно, можно было бы перемещаться в эту директорию командой cd, создавать там файлик с кодом java, например, /home/alexwinner/workspace/blabla.java, далее выполнять
javac blabla.java
затем
java blabla
и получать результат. Но что делать в случае, когда наш класс принадлежит какому-либо пакету? Например, у нас есть 2 класса в двух файлах. Первый файл - test.java:
package for_testing;
public class test{
     public static void main(String s[]){
        aga A = new aga();
        System.out.println(A.aga);
        };
};
Второй файл - aga.java, в нем будет храниться class aga:
package for_testing;
class aga{
     String aga="aga";
}
Что же мы делаем? Мы создаем папку /home/username/workspace/for_testing, причем имя этой папки должно совпадать с именем пакета, которое задается в строчке  "package for_testing;". Далее добавляем путь к папке workspace в переменную CLASSPATH:
export CLASSPATH=$CLASSPATH:/home/username/workspace/
После этого перемещаемся в папку /home/username/workspace/for_testing и компилируем наш пакет:
javac test.java
После этого остается только запустить его. Запускать можно абсолютно из любой папки, так как путь к ней содержится в глобальной переменной CLASSPATH:
java for_testing.test
и получаем результат:
aga
Стоит заметить, что путь к этой директории будет содержаться в CLASSPATH только до конца текущего сеанса. Чтобы добавить его туда перманентно, надо выполнить следующее:
echo "export CLASSPATH=$CLASSPATH:/home/username/workspace/" >>/home/username/.bashrc