среда, 29 августа 2012 г.

Впечатления Гит.

Урок 2

Глава git reset HEAD

Факингшит. Я внесла изменения в README.md, нашла как их закоммитить. Закоммитила. Потом набрала его команду - $ git add README - и тут до меня дошло, что, вероятно, там не хватает git add README.md. Да-а... А я с этим потеряла кучу времени, но хорошо хоть нашла, где собака порылась))

Глава Commit

Тут предлагается откоммитить изменения, внесенные перед этим. "У нас уже есть кое-что staged и готовое и самое время откоммитить это.

Делаем:


git commit -m “brief description of commit”

Но тут пропущено звено. Когда я пыталась это сделать в терминале, оно выдавало тот же результат, что и команда git status.

Там предлагалось выбрать:


#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)

И я сделала правильный выбор. Я прописала в терминале первое.
Дальше в обучалке все идет по порядку :)


a quick git pull first, then you can carry on as normal.  Easy when you know how..

Короче, нифига не получается.
1. Постоянно пропадает 





вторник, 28 августа 2012 г.

Вопросы по Гиту. .rsa расшифровка.


Урок 1.

$ ssh-keygen -C "username@email.com" -t rsa

-С - stands for 'create'
-t rsa? Шо цэ. И где вообще можно посмотреть все эти расшифровки. + пройти сначала по ссылям, которые он дал. Вроде что-то похожее было))

rsa нашла. Это расшифровывается как Rivest-Shamir-Adleman. Алгоритм, при котором происходит асимметричное шифрование с использованием перемножения двух случайно выбранных простых чисел.

-t, думаю, можно посмотреть в help'e, но это надо будет попозже))

With -t <branch> option, instead of the default glob refspec for the remote to track all branches under the refs/remotes/<name>/ namespace, a refspec to track only <branch> is created. You can give more than one -t <branch> to track multiple branches without grabbing all branches.

Ответ взят отсюда

------

Урок 2.

Глава git reset HEAD

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

- в строке $ git add README, похоже, не хватает .md - должно быть так: $ git add README.md

Глава Commit

To check which files have been committed to the local repo, type

- $ git ls-files - что такое ls? Может, local settings? L - скорее всего local, а вот s - шо такое))

----
мессага преподавателю.
Feel myself very stupid, but I'm stuck in this lesson.
Everything go allright, untill "$ git push -u origin master"
I've read the stuff of your link, but "git pull origin master" doesn't help me.

I made "git status". It shows me: Unmerged paths: (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both added:         README.md
#
no changes added to commit (use "git add" and/or "git commit -a").

So, I tried "$ git rm README.md."

The terminal answers: "README.md: needs merge"

rm 'README.md'

I've merged it, but it doesn't help.

And git status says that "On branch master
nothing to commit (working directory clean)"
I'm confused.

















ex12.rb


git

Что такое контроль версий?
Контроль версий, также известный, как контроль источников или источник код управление или пересмотрение, ревизионный контроль в его простейшей форме сохраняет Ваш первый проект и затем сохраняет его как проект 2 и продолжает его с Вашей правкой. В общем, это позволяет Вам пойти к предыдущей версии, если Вы решили, что направление, которое Вы выбрали в Вашем документе не то направление, по которому Вы хотите идти, и Вы хотите продолжить с того момента, когда был только первый проект. Контроль версий, если брать более детально, в состоянии увидеть каждое изменение, как оно было сделано. По-настоящему же, оно заканчивается, будучи, по счастью, что Вы хотите что-либо между этими двумя крайностями.


Таким образом, контроль версий - это система, которая поддерживает версии файлов в стадии прогресса разработки. Каждый файл в системе имеет полную историю изменений, и может быть легко восстановлен до любой версии в его истории.

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

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

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

Что такое Гит?

Гит - опн сорс система контроля версий, которая была спроектирована для поддержки очень больших проектов с нормальной скоростью и эффективностью, но также подходит и для маленьких персональных репозиториев (сборник источников, к которые могут быть доступны для получения информации); он особенно популярен в опен сорс комьюнити, обслуживая разработческие платформы для проектов, такие как inux Kernel, Ruby on Rails, WINE or X.org.

Гит попадает в категорию распределенных источников инструментов управления (что означает, что можно с ним работать полностью в оффлайновом режиме). Каждый рабочий каталог Git является полнофункциональным репозиторием с полной историей и полным пересмотром возможности отслеживания, не зависит от доступа к сети или центральному серверу. Тем не менее Гит остается чрезвычайно быстрым и эффективным пространстве.

----
Урок 2.

git revert - возврат.



git revert используется для записи некоторых новых коммитов, чтобы возвратить эффект некоторых ранних коммитов (обычно только ошибочных).

Например:


git revert HEAD~3

Возвратить изменения до 4-го последнего коммита в HEAD и создать новый коммит с возвращенным значением. (Revert the changes specified by the fourth last commit in HEAD and create a new commit with the reverted changes).

git revert -n master~5..master~2 

Возвратить изменения, сделанные коммитами с 5 последнего коммита в мастере (включительно) по третий последний коммит в мастере (включительно), но не создавать никакого коммита с возвращенными значениями. Возвращение только модифицирует рабочее дерево и индекс. (Я так понимаю, то, что не надо делать коммит с возвращенным значением - об этом свидетельствует значок -n - т.е. no или not).  














среда, 22 августа 2012 г.

Why 3

Давайте изменим направление. Для нас в переменной сохранено стихотворение.


print poem
=> "My toast has flown from my hand
And my toast has gone to the moon.
But when I saw it on television,
Planting our flag on Halley's comet,
More still did I want to eat it."


Вместо  "toast" можно поставить "melon" или что угодно. Давайте попробуем:


poem['toas­t'] = 'hone­ydew'
=> "honeydew"


Теперь надо вывести на экран, чтобы увидеть новое стихотворение.


print poem
=> "My honeydew has flown from my hand
And my toast has gone to the moon.
But when I saw it on television,
Planting our flag on Halley's comet,
More still did I want to eat it."


Заметили, что изменилось только первое упоминание "toast"?

Квадратные скобочки, которые мы только что использовали довольно часто встречаются в Ruby. Помните, мы набирали:
poem['toast'] = 'honeydew' У того бокса со словом "toast" квадратные скобочки с каждой стороны, видите?
Две скобочки вычерчивают цель. Точно. Эти скобочки говорят: "Я ищу ...". Готово, цель. Здесь мы ищем toast и заменяем его фруктом.
Вот вопрос: "Что будет, когда мы применим .reverse ко всему стихотворению?


poem.rever­se
=> ".ti tae ot tnaw I did llits eroM
,temoc s'yellaH no galf ruo gnitnalP
,noisivelet no ti was I nehw tuB
.noom eht ot enog sah tsaot ym dnA
dnah ym morf nwolf sah wedyenoh yM"


Да, конечно. Все стихотворение стало задом наперед, буква за буквой. На самом деле я хочу просто перевернуть строчки стихотворения. Чтобы оно шло от последней строчки к первой. Т.е. наоборот, но не так наоборот.

Это делается вот так:


poem.lines­.to_a.reve­rse
=> ["More still did I want to eat it.
", "Planting our flag on Halley's comet,
", "But when I saw it on television,
", "And my honeydew has gone to the moon.
", "My honeydew has flown from my hand
"]


   Итак, что мы видим? Что произошло? Мы напечатали poem.lines.to_a.reverse и что произошло?
   А произошли две вещи. Мы превратили poem в список, использовав lines.to_alines - определяет каким именно образом надо разбить строку, а затем to_a конвертирует в массив.
   На месте lines могут быть использованы такие методы, как bytes или chars. Когда мы используем lines, Ruby возвращает каждую строку в стихотворении.
   Затем мы переворачиваем этот список. У нас есть каждая строка по отдельности. Мы ее перевернули. Вот и все.
   Давайте рассмотрим здесь еще один метод:


print poem.­lines.to_a­.reverse.j­oin
More still did I want to eat it.
Planting our flag on Halley's comet,
But when I saw it on television,
And my honeydew has gone to the moon.
My honeydew has flown from my hand


Вывод №3.

   Отлично! Метод join взял этот список перевернутых строчек и вывел их вместе в строку. (Конечно, мы могли просто использовать to_s).
Анализ времени.
   Восклицательные знаки. Методы могут иметь восклицательные знаки (а также и вопросительные) в своем названии. Не вопрос. Попробуйте:


poem.inclu­de? "my hand"­
=> true


   Квадратные скобки. Определяют цель и находят вещи. Находят и заменяют.
   Цепные (связывающие) методы помогают нам сделать побольше пертурбаций. Разбить стихотворение, перевернуть его, снова собрать.

poem.lines.to_a.reverse.join

Здесь вы наверное еще немного хотите поиграть со стихотворением. Полный список всех строковых методов здесь. Пойдите и попробуйте несколько. Например, poem.downcase или poem.delete.)

Наберите books = {}


books = {}
=> {}

   Таким образом мы сделали пустой hash. (Также известный как пустой словарь).
   Сейчас мы собираемся сделать небольшие книжные ревью в этом хэше. Вот наша рейтинговая система:

:splendid --> a masterpiece.    роскошный --> шедевр.
:quite_good --> enjoyed, sure, yes.    неплохо --> понравилось, конечно, да.
:mediocre --> equal parts great and terrible.    посредственный --> поровну великих и ужасных.
:quite_not_good --> notably bad.    достаточно плохо --> в основном плохо.
:abysmal --> steaming wreck.    чрезвычайный --> полная фигня(?).

ыва

вторник, 21 августа 2012 г.

Why 1, 2

.reverse - наоборот.


"Helen".re­verse
=> "neleH"


.length - сколько символов.


"Helen".le­ngth
=> 5

Например, используется, когда заходишь на сайт, регишься, а тебе кричат: "Эй, у тебя пароль слишком короткий"))

* 5 - любое число.


"Helen" * 5
=> "HelenHelenHelenHelenHelen"

Выводы №1:

Давайте посмотрим, что мы выучили за первую минуту.
The prompt. Печатая код в prompt дается ответ из него. Весь код дает ответ.
Numbers and strings - это математические и текстовые объекты.
Methods. Мы использовали англоязычные методы, такие, как reverse и символические методы, как * (метод умножения). Методы - это действия!

Это эссенция нашего обучения. Брать простые вещи, играть ими и превращать их в другие вещи. Вам комфортно. Уверен, что да.
Ок, давайте сделаем что-нибудь дискомфортное. Попробуйте перевернуть число: 40.reverse.


40.reverse­
=> #<NoMethodError: undefined method `reverse' for 40:Fixnum>


Мы не можем перевернуть число 40. Ну, если, конечно, не держать монитор возле зеркала. Но переворачивание числа не имеет значения. Ruby выдаст сообщение об ошибке.
Ruby говорит, что не существует метод reverse для чисел.
Разве если превратить сначала в строку.


40.to_s.re­verse
=> "04"


Мальчики отличаются от девочек. И числа отличаются от строк. Т.к. мы можем применять методы к любому объекту в Ruby, некоторые методы работают только с определенными типами вещей. Но всегда можно обратиться к конвертации между различными типами, используя Ruby-методы "to".

to_s переводит в строку - to string
to_i переводит в числа - to integer
to_a переводит в массивы - to array

Что такое массивы? Это списки, напечатанные внутри квадратных скобок [].

Список содержит вещи в определенном порядке. Как в очереди за попкорном.


[12, 47, 35]
=> [12, 47, 35]


А вот один поднимает руку!


[12, 47, 35].m­ax
=> 47


Хорошо, хорошо. Но раздражает постоянно перепечатывать этот список, да?
Давайте сохраним его внутри ticket , как например:


ticket = [12, 47, 35]
=> [12, 47, 35]


и теперь по команде "ticket", выйдет этот же массив. Т.о. мы создали переменную.
А теперь давайте упорядочим наши номера.


ticket.sor­t!
=> [12, 35, 47]


Выводы №2:

У нас был список. Мы упорядочили его. Переменная ticket сейчас изменилась.
Вы заметили, что у метода в конце большой яркий восклицательный знак? Очень часто методы в Ruby кричат таким образом, если они изменяют составляющую переменной в лучшую сторону. В этом нет ничего особенного, просто пометка.
Теперь давайте посмотрим, как прошла наша вторая минута:

Ошибки: Если мы хотим перевернуть число или сделать что-нибудь подозрительное, Ruby пропустит строку и скажет, что ему что-то не нравится.

Массивы - это списки, чтобы держать вещи в определенном порядке.

Переменные сохраняют вещи и дают им имена. Для этого используется знак "=". Как ticket = [14, 37, 18].

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

Классы.


Прога:


class Greetings
def hi
print "Hi, user"
end
end
obj = Greetings.new
obj.hi


Вывод:

Hi, user

1. Создаем класс Greetings.
2. Пишем функцию(?) def hi, в которой выводится "Hi, user".
3. Сначала закрываем функцию, потом закрываем класс end'ами.
4. Создаем переменную (?). new - не знаю, шо это. Получается, что эта переменная - класс Greetings.new - класс приветствие.новый.
5. Выводим эту переменную с функцией hi.
Факинг шит, еще учить и учить. Нифига не знаю, как это объяснить, но закономерности вижу))

Прога:



class IPv6
def name
"IPv6"
end
def size
"128 bits"
end
def example
"2001:470::1"
end
end
ipv6 = IPv6.new
print ipv6.name, " is ", ipv6.size," long and here's an example ", ipv6.example


Вывод:

IPv6 is 128 bits long and here's an example 2001:470::1

1. Создаем класс IPv6
2. В нем создаем функции(?) - 3 шт.
3. Создаем переменную ipv6 = IPv6.new. Я так поняла, .new пишется для того, чтобы потом можно было обращаться к ней. Отэто объяснила. Сама ж потом ничего не пойму)
4. Выводим функции по одной в строчке.

Прога:



class Employee
attr_accessor :name, :age, :gender
end
e = Employee.new
e.name="John Doe"
e.age=18
e.gender="male"
print "New employee: #{e.name}, #{e.age}, #{e.gender}"


Вывод:

New employee: John Doe, 18, male

1. Создаем класс Employee.
2. В нем задаем точки доступа: имя, возраст, пол.
3. Создаем переменную e = Employee.new. Ну, шоб над ней можно было проводить дейтсвия.
4. Пишем, что к какой точке доступа относится. Эммм...ну, тоже, в общем, задаем переменные.
5. Выводим строку с переменными на экран.


Прога:



begin
obj.greeting
rescue
print "Object or method does not exist"
end


Вывод:

Object or method does not exist

1. Создаем объект "приветствие".
2. Чезахрень? Спасаем.
3. Выводим "Object or method does not exist". Ниче не понимаю)

Прога:


begin
raise 'Raise Exception Handling'
rescue Exception => e
print e.message
end


Вывод:

Raise Exception Handling

1. Создаем. Эээ. Че создаем-то? Класс? Пишем подняться строке.
2. Спасаем, ыы, Exception => e.
3. Выводим e.message.

Прога:



begin
raise 'Raise and Ensure Exception Handling'
rescue Exception => e
print e.message+"\n"
ensure
print 'Ensure Test'
end


Вывод:

Raise and Ensure Exception Handling Ensure Test

1. Создаем шо-та. Приписываем значение е.
2. Потом выводим его, но с новой строки.
3. Гарантируем, ыы и выводим строку 'Ensure Test'.

суббота, 11 августа 2012 г.

ex11.rb

Зед говорит, что сейчас самое время ускорить шаги. Мы много печатали, должны были постоянно набирать простые штуки, но эти простые штуки достаточно нудные. Сейчас мы будем вводить полученные данные в программы. Здесь есть небольшие хитрости, потому что мы должны будем научиться двум вещам, казалось бы бессмысленным, но вам надо будет довериться мне и все равно их понять. Они обретут смысл в следующих упражнениях.
Как действует программа:
1. Берет какой-либо ввод от пользователя.
2. Изменяет его.
3. Выводит что-либо на экран, чтобы показать как оно изменилось.

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

Заметочко: Мы используем print вместо puts to do the prompting. print не добавляет новую строчку автоматически. Таким образом ваш ответ может быть на той же линии, что и вопрос.  puts , наоборот добавляет автоматически новую линию.

Прога:


print "How old are you? "
age = gets.chomp()
print "How tall are you? "
height = gets.chomp()
print "How much do you weigh? "
weight = gets.chomp()

puts "So, you're #{age} years old, #{height} tall and #{weight} heavy."


WYSS:


How old are you? 35
How tall are you? 6'2"
How much do you weigh?  180lbs
So, you're 35 old, 6'2" tall and 180lbs heavy.


1. Метод .gets - get string. Метод gets считывает строки, которые пользователь вводит с клавиатуры.
.Chomp (грызть, чавкать) - убирает все символы Enter, которые "болтаются" в конце строки.
Т.е., грубо говоря, чтобы не перескакивало само на новую строку. Он также может быть применен к любой переменной. См. ниже.
(Вот коммента Зеда: It has a newline from when you hit enter after typing 12. It's not really connected to printing, but you have the right idea that chomp removes the newline at the end.) Т.е. .chomp, в общем-то, не связан с выводом. Он просто убирает этот Enter, когда мы вводим значение. Ну, нам же шоб его ввести, надо нажать Enter. Этот .chomp как бы нивелирует его))

2. Угу, можно их юзать отдельно друг от друга. Например, вот так:

puts "Hello, What is your name?"
name = gets
name = chomp()
puts "Oh, #{name}, what a wonderful name!"

3. Вот мой пример)

puts "What is your aim?"
aim = gets.chomp()
puts "What is your nearest future profession?"
prof = gets.chomp()
puts "Are you shure you can do this?"
shure = gets.chomp()

puts "So, your aim is to learn #{aim}, your nearest future profession is #{prof} and \"#{shure}\" is a good answer! You'll achieve your goal)))"

Вывод:

Из этого упражнения мы узнали, как получать данные от пользователя с помощью метода .gets и использовать в программе. Ну, и выводить на экран.
В помощь методу .gets - метод .chomp. Он помогает "скушать" тот Enter, который нужен, чтобы ввести данные с клавы. Ну, и соответственно убирает новую строку.
Он также может быть использован отдельно от .gets. Сначала взять ввод с клавы, а потом с помощью .chomp убрать лишний Enter.

пятница, 10 августа 2012 г.

Методы.

Basic Methods.

Прога:


def greeting(name)
print "Hello #{name}"
end
greeting "User"

Вывод:

Hello User

Я так поняла, это мы задали функцию. Эмм... Но название "Методы и классы", угу.
1. def - definition. Мы задаем def greeting(name). Т.е. def greeting, а значение у этого greeting - name.
2. Потом выводим строку "Hello #{name}", с переменной #{name}.
3. Присваиваем greeting значение "User" - это на месте переменной name.
Как-то запутанно получилось у меня написать коммент)

Прога:


def multiply(n1, n2)
result = n1 * n2
return result
end
print multiply(2,3)


Вывод:

6

1. Мы создали функцию multiply со значением (n1, n2)
2. Создаем переменную result, в которой перемножаем первое значение на второе
3. Возвращаем результат.
4. Выводим на экран результат умножения.
Фак, чувствую, что что-то не то пишу. Надо у Зеда потом будет посмотреть.


Прога:


def sites
s1="ipv6.he.net"
s2="tunnelbroker.net"
s3="dns.he.net"
return s1, s2, s3
end
a,b,c = sites
print "Cool sites: #{a}, #{b}, #{c}"


Вывод:

Cool sites: ipv6.he.net, tunnelbroker.net, dns.he.net

1. Задаем функцию def sites.
2. Присваиваем переменные(?) 
        s1="ipv6.he.net"
s2="tunnelbroker.net"
s3="dns.he.net"
3. Возвращаем результат присваивания return s1, s2, s3. (хрень какая-то у меня в описаниях)
4. Пишем, что a,b,c = sites, т.е. a,b,c = заданной функции. a,b,c - переменные?
5. Выводим строку с переменными(?).

Прога:



def calculateTip(mealCost)
yield mealCost
end
rate=0.15
tip=calculateTip(25.0) { |cost| cost * rate }
print "Tip should be: $", tip


Вывод:

Tip should be: $3.75

1. Задаем функцию calculateTip(посчитать чаевые) со значением "mealCost"(стоимость еды).
2. ...
3. Задаем переменную rate(расценка)=0.15
4. Задаем переменную tip, в которой calculateTip(т.е. наша функция) со значением 25.0 и в фигурных скобках считаем ( |cost| cost - мы задали только что. Он означает tip=calculateTip(25.0) * rate, т.е. 0.15.
5. Выводим строку с переменной tip(чаевые).

Прога:



str = "Hurricane Electric"
m = str.method(:length)
leng = m.call


Вывод:

18

1. Задаем переменную str = "Hurricane Electric".
2. Задаем переменную m = str.method(:length), которая равна Hurricane Electric.method(:length). Т.е. мы в этой переменной задаем, чтобы с Hurricane Electric произвели некоторое действие с помощью .method(:length) - т.е. нам надо узнать длину этой строки.
3. Задаем переменную leng = m.call - типа, метод.вызываем(?).


среда, 8 августа 2012 г.

r, r+, w, w+, a, a+

r stands for read, w stands for write, a stands for append.
r
Read-only mode. The file pointer is placed at the beginning of the file. This is the default mode.
r+
Read-write mode. The file pointer will be at the beginning of the file.
w
Write-only mode. Overwrites the file if the file exists. If the file does not exist, creates a new file for writing.
w+
Read-write mode. Overwrites the existing file if the file exists. If the file does not exist, creates a new file for reading and writing.
a
Write-only mode. The file pointer is at the end of the file if the file exists. That is, the file is in the append mode. If the file does not exist, it creates a new file for writing.
a+
Read and write mode. The file pointer is at the end of the file if the file exists. The file opens in the append mode. If the file does not exist, it creates a new file for reading and writing.

(r+, w+, and a+ all do read-write. w+ truncates the file. a+ appends. w+ and a+ both create the file if it does not exist).

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

Regular Expression Basic

Regular Expression Basic.

Код:

print "help".sub(/p/, "lo")

Вывод:

hello

С помощью .sub мы "p" меняем на "lo".

Код:

print "I like Ruby".sub(/like/, "love")

Вывод:

I love Ruby

Просто с помощью .sub - substitution заменяется "like" на "love".

Код:

print "I like Ruby".sub(/I/, "You")

Вывод:

You like Ruby


С помощью .sub "I" заменяется на "You".

Код:

print "Ruby".sub(/^/, "Hello ")


Вывод:

Hello Ruby

С помощью .sub и замены "^" в начало строки вклинивается слово "Hello ".

Код:

print "Ruby".sub(/$/, " rocks")

Вывод:

Ruby rocks

С помощью .sub и замены "$" в конец строки вклинивается слово "rocks".

Код:

print "I only have $5 in my wallet".sub(/\$\d/, "five dollars")

Вывод:

I only have five dollars in my wallet

С помощью .sub мы заменили $5 на "five dollars". Эту конструкцию  - /\$\d/ - я поняла так:
надо заменить $ и d (digit) число "5".

Код:

print "I now have $50 in my wallet".sub(/\$\d+/, "fifty dollars")

Вывод:

I now have fifty dollars in my wallet


С помощью .sub мы меняем $50 на "fifty dollars"). Здесь то же самое, что в предыдущем посте, только в этой конструкции /\$\d+/ к d прибавляется + . Это показывает, что надо поменять не только d (digit), но и нули. Если один и больше нулей, надо писать плюсик. Вродь так. Только что протестила у себя на компе.

Код:

puts "String has vowels" if "I love Ruby".match(/[aeiou]/)

Вывод:

String has vowels

Мы кагбэ говорим интерпретатору: "Напиши строку "String has vowels", если в фразе "I love Ruby" совпадут буквы с [aeiou]. Даже если одна совпадет, интерпретатор выдаст нужную нам строку.


Код:


program_name = "interactive-2.1.1"
matches = program_name.match(/(.*)-(\d+)\.(\d+)\.(\d+)/)
name, major, minor, tiny = matches[1..-1]
print "Name: ", name, " Major: ", major, " Minor: ", minor, " Tiny: ", tiny


Вывод:

Name: interactive Major: 2 Minor: 1 Tiny: 1

1. Мы задаем переменную program_name = "interactive-2.1.1".
2. Задаем переменную matches = program_name.match(/(.*)-(\d+)\.(\d+)\.(\d+)/). Т.е. по сути, если  program_name заменить на ее значение, то получится  matches = program_name.match aka interactive-2.1.1.match. и дальше в скобочках идут параметры сравнения. Совпадают ли эти два значения. * - это слово "interactive". Одна звездочка, наверное, потому что не имеет значение количество букв, хз. Дальше идет тире, а потом числа. Т.е. тоже дан универсальный эквивалент - d+ - присутствует ли любое число. Таким образом схема получается следующая:
Создаем переменную matches(совпадения) = interactive-2.1.1и в скобках универсальные символы. Абстрактный * и d+, означающие любое слово и любые числа. Причем d даны сразу с плюсиком, шоб, если это не цифра, а число, тоже выдало результат.
Также смею предположить, что \. - это экранирование. Ну, шоб программа знала, что точку надо учитывать. Или хз. Шо-та я уже сомневаюсь)
3. name, major, minor, tiny = matches[1..-1]. Не знаю, шо це. Вроде похожи на переменные. Но типа они равны той переменной (matches) со значением [1..-1].
Что такое [1..-1] - хз. Но у меня есть предположение, что имеется в виду вся область совпадений. Т.е. с 1 по -1 пишется, чтобы включить ВСЕ элементы.
4. Выводится на экран строка "Name: " и переменная(?) name, которая у нас в данном случае равна слову "interactive". Далее выводится строка " Major: " и переменная(?) major, которая в данном случае равна 2, то же самое с minor и tiny.

Код:


phone_pattern = /^((\(\d{3}\) |\d{3}-)\d{3}-\d{4}|\d{3}\.\d{3}\.\d{4})$/
num = "(123) 234-2345"
if num =~ phone_pattern
  print "pattern matched"
else
  print "pattern not matched"
end


Вывод:

pattern matched

В общем, надо почитать, что за что отвечает в этих регулярках. Единственное, что понимаю, это то, что ^ - начало строки, $ - конец строки, а d - digit. Но там свой синтаксис, надо будет разобраться :)

воскресенье, 5 августа 2012 г.

Basic Looping.

Basic Looping. Стандартный цикл. (Control Flows).

Код:


for i in 1..5
print i
end


Вывод:

123451..5

Вот здесь вообще чивой-та нипанимаю)
Для числа (i) в цикле(?) с 1 до 5 вывести число (i).
То, что вывелось 12345 - понятно хоть как-то. Типа i = 12345.
А вот зачем вывелось и выражение 1..5 - ваще не пойму.
Еще больше смутило то, что у меня на компе интерпретатор выдает только 12345. Может, это в их интерпретаторе глюк какой-то. Ну, или версия другая).

Код:


max = 5
for i in 1.. max
print "num #{i}\n"
end

Вывод:

num 1 num 2 num 3 num 4 num 5 1..5

Это немного усложненная версия предыдущего упражнения.
Здесь вместо последней цифры дается переменная "max". Но она тоже равна 5. Соответственно, интерпретатор выдает все числа с 1 по 5. А, да - еще тут сама строка для вывода немного другая. Здесь добавляется слово "num". И, как и ожидалось, в моем интерпретаторе нет довески "1..5".

Код:


num = 5
print num = num + 5 while num < 25



Вывод:

10152025

Мы задаем переменную num = 5.  Выводим ее же, но уже в измененном виде.
И сейчас у нас num = num + 5. Т.е. мы выводим сразу результат сложения. Т.к. num у нас 5, то по сути получается 5 + 5 = 10, + еще 5 = 15 и так пока num будет меньше 25.


Код:


i = 0
while i < 5
i = i + 1
print i
print "\n"
end


Вывод:

1 2 3 4 5

Мы задаем переменную i = 0.
Пока i < 5, т.е. 0 < 5.
i = i + 1, т.е. 0 + 1.
Выводим i
Выводим на новую строку.

Код:


animals = %w(lions tigers bears)
animals.each{|kind| print kind}


Вывод:

lionstigersbears["lions", "tigers", "bears"]

Сейчас поставила парочку экспериментов у себя на компе.
Вывод у меня такой: lionstigersbears.
Удалось выяснить, что |kind| - это нечто вроде переменной.
Вместо этого слова можно поставить что угодно.
Дальше мы просто с помощью этого слова выводим все остальное.
То , что в квадратных скобках ["lions", "tigers", "bears"] - это довесок, как и в предыдущих упражнениях. У меня интерпретатор эту часть проги не выдает.
Итого, что мы получили:
Мы задаем переменную "animals" и в нее впихиваем массив. Шоб не писать все в квадратных скобках, через запятую и в кавычках, мы перед массивом ставим %w.
Потом пишем "animals" (т.е. массив %w(lions tigers bears)).each.
Each  - это метод.
В фигурных скобках мы кагбэ задаем переменную через |kind|, а потом выводим ее - пишем  print kind.
В чем заключается цикличность, так и не поняла. Типа, вывести всех животных, штоле. Ну, как-то так.


Код:


num = 7
num.times { |i| print i; print "\n" }


Вывод:

0 1 2 3 4 5 6 7

Мы задаем переменную num = 7.
7.раз Опять-таки задаем какгбэ переменную i - integer, потом выводим ее - print i, ну, и все с новой строки print "\n".

Switch Statement. Case..when..else.

Basic Switch Statement. (Control Flows).

Я так поняла, это почти то же самое, что и if, else, elsif. Только в случае с case сюда можно впихнуть больше значений.

Код:


exp = 2
case exp
when 1
print "one"
when 2
print "two"
else
print "not 1 nor 2"
end


Вывод:

two

1. Задаем переменную exp, равную 2.
2. Case exp. Ну, типа, в нашем случае - 2.
3. Опять-таки задаем условие. Когда 1, пишем "один", когда 2, пишем "два". А если не то и не другое, пишем "Не 1 и не 2".

Т.к. у нас exp = 2, вывод у нас получился "two".

Код:


grade = 13
school = case grade
when 0..5
"elementary"
when 6..8
"middle school"
when 9..12
"high school"
else
"college"
end
print "grade #{grade} is in #{school}"



Вывод:

grade 13 is in college

1. Мы задаем переменную grade = 13.
2. Дальше задаем переменную school = case grade. Т.е. school уже равна не просто grade, а обработанному grade. Обработанному с помощью case. Case смотрит, куда входит 13. И думает. Когда 0..5 - выдам  "elementary". Но у нас 13. Значит идет дальше. С 6..8 и с 9..12 тоже не подходит. Значит идет в последнюю инстанцию. Если все исключено, значит сюда, в else.

Т.о. на экран выводится Grade 13 (это переменная #{grade} ) is in college (это переменная  #{school}).

пятница, 3 августа 2012 г.

Conditional Statements. Условные выражения. if..else..elsif.

Basic Conditional Statement. (Control Flows).

Код:


num = 10
if num < 20 then
print "#{num} is less than 20"
end


Вывод:

10 is less than 20

1. Мы задаем переменную num = 10.
2. Пишем условие. Если переменная, т.е. 10 меньше, чем 20, вывести "эта переменная (10) меньше, чем 20".

Т.к. 10 < 20, интерпретатор выводит на экран эту строку.

Код:


name = "World"
if name == "World"
print "Hello World!"
else
print "You are not World! Where's World?"
end

Вывод:

Hello World!

1. Мы задаем переменную "World".
2. Пишем условие. Если name равна "World", то выводим на экран "Hello World!"
3. Если переменная name не равна "World", то выводим "You are not World! Where's World?"

Т.к. переменная у нас "World", то вывод у нас получился "Hello World!".

Код:


name = "Ruby";
if name == "Ruby"
print "Hello Ruby!";
elsif name == "Perl"
print "Hello Perl!";
elsif name == "PHP"
print "Hello PHP!";
else
print "Who are you?"
end


Вывод:

Hello Ruby!

1. Задаем переменную "Ruby".
2. Пишем условие. Если name равна "Ruby", то выводим на экран "Hello Ruby!". То же самое с Perl и PHP.
3. Если переменная не равна ни первому, ни второму, ни третьему, вывести на экран "Who are you?"

Т.к. переменная у нас "Ruby", интерпретатор выдает "Hello Ruby!".

Код:


num =  5
unless num > 5
print "num is less than or equal to 5"
else
puts "num is greater than 5"
end


Вывод:

num is less than or equal to 5

unless - если не, пока не.

1. Задаем переменную num = 5.
2. Пишем, что пока переменная не будет больше  5, будем выводить на экран "num меньше или равно 5".
3. Если нет, то пишем "num больше 5"

Т.к. переменная у нас равна 5, ответ получился "num is less than or equal to 5".

среда, 1 августа 2012 г.

Common Hash Methods

Common Hash Methods. Общие хэш-методы.

irb(main):001:0> states = {CA: 'California', WA: 'Washington', TX: 'Texas', FL: 'Florida' }; states.index('Washington')
WA

.index со значением, указанным в круглых скобках и одинарных кавычках ('Washington') выдает WA. т.е. Этим параметром в круглых скобках мы указываем, какой из элементов надо выцепить.


irb(main):001:0> states = {CA: 'California', WA: 'Washington', TX: 'Texas', FL: 'Florida' }; states[:FL]
Florida


[:FL] - тоже указывает, какой из элементов надо выцепить, но теперь уже вытаскивается значение, расшифровка FL.


irb(main):001:0> age = { "John" => 21, "Julie" => 35, "James" => 18 }; puts "John is #{age['John']} years old"
John is 21 years old


Здесь просто добавляем переменную в строку. Это делается как обычно через #, указание самой переменной, фигурных скобок. В них еще пишется значение в квадратных скобках. Это указание на тот элемент, который надо выдернуть.


irb(main):001:0> age = { "John" => 21, "Julie" => 35, "James" => 18 }; puts "Julie is #{age['Julie']} years old"
Julie is 35 years old

То же самое. Печатаем, сколько лет Julie с помощью переменной с указателем, какой именно элемент надо выцепить.

irb(main):001:0> age = { "John" => 21, "Julie" => 35, "James" => 18 }; age['Julie'] = 24; puts "Julie is #{age['Julie']} years old"
Julie is 24 years old

Здесь второй раз задается переменная "age". Только теперь у нее одно значение. В ней изменено значение возраста Julie. Причем изменения указаны в квадратных скобках (квадратные скобки или потому что один элемент или потому что переназначается, хз). Строка выдается с учетом внесенных изменений.


irb(main):001:0> age = { "John" => 21, "Julie" => 35, "James" => 18 }; age['James'] = 38; puts "James is #{age['James']} years old"
James is 38 years old


То же самое, что и в предыдущем примере. Только теперь с помощью этой же переменной изменяется возраст James'a. Строка выдает уже измененный результат.


irb(main):001:0> age = { "John" => 21, "Julie" => 35, "James" => 18 }; age['Erica'] = 18; puts "Erica is #{age['Erica']} years old"
Erica is 18 years old


Здесь мы тоже просто выводим строку со встроенной переменной. На этот раз с помощью переменной "age" мы вводим новое значение. Возраст Eric'и. Потом его же выводим на экран.


irb(main):001:0> age = { "John" => 21, "Julie" => 35, "James" => 18 }; age ['Eric'] = 19; puts "Eric is #{age['Eric']} years old"
Eric is 19 years old


То же самое. С помощью переменной "age" вводится возраст Eric'a, а потом выводится на экран.


irb(main):001:0> age = { "John" => 21, "Julie" => 35, "James" => 18 }; age.delete('John'); print "John is", age.has_key?('John') ? " in the list" : " not in the list"
John is not in the list


Здесь мы сначала с помощью переменной "age" удаляем возраст John'a. Потом выводим строку и спрашиваем в "age" есть ключ ('John')? Т.к. мы его удалили, то ответ - "Джон не в списке".


irb(main):001:0> age = { "John" => 21, "Julie" => 35, "James" => 18 }; age.delete('Julie'); print "Julie is", age.has_key?('Julie') ? " in the list" : " not in the list"
Julie is not in the list


Здесь повторили то же самое, что и в предыдущем упражнении. Сначала убрали точку доступа в "age" к "Julie", а потом спрашиваем, присутствует ли она там. Ответ - "нет".