Заключительная часть серии статей про мой опыт перехода с PHP на Go.
Первая часть, вторая, третья, четвертая.
4,5 года назад я имел неосторожность начать писать свою криптовалюту на совсем неподходящем для этого дела языке — на PHP. В итоге, конечно, написал (я упрямый), но получился костыль на костыле и то, что оно вообще работало было просто какой-то магией.
Сразу хочу предупредить, программер я самоучка-недоучка и пишу код, мягко сказать, неидеально.
Началось всё с того, что я расстался с девушкой, по имени Катя и в этот же день (4 апреля 2015-го) решил изучить Go и переписать свою криптовалюту. Писать про Катю не под спойлерами не могу, т.к. хабр всё же для IT-шных статей, а не для любовных рассказов и суровые айтишники, которым интересна тема Go, могут просто не обращать внимание на спойлеры «про Катю» и «про Машу».
Итог 8 месяцев: приложение работает на Win, OSX, Linux, FreeBSD, Android, IOS
Общего кода ~73к строк, кода под разные ОС где-то несколько сотен строчек.
40к — обработка/генерация блоков/тр-ий, 17.5к — контроллеры для интерфейса, 15.5к — шаблоны.
Поддерживаются PostgreSQL, SQLite, MySQL.
Тех, кто будет тестировать мое творение, предупреждаю — могут быть баги, и если у Вас есть время, черкните о них, пожалуйста, на darwin@dcoin.club или в личку на хабре. Пожелания и советы тоже приветствуются.
В первых четырех частях я рассказал про то, как в dcoin функционирует веб-сервер, про html/template, базы данных, плавное завершение приложения, шифрование и парсинг блоков, Android-приложение.
В этой части я расскажу про компиляцию под IOS.
Начало
Первой сложностью было то, что у меня не было сертификата разработчика. А без него скомпилировать приложение не получалось. Айфона у меня тоже не было, также как и Мака. Дня 3 возился с установкой osx на virualbox, в итоге смог поставить только на vmware и наладить сеть с virtualbox, чтобы в консоле работать.
Выяснил, что в моему счастью, в xcode 7 появилась возможность компилить приложения с фришным сертификатом, который может создать любой желающий. И айфон 4s мне очень вовремя одолжили. Можно было с головой погрузиться в разработку.
Написал ей в ВК, сказала, что тел дома забыла, а сейчас у подруги. Я написал, что подожду её. После чего получил «Не звони и не пиши мне больше!!!!». Вопросов задавать не стал, позвонил в соседнюю квартиру, попросил передать цветы Кате, когда она будет дома. Приехал домой, через несколько часов принял решение переписать Dcoin на Go.
Через пару дней написал ей, что на несколько месяцев ухожу с головой в свой проект и попросил не беспокоить меня по пустякам.
Через неделю от Кати пришла смс-ка «привет. ну как ты там?». Я не ответил. Через неделю еще одна «привет. как дела?». Я снова не ответил.
Еще примерно через неделю она написала, что ей срочно нужно 7 т.р. в долг, т.к. ей не хватает на оплату за квартиру. Я ответил «OK». На следующий день она приехала ко мне домой.
Я не знаю, что у неё было в голове, наверное думала, что я буду к ней приставать. Весь вечер она была какой-то странной. Я был холоден и старался избегать любых прикосновений к ней. Мы поели, попили чаю. Катя сказала, что ей надо домой. Я вызвал такси.
Когда провожал её до такси спросил:
— Мы ведь не вместе да? Т.е. я могу делать что захочу?
Она: — В смысле «что захочу»? нет, мы вместе (пододвигается ко мне)
Я: — Ну у нас же не было первого свидания, мы еще не начали всё с начала.
Она: — Так вот было же только что.
Я: — Какое же это свидание, ты просто за деньгами приехала.
Мы уже стояли у дверей такси, я её усадил, расплатился с водителем, она уехала.
Утром зазвонил телефон, это была Катя. Я не поднял трубку.
На следующий день она прислала смс-ку «привет. я вчера звонила, ты не взял трубку». Я не стал отвечать.
Через неделю она написала, что получила з.п. и хочет скинуть мне на карту деньги. Я ни чего не ответил. Через несколько дней она написала «привет. как дела?». Я снова игнорировал.
Еще примерно через неделю я наконец запустил Dcoin на нодах и увидев, как идет генерации блоков и как они летают между нодами, наполняя базы данных. Мне показалось, что это можно считать завершением моего временного отшельничества и я написал Кате.
Она очень позитивно отреагировала на то, что я вышел с ней на связь, согласилась встретиться. Потом сказала, что у неё всё плохо, подружка с которой она снимала квартиру съехала и что она из-за стрессов каждый день плачет, еще и уволиться решила. Я решил, что, когда мы встретимся, предложу ей переехать жить ко мне и ни о чем не париться.
Скомпилировалось и запустилось всё без особых проблем. Открыл в браузере и… ничего. Но зато если зайти по сети на 127.0.0.1:8089 то выдавало кошелек. Стало очевидным, что при нажатии кнопки home приложение переходит в какой-то спящий режим.
По аналогии с андроидом решил сделать сервис. Но, оказывается сервисы на ios невозможны. Максимум что можно сделать — это повисеть в бэкграунде 600 секунд. Так то оно, конечно, логично — борьба за сохранность заряда аккумулятора. В общем, пришлось изучать, как там вообще работают приложения в ios.
Создал простенькое приложение в xcode, кинул на тел, работает. Начал копать структуру файлов и параллельно искать что-то похожее в gomobile, нашел вот этот файлик. Узнал про NSLog, определил место, куда он выдает инфу
Помню свою радость, когда увидел строки в логе, которые выводило мое приложение. Это было круто, связь налажена, дальше будет проще. Для меня возможность писать и читать логи — это, наверное, самое важное при разработке приложения.
Objectve-C я не знал, да и сейчас толком не знаю. Но было очевидно, что без понимания, как минимум, синтаксиса ничего не получится. Немного почитал уроки про Objectve-C, стало проще понимать код.
Погуглил про фоновый режим, выяснил, что надо в didFinishLaunchingWithOptions добавить вот такой код
// UIApplicationBackgroundFetchIntervalMinimum - чтобы наше приложение запустилось в бэкграунде при любом возможном случае
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
И добавить в info.plist
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
</array>
Gomobile генерит свой info.plist. Внести в него правки можно тут.
webView
То, что в браузере всё работало было конечно круто, но этого хватало лишь на 3 минуты, ведь когда открывается браузер приложение идет в фоновый режим и через 3 минуты падает. Без webView тут никак. Довольно долго разбирался, куда и как вставить webView, чтобы оно отображалось. GUI-то нет, всё в текстовом файле надо писать, а учитывая, что с разработкой под IOS я был вообще не знаком, мне было очень тяжко
В итоге, конечно, всё получилось и оказалось крайне просто.
Через день написала, что боится ехать на ночь к малознакомому парню. Я сказал, что думал что она пропала с концами и уже чуть не начал назначать свидания другим девушкам на эти выходные. Она разозлилась, ругалась.
На следующий день отправил шутки ради смс-ку «Весь день на свиданках, катаюсь на лодке, в мозолях руки и не только». Шутку она не поняла, разозлилась пуще прежнего, пришлось объяснить, что мол шутка это, дома я весь день был, код писал.
- (void)viewDidLoad
{
// в фоновом потоке спим 3 сек, чтобы веб-сервер мог успеть запуститься, к БД подключиться и пр.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[NSThread sleepForTimeInterval:3.0f];
// Переходим к выполнению кода в главном потоке
dispatch_async(dispatch_get_main_queue(), ^{
// собвственно сам webView
self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
NSMutableURLRequest * request =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://127.0.0.1:8089"]];
self.webView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
self.webView.scrollView.bounces = NO;
self.webView.scalesPageToFit = NO;
self.view = self.webView;
self.webView.delegate = self;
[self.webView loadRequest:request];
});
});
[super viewDidLoad];
}
В интерфейс ViewController надо добавить наш webView
@interface ViewController : UIViewController<UIWebViewDelegate,UIScrollViewDelegate,UITextFieldDelegate>
{
IBOutlet UIWebView *webView;
.....
}
@property(nonatomic,retain)UIWebView *webView;
Уведомления
«Раз всё так просто, то надо сделать и уведомления» — подумал я.
Objectiv-C код пришлось внедрять в Go
// +build darwin
// +build arm arm64
package sendnotif
/*
#cgo CFLAGS: -x objective-c
#cgo LDFLAGS: -framework Foundation -framework GLKit -framework UIKit
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <GLKit/GLKit.h>
void
ShowMessM(char* title, char* text) {
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.alertTitle = [NSString stringWithUTF8String:title];
localNotification.alertBody = [NSString stringWithUTF8String:text];
localNotification.timeZone = [NSTimeZone systemTimeZone];
localNotification.applicationIconBadgeNumber = 1;
localNotification.repeatInterval = NSCalendarUnitMinute;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
[localNotification release];
}
*/
import "C"
func SendMobileNotification(title, text string) {
C.ShowMessM(C.CString(title), C.CString(text))
}
В Go коде использовать так: sendnotif.SendMobileNotification(«Заголовок», «Текст уведомления»)
И в didFinishLaunchingWithOptions надо добавить:
if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
{
// iOS 8 Notifications
[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[application registerForRemoteNotifications];
}
else
{
// iOS < 8 Notifications
[application registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];
}
Это чтобы при запуске у пользователя вылезло сообщение с запросом прав на использование уведомлений.
Заключение
На этом я заканчиваю серию статей про свой опыт перехода с PHP на Go. Надеюсь мой материал был кому-то полезен. Если будут вопросы про кроссплатформенную разработку на Go, пишите в личку, помогу.
Сейчас уже 6-й месяц живу с Машей. Недавно завели кота.
P.S.
В Dcoin сейчас можно получить бесплатные монеты (хватит на оплату инета на несколько месяцев).
Комментарии (95)
c-darwin
15.04.2016 13:19+5Топик в минусах. Подскажите, пожалуйста, что я сделал не так?
xakepmega
15.04.2016 13:27+35Наверное все дело в Маше, все ждали то хеппиенда с Катей.
c-darwin
15.04.2016 13:31+1Тут я бессилен. Только если вдруг с Машей расстанемся, тогда появится продолжение истории про Катю.
LoadRunner
15.04.2016 15:12+20Неужели, после всего, что было, возможно продолжение истории про Катю? Я думал, что всё, история с Катей закончена навсегда.
0xd34df00d
15.04.2016 16:44+8Да всё вы сделали так, просто… Ну, например, я пишу код на C++ и Haskell и горя с девушками не знаю.
Про девушекПотому что и девушек не знаю, и вокруг меня их практически не было лет с 17, когда у меня был относительно социоактивный год и я хотя бы общался с кем-то, и поэтому makcums немножко прав, и я не представляю, как так можно взять и познакомиться в ВК, или вообще где-то.c-darwin
15.04.2016 17:23При знакомстве через инет надо учесть много факторов. Но самое главное — писать разным девушкам, кто-то да ответит. У меня, если не ошибаюсь, был 1 ответ на 50 (может меньше, точно не помню). Если хотите, помогу, пишите в личку.
0xd34df00d
15.04.2016 17:32Тут вопрос чуть более комплексный, чем «кому писать», так что фиг с ним (но спасибо за добрый порыв!).
Да, тем более, мне и так норм, просто ещё вчера с вечера заметил в обсуждаемых пост про Go, сегодня с утра захожу, хочупотролпопереписываться на тему перспектив Go для программиста — а его в обсуждаемых уже нет, зато другой пост про Go есть. Думаю, дай зайду тоже, погляжу, а тут одни девушки. Вот и фрустрация.
IvaYan
15.04.2016 17:33+4Напишите статью, а то вам сейчас личку завалят :) И что бы по-научному, с графиками, Data Mining, IPython, вот это вот все :)
А по теме — поздравляю автора, все хорошо, что хорошо закончилось
maiketa
15.04.2016 19:16+1С таким фундаментальным подходом… при таком количестве входных переменных…
А у вас, случайно, нет реализации поиски девушки на VK?
Я согласен даже на PHP и костыли.
alexraven
20.04.2016 01:16+2Лучше бы просто сразу завел кота, и топик не был бы в минусах. А то Кати понимаешь, Маши. А кот — это кот.
rule
15.04.2016 13:52+62Всё отлично, как по мне всё очень даже символично. Автор перешел с РНР на Go и с Кати на Машу. Ибо зачем себя мучать то?
AndrewN
15.04.2016 13:55+8ПроКатюМашу. Как-то все у автора не состыковывается и создается впечатление что автор все сочиняет на ходу, не могу понять что именно меня настораживает, но первые посты с этим последним как-то не в одном русле…
Эта концовка как-то быстренько все завершает и обрывает историюc-darwin
15.04.2016 14:18+3Всё написанное мной — правда.
Когда сильно влюблен, то ведешь себя совершенно по другому. И пересказывать истории я плохо умею, поэтому может показаться что-то в разном русле.
vadoo
15.04.2016 16:01+2И переживаю, и сочувствую автору, но в возрасте за 30 вести себя, как в 20?
Urichalex
15.04.2016 17:14+3Есть люди, которым кроме кода ничего не нужно. Есть люди, которые любят алкоголь и тусовки. А есть люди, которые не могут быть одни. Я автора понимаю, ибо сам умудряюсь совмещать код с отношениями
vadoo
15.04.2016 18:00+1Вероятно, мой вопрос поняли по-другому) Я считаю, что автор делает всё правильно-в жизни должен быть и код, и алкоголь, и тусовки, и отношения(перечислено в случайном порядке). Просто меня удивили некоторые моменты поведения в отношениях. Или же, как вариант, по описанию я представил себе неверную картину.
P.S. господа, а можете черкнуть пару слов о минусах? для моего понимания просто. благодарюUrichalex
15.04.2016 18:05Видимо, действительно, кто-то что-то не понял, или не так понял. Ушла девушка -> не могу быть один -> поиск новой девушки -> я не один.
Многие долгое время сидят и ждут в мечтаниях (посещая злачные сайты). А другие не ждут, и действуют сами. Пусть это выглядит жесто? ко. Но ведь и Катя не ангел0xd34df00d
15.04.2016 18:21+1Чем же жёстко? Скорее, такая готовность к действиям выглядит как повод для зависти, а не жёсткость.
0xd34df00d
15.04.2016 18:22и алкоголь, и тусовки, и отношения
Обижаете хикк.vadoo
15.04.2016 19:24Ни в коем случае.
Я считаю это нормальным и правильным. Вы считаете нормальным и правильным противоположные вещи.
Обижать это когда Вы мне или я Вам буду говорить, что нормально и правильно. Согласны?0xd34df00d
15.04.2016 19:26+1Вы меня запутали :(
Чем «я считаю это нормальным и правильным» отличается от «это нормально и правильно»?
Я бы понял ещё, наверное, разницу этих утверждений с «это нормально и правильно для меня», но тогда есть некоторые вопросы к слову «нормально» в контексте одноточечной выборки.
HunterNNm
15.04.2016 13:55Пришлось перечитать сначала предыдущую часть — уже забыл, на чем там закончилось…
c-darwin
15.04.2016 13:56Кстати. Если кто-то будет 21 апреля на выставке стартапов TechDay в Нью-Йорке велкам к нашему стенду.
И еще. В Dcoin сейчас можно получить бесплатные монеты (хватит на оплату инета на несколько месяцев).cheshir_Kat
15.04.2016 14:49+1Участие на выставке звучит как хэппи-энд основной сюжетной линии. Добавьте в основной текст
Profi
15.04.2016 15:12+2В какой-то момент подумал, что девушки в квартире видели то чего не видел сам хозяин о_О Сорри, что не про Dcoin, хотя чего это я, тут все комментаторы не про Dcoin.
Biblusha
15.04.2016 17:40Спасибо за статью.
какой IDE/редактором кода пользовались?
как он подсвечивает Objective-C код в блоке /*...*/?
будете открывать код?
и как запускали Go-код на iPhone?c-darwin
15.04.2016 18:33Intellij idea. Код не подсвечивает, как комменты получается.
Создавал .app при помощи gomobile и кидал через itunes на девайс.Sirikid
15.04.2016 20:24Кстати, можно попробовать замутить language injection в комментарии, не знаю можно ли такое сделать в комментарии но, регексы в Java-строках и синтаксис в теге ``` в Markdown подсвечивает. Надо будет попробовать.
Sasha_Pitenin
15.04.2016 17:40Читал статью только из — за интереса продолжения истории про Катю, а не из за криптовалюты :-)
twileck
15.04.2016 18:16Интересно аудиторию к своей статье привлек за счёт личной жизни, сам дочитал с удовольствием :)
yuriy12
15.04.2016 18:28+1Отличная серия статей про GO!
Насчет Маши:
Исходя из личного опыта и ни в коем случае не в порядке осуждения: как то не сильно стыкуются два утверждения:
1. «Осталась на ночь после 3-го свидания»
2. «никогда не было»
Если не секрет, сколько лет Маше?c-darwin
15.04.2016 18:28На тот момент было 19
yuriy12
15.04.2016 18:42Вам повезло, во времена моей молодости(середина 90х) девушку старше 16-и у которой «никогда не было» найти было практически нереально. Берегите Машу! Счастья вам обоим!
И… ждём статьи про GO (даже если без Маши:)) и новостей про вашу криптовалюту0xd34df00d
15.04.2016 18:50Эм, а в чём везение?
Лично мне было бы стрёмновато с девушкой, у которой никогда не было. Быть первым — большая ответственность, к которой лично я не готов. Мало ли, вдруг я потом девушке на всю жизнь желание отобью?yuriy12
15.04.2016 18:56Судя по спойлерам автору за 30 и он искал девушку для серьезных отношений. Они вместе довольно приличное время. Я считаю что ему повезло и думаю что он и сам так считает. Давайте спросим у Дмитрия?
0xd34df00d
15.04.2016 19:03Давайте спросим. Но мне и ваше мнение интересно услышать, раз вы думаете, что ему в данном контексте повезло.
yuriy12
15.04.2016 19:23По молодости я думал точно так же. Начало девяностых и «сексуальная революция» в постсоветском пространстве не оставляли шансов целомудрию. Думаю что процент девственниц к совершеннолетию был в районе статистической погрешности. Собственно проблема не в целомудрии как таковом а в восприятии отношений как к виду развлечений. Где-то к 25-и мои взгляды на этот вопрос изменились. Появилась ответственность. Одного лишь секса стало недостаточно для отношений. Перспектива Разделить судьбу с дамой, к которой нет ни капли доверия не радует. Так что по моему если девушка сохранила целомудрие до совершеннолетия, как минимум имеет голову на плечах и сможет сохранить верность.
Прошу прощения за оффтопик в технической теме.0xd34df00d
15.04.2016 19:32+1Да тут вся тема оффтопик :)
Мне известны примеры, когда девушки останавливались далеко не на первом парне (и для него, соответственно, они целомудрие не сохранили). И ничего, верно и целомудренно всё.
Точно также мне известны примеры, когда до того целомудренным и верным я-с-одним-первым-и-единственным-парнем-уже-5-лет-девушкам лет в 25-28 срывало башню, и они пускались во все тяжкие.
Точно также мне уже, к сожалению, на более личном опыте известны случаи, когда сохранённое целомудрие означает лишь отсутствие интереса к сексу, а не голову на плечах. В силу определённых причин уже мне, в свою очередь, не хватило тогда опыта, головы на плечах и чего-то ещё сделать правильные выводы.
В общем, вопрос сохранности целомудрия ИМХО ортогонален вопросу верности.yuriy12
15.04.2016 19:35Возможно Вы правы. Но наши с вами доводы можно проверить только путем проб и ошибок.
0xd34df00d
15.04.2016 19:36+1Надо придумать дизайн двойного слепого тестирования в данном случае.
yuriy12
15.04.2016 19:42Надеюсь «слепого» в переносном смысле :) Как говорят в Италии: «Occhio vuole la sua parte» :)
vadoo
15.04.2016 19:20Если у девушки это была жизненная позиция, то я присоединяюсь по поводу «повезло»
Stas911
16.04.2016 00:25+1Имхо, ценность таких девушек, особенно для длительных отношений, сильно преувеличена, ввиду неиллюзорной вероятности наличия огромных тараканов в голове.
Надеюсь, автору повезло и они будут жить долго и счастливо.
AndreyS1
15.04.2016 19:53прочитал только под спойлерами, скачал DCOIN => возник вопрос как в go с GUI и IDE
c-darwin
15.04.2016 19:55У меня IDE Intellij idea+go плагин
С GUI сложно, проще использовать хромиум (https://github.com/breach/thrust)
uvelichitel
15.04.2016 20:01IBM выложила в opensource 44kloc blockchain на Go https://github.com/openblockchain. Ваша работа?
grigorym
15.04.2016 20:03В прошлый раз я испытывал такое опустошение от закончившегося литературного опуса, когда первый раз дочитал до конца Властелина Колец. Спасибо, автор!
cortwave
16.04.2016 01:18+2Может, немного не по теме Кати, но все-таки. На веб-версии dcoina удивила одна вещь, конкретно способ авторизации: перетащить private key в окошко. Я конечно не очень силен в криптовалютах, но такой метод авторизации, когда private key должен куда-то передаваться, выглядит не очень надежным.
c-darwin
16.04.2016 09:22По другому в веб-версии не сделать. Там ключ пишется в тело html, на сервер не передается, при генерации подписи берется через js из html.
Безопаснее, конечно, качать кошелек на ПК/мобильный и ставить пароль на ключ.
Изначально веб-версия не планировалась, но пользователи стали просить, пришлось сделать.
4ertovo4ka
16.04.2016 04:44Мне вот интересно — а у Кати и/или Маши аккаунты на хабре есть?
А то взгяд на проблему какой-то однобокий :(IvaYan
16.04.2016 12:39Насколько я помню из комментариев автора, ни та ни другая не знают об этой хабра-эпопее. Думаю, если бы аккаунты были бы, то зна ли бы.
dimmidrol
16.04.2016 09:10теперь надо заново перечитать и не обращать внимание на Катю и Машу)
Я удивлён Вашему упорству в работе. Продолжайте, жду новых историй.
ComodoHacker
16.04.2016 12:42-1Зашел в топик ради интереса: будет ли хоть один комментарий не про Катю?
ainu
16.04.2016 18:47+1История про Катю очень, очень, очень сильно напоминает сюжет фильма «500 дней лета».
Drag13
Спасибо за… Машу :)