- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
private void Button2_Click(object sender, EventArgs e)
{
this.Label4.Text = new StreamReader("C:\\Program Files\\Microsoft Visual Studio 10.0\\VB\\VBProjects\\датаметр\\датаметр\\bin\\Release\\Key.txt").ReadLine();
if (Operators.CompareString(this.Label4.Text, "vrc5rhhgyuuoxr45", false) == 0)
{
this.Button1.Visible = true;
this.TextBox1.Visible = true;
this.Label1.Visible = true;
this.Label4.Visible = false;
this.Button2.Visible = false;
this.Label3.Visible = true;
int num = (int) Interaction.MsgBox((object) "Ключ верный.\r\nНе сообщайте его никому !!\r\nИ не потеряйте.", MsgBoxStyle.OkOnly, (object) null);
}
else
this.Label4.Text = "Ключ не верный !!\r\nПоменяйте его в файле \"Key\"";
}
Классное расположение файла. Причём в архиве лежит пустой файл Key.txt рядом с программой...
Как надо было извратиться, чтобы в коде оказался не просто абсолютный путь, но и вот такой-вот с Program Files, ведь по умолчанию VS создаёт проекты в Моих документах
http://www.cyberforum.ru/vb-net/thread971437.html
Одмины уже кастуют проклятье 80 левела на автора
> vrc5rhhgyuuoxr45
Ты нарушил условия, и ждет тебя страшная кара от автора!
Путь доставляет. В идеале под каждый комп должен быть свой персональный путь. Жесткий как стальная балка
Тут можно перечислять до бесконечности:
1. Наименования события и контролов - говнокод
2. Реализация - говнокод
3. Расположения читаемого файла - говнокод. Есть же метод который возвращает путь кататола, откуда запущено приложение. А проверить, если файл в этой жопе не существует?
4. Полностью непонятна реализация, почему "vrc5rhhgyuuoxr45" константа? Может приложение компилируется каждый раз с этим новым значением?
5. Button1.Visible = TextBox1.Visible = Label1.Visible = Label3.Visible = true - так получше
6. int num не исполуется
7. Вместо "\r\n" - Environment.NewLine
Наверника я ещё упустил пунктов 10
Во-первых, я немного не сказал, что код декомпилированный...
1. Да, имена действительно такие.
2. Нет, вполне нормальная.
3. Да. Но меня больше удивило не то, что абсолютный путь (ну есть люди, которые не думают об этом), а именно что там Program Files причём в таком виде, что очевидно, что человек тупо все проекты хранит именно там - с какого перепуга??
4. А мне непонятно, как скачавший приложение должен был её угадать... Да ещё и постоянно редактируя файл с ключом...
5. VB.NET такие присваивания не поддерживает. К тому же, при компиляции оно всё равно развернётся.
6. Возможно такой вызов MessageBox - последствия применения функции MsgBox. Точно сказать не могу, но не думаю, что там что-то плохое было...
7. А смысл? vbCrLf - вполне нормально. Заодно и одной строкой записалось, а не конкатенацией при выполнении...
Ему должны были ее прислать, когда он купит прогу... Зачем он должен ее угадывать?
Эм.. А ты открывал ссылку, написанную рядом с кодом? Это из той программы, которая там во вложении. Ни о какой покупке ничего не говорится, да и не может говориться ;)
Кстати, даже в самом коде фраза "Ключ не верный !!\r\nПоменяйте его в файле \"Key\"" как бы намекает, что ключ надо именно подбирать.
Нет конечно :) Мой девиз: "Ссылки не читай @ хуйню отвечай".
В принципе, по коду это видно: Operators.CompareString и странный Interaction.MsgBox.
меня мучают сомнения, а не компилируется ли вдруг, по причине совместимости, написанное лучше, в такой дикий ужас, как написанное на языке с более слабыми возможностями?
А F# вроде бы и не борется за функциональную чистоту, так что скорее всего на нем можно спокойно писать любую императивщину...
Есть чистые контейнеры, но не более.
(по мне, ассемблер - чистая что ни есть императивщина)
Разумеется, я подразумеваю доступность возможностей типа передачи указателей на функции для их последующего вызова, ну и всего остального. Т. е. без поверхностных языковых ограничений.
И вообще, функциональные языки не на столько функциональные, чтобы в них не было циклов...
Правда на F# я не писал...
Вы не поверите...
PS: Cколько не смотрю видяхи этого парня, то мне все кажется что он капитан.
Да вроде я их никогда и не писал. Ну в школе ещё может. Он все правильно говорит. Просто для меня это очевидно. Если будете ещё постить видеолекции, то я буду ждать и обязательно посмотрю.
Из этой его лекции я всё-таки узнал что-то новое, а именно групперовка в определенном месте контейнера через стейбл_партишан, а второе тупл в С++11 иногда почти такой-же короткий, как в хаски:
Тогда надо срочно идти читать про тьюринг-полноту.
>монады так и появились на свет (что нарушают святые каноны ФП)
От функционального крыша протекает.
тьфу-ты, я хотел написать - в функциональном. мои извинения.
Написание на хацкиле эмулятора брейнфака должно развеять и эти сомнения.
это для меня слишком математический подход
для меня ФП пока ограничивается лямбдами. чистые функции высшего порядка я писать неспособен.
я все еще лелею надежду осилить ФП, тем более, что саморазвитие меня туда упорно сталкивает со всех дорог.
и тогда я, наверное, уйду в scala
_______________
На счет жирной книги, переведенной на русский я серьёзно. Написана с наркоманскими картинками для нубов типа тебя:
http://www.knigograd.com.ua/images/detailed/978-5-94074-749-9_270_auto_jpg.jpg
Ты и в реале так выглядишь?
Ты в реале думаешь, что авторы книги будут печатать на обложке книги фотографии неуловимого джо?
Я использовал JetBrains dotPeek (он бесплатный, кстати).
Чтобы что-то декомпилировать нужно сначала это что-то скомпилировать... А компилятора у нас нет. И в винду перезагружаться влом.
Ну во-первых, можно скачать, а не компилировать самому.
Во-вторых, вижак и чтобы скомпилировать не нужен. Компилятор входит в .NET Framework b компилировать можно на любом компе, где он установлен. http://bbs.vbstreets.ru/viewtopic.php?f=2&t=44609
Чтобы декомпильнуть что-нибудь ненужное, нужно сначала скомпилировать что-нибудь ненужное...
P.S. Как будет правильно звучать совершенный вид для "декомпилировать"?
P.P.S. Случился бсод, а написанный до первого "P.S." комментарий остался. Мелочь, а приятно.
ну и еще многословность, атавизм всех этих кубейсиков и паскалей.
вот скажите, новичкам и вправду легче изучить программировать на бейсике или паскале, чем на сисярпе\жабе\жабаскрипте\фитоне\руби\и т.д.? потому что он "похож на естественный аенглийский"?
по мне, это чисто "черепашья графика"
В том-то и дело, что ничего там не отсутствует из того, что доступно в шарпе без флага unsafe, ну и нескольких фич, которые не особо нужны...
Просто все помнят другие бейсики и их репутация сказывается. VB.NET - совсем другой язык. Там есть всё необходимое. Все .NET-классы, наследование, интерфейсы, виртуальные и абстрактные методы и классы, перегрузка операторов, биртовые операции (в том числе сдвига), логические операции, условный оператор и ещё куча всего.
> новичкам и вправду легче изучить программировать на бейсике или паскале
Я не новичок, на паскале никогда не программировал. Начинал программирование с си и си++. Потом некоторое время писал на VB6. Затем перебрался на .NET, долго не мог разобраться с VB.NET - он реально другой. Примерно в то же время, но чуть позже на шарп. VB.NET лично мне приятнее, как-то более близок к духу си.
http://bbs.vbstreets.ru/viewtopic.php?p=6756794#p6756794
> VB.NET лично мне приятнее, как-то более близок к духу си.
странно читать такое. мне казалось, что дистанция далека.
а вот Java\C# являются неким древним знаменем, каким должно быть программирование в стиле ООП. хоть сишарп я и недолюбливаю, но, тем не менее, уважаю за его синтаксический сахар по сравнению с жабой.
главное в языке, я считаю, отсутствие излишних низкоуровневых манипуляций там, где им не место, чем СиСи++ грешат-таки.
А джаву с её громоздкостью, невозможностью нормально что-то написать, длиннющеми именами у стандартных методов, отсутствием перегрузки операторов и лямбда-функций (правда они появились в новой версии, но кого из знакомых спрашивал, никто с ними не работал ещё) очень не люблю...
вообще идеальным языком был бы D, будь у него сообщество, документация, поддержка IDE
Что, восьмерка уже вышла?
> странно читать такое. мне казалось, что дистанция далека.
Я имел в виду, в плане контроля за программистом. Он не будет заставлять меня явно приводить double во float, а decimal (которым представлено значение в NumericUpDown) в int (ну я же знаю, что там целое число от 1 до 100) - нафига мне шарпоконтроль, что у decimal более широкий диапазон значений? Ещё он нормально пишет предупреждение, а не ошибку на неинициализированные переменные и отсутствие return.
Вот работал на шарпе с библиотекой OpenXML - это штуковина для генерации docx-файлов. Так вот, там всё построено на типе uint, а в шарпе все индексы списков, массивов и всего остального - это просто int. Задолбался с явным приведением по несколько раз в каждой строчке!!!
На простейшие случаи типа: уже, наверное, ни один компилятор не ругается...
А вот пример, когда не понимает: Что, очень сложный?
А вот пример на неинициализированную переменную: Между одинаковыми проверками мог бы быть какой-то код, из-за которого их нельзя совместить.
А если посмотреть именно в контексте ошибка или предупреждение?
Хороший программист всё-таки предупреждения смотрит :)
Вот я привёл два куска кода. Предположим, что в нём понадобилось что-то изменить. Человек меняет и если он замечает относящееся к этому коду предупреждение, то он всё-таки задумывается, затрагивает ли каким-либо образом его код эту ситуацию. Например, меняет в switch'е 3 на 7. При наличии предупреждения, он поймёт, что оно его касается. Если же там в конце стоит throw, то остаётся надеяться, что оно упадёт у него, либо в скором времени при тестировании. А если там return 0, то всё это чудо может ещё неизвестно сколько работать неправильно...
Т. е. фактически компилятор требует написать нечто, что скроет факт какого-то подвоха в коде.
з.ы. всегда проверяю код встроенными предупреждениями JetBrains Idea, а также FindBugs, и при их, грамотно настроенных, добиваюсь исчезновения всех предупреждений.
На всякий случай скажу, что перечисленные мной возможности по приведению типов исчезнут, если написать Option Strict или включить соответсвующий флаг в свойствах проекта.
Про неинициализированную переменную предупреждение будет в любом случае. Нафига мне там ошибка? Я и предупреждения читаю, если они есть.
и потом при поиске багов я буду знать, где именно и в чем именно я дурак, и в нужных местах просто усложню читаемость кода в угоду компилятора, зная о последствиях.
а не то, что компилятор стерпит, а ты потом матери и его, и себя, и его создателей, и бога за то, что сегодня ночь с пятницы на субботу, когда все нажрались, а ты, трезвый и потому злой, ищещь этот несчастный баг, который нужно пофиксить ASAP, бо типа кто-то там может потерять миллионы или просто расстроиться и сменить ориентацию фирму.
и от этого не избавиться, иначе бы нам грозило светлое будущее совсем без багов
Это увеличивает длину строк и снижает читабильность кода. Например, если в строку на 240 символов (примерно 260 - это ширина экрана) добавить охапку явных приведений, то её придётся скроллить...
несмотря на то, что я фанатик инлайна единожды использующихся выражений\методов и оформлению более чем одноразовых выражений в локальные переменные\методы, а также других сомнительных рефакторингов
Хм.. Они тут при чём? Предлагаешь удалить полезные пробелы, чтобы впихнуть бесполезное (float)?
> вынесение особо сложных выражений во временные выражения
Лично мне проще прочитать длинную строку, чем охапку из 5 временных переменных, которые больше нигде не нужны. Даже если что-то выношу для отладки, потом загоняю обратно.
> комментарии наконец
И что с ними? Ну будет стоять коммент перед строчкой и что? Скроллить-то её всё равно придётся.
Или написать так:
// Я не виноват, что эту строку надо скроллить, просто компилятор требует явного указания сужающих приведений типов, все притензии в Майкросовт
Причём обязательно после строки, чтобы сделать её ещё длиннее :D
А ещё лучше инлайновым комментом перед первым приведением *ROFL*
> несмотря на то, что я фанатик ...
Я тоже, если только речь не о элементарных действиях типа
return (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
наоборот, добавить, для разграничения и читаемости.
А деление одного оператора на строки обычно на читаемость влияет весьма отрицательно...
и придет понимание, почему выражения сгруппированы именно так, и как они связаны.
Нет. Компилируется в IL, возможности которого куда больше того же шарпа.
Например, чтобы сделать экспортируемую функцию (видимую из нативного кода), надо (помимо прочего) декомпилировать dll, дописать команду и скомпилировать снова. На обоих языках.
А ещё там есть модификатор видимости, неподдерживаемый шарпом. Да и ещё уйма всего.
От VB.NET тут осталисть только те два момента, которые я указал. И чем больше программист будет использовать функций из VB-библиотеки, тем больше подобного будет вылазить...
Ну ещё обёртка My и запуск приложения.
а в VB вижу атавизмы еще с более древних версий, вроде обязательное соглашение по наимнованиям, отсуствие более гибких структур, многословность, еще некоторых обязательных бредовых требований.
но надо отдать должное, VB с первых версий был легче, чем всякие СиСи++ с их жоглированием звездочками\амперсандами\уголками и грозным падением хз почему при невинной ошибке.
Перечисли пожалуйста. Я не вижу. Более того, код аналогичный VB6 ведёт себя иначе в некоторых ситуациях...
> вроде обязательное соглашение по наимнованиям
Нет такого. Ну кроме последствий того, что он case insensitive.
> отсуствие более гибких структур
конкретнее
> многословность
Спорно... Есть тот же блок With, которого больше нигде нет.
Многословность и заодно длиннословность я бы 100% приписал джаве.
> некоторых обязательных бредовых требований
Да, есть несколько. Типа цикла For...
В паскале? :)
И с джаваскриптовым не надо сравнивать - тот вообще вредный и его крайне нежелательно использовать.
Я имел в виду шарп, си и джаву.
почему каждому For надо писать Next, While - Wend, и т.д. т.к. в си-подобных языках хватает двух унифицированных для всех случаев (однобуквенных!) символов?
соглашения по именованиям - ну тех, типа Button1_OnClick
бредовых требований, типа - процедуры (это которые не возвращают значения) записываются ключевым словом Sub и не имеют скобок при вызове, а функции - должны засиываться как фукции Function, иметь скобки и возвращаемое значение.
--
итог: тем лучше язык, чем более он лаконичен при его простоте и понятности, и имеет наименее исключений.
Круче только bash с его case - esac.
Ну да, надо. Такой уж у него синтаксис.
Но отсюда можно и плюс вытянуть:
Do While X < 123
For Q As Integer = 0 To N-1
For W As Integer = 0 To N-1
For E as Integer = 0 To N-1
' ....
If Smth Then Exit Do ' А попробуй-ка так сишный break применить :D
Next E
Next W
Next Q
Loop
> соглашения по именованиям - ну тех, типа Button1_OnClick
Были в VB6. В VB.NET их нет. Правда такое именование является принятым и для VB.NET и для C#.
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Кстати, опять плюс бейсика, что этот handles написан в твоём коде, а не в коде дизайнера. А то в шарпе обработчик удалил (ну не нужен он тебе) и оно не компилится, т. к. в дизайнере ссылка на него осталась...
> Sub vs Function
Ну синстаксис такой... Можно же одно слово изменить, если надо.
Кстати, опять же, отсюда можно достать плюс в виде однострочной лямбда-процедуры, вызывающей нечто возвращающее значение.
Хотя это и в шарпе всего лишь парой фигурных скобок решаентся.
> и не имеют скобок при вызове
Сейчас у всего ставятся скобки. Вариант без скобок допустим только в случае отсутствия аргументов (как в паскале, да?), причём если это не внутри выражения, то вижак сам добавит скобочки.
Правда побочный эффект - можно ставить скобки при обращении к свойствам, а это оказывается плохо, если свойство возвращает делегат (указатель на функцию).
break на метку?
>Правда побочный эффект - можно ставить скобки при обращении к свойствам, а это оказывается плохо, если свойство возвращает делегат (указатель на функцию).
Упсь, и что теперь?
break на метку есть только в джаве. В плюсах и шапре - обычный goto, а это может иметь определённые последстивия... А в шарпе даже не очень обычный, учитывая ограничения на него.
> Упсь, и что теперь?
То что запись MyObj.SomeFunc() будет вместо вызова возвращённого делегата означать то же самое что MyObj.SomeFunc - обращение к свойству. Для вызова делегата понадобится написать либо (MyObj.SomeFunc)(), либо MyObj.SomeFunc()().
>только в джаве
Херню сказал.
Но всё-таки при написании такого кода следует позаботиться, чтобы в циклах переменные не создавались, поскольку некоторые компиляторы могут при таком переходе пропустить вызов деструктора. А может даже и со стеком что-то не то сделать. Это про плюсы, естественно.
В общем, моё мнение: goto из цикла использовать можно и это намного лучше, чем использовать флаг, но при этом позаботиться об отсутствии переменных, область видимости которых ограничена циклом крайне желательно.