App Store Release Informer 1.1.0
Переписал своего бота на ES2015, плюс добавил тесты. Когда бот пишет о том, что вышла новая версия в App Store, то пишется и что нового в этой версии.
Переписал своего бота на ES2015, плюс добавил тесты. Когда бот пишет о том, что вышла новая версия в App Store, то пишется и что нового в этой версии.
Пара мыслей о Carthage в сравнении с CocoaPods.
Чтобы перевести дату из текста в NSDate из немного нестандартного вида с миллисекундами:
let dateString = "2016-04-22T17:42:46.762+03:00"
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let myDate = dateFormatter.dateFromString(dateString)
Вышло обновление CompareShots версии 1.1.
Из нового - прозрачность теперь меняется просто перетаскиванием пальца (горизонтально). Причём такую фичу попросил один из пользователей в письме. К тому же так прозрачность меняется плавнее.
Кроме того, переписал полностью приложение на Swift. Теперь у меня есть аж один зарелизенный проект на нём :) Но это только начало.
Что удивительно - обновление в App Store я отправил вчера, и менее чем через сутки оно уже прошло Review и вышло. Ни разу так быстро Apple на моей памяти так быстро не пропускали приложение.
Функция-шпаргалка для логирования в Swift:
import Foundation
/**
Лог-функция с выводом файла, метода и строки, откуда вызывается.
Пример использования: DLog("привет")
- parameter messages: тексты/объекты, которые надо вывести
- parameter fullPath: путь до файла, который вызывается
- parameter line: номер строки в файле
- parameter functionName: название метода/функции вызова
*/
func DLog(messages: Any..., fullPath: String = #file, line: Int = #line, functionName: String = #function) {
let file = NSURL.fileURLWithPath(fullPath)
for message in messages {
print("\(file.pathComponents!.last!):\(line) -> \(functionName) \(message)")
}
}
// Пример:
DLog("message 1", "message 2")
// YourClass.swift:42 -> someMethod() message 1
// YourClass.swift:42 -> someMethod() message 2
Эту часть выпустили параллельно с Assassin's Creed III. Её делали для карманной консоли PS Vita, но потом выпустили HD версию для взрослых консолей и PC. Однако, очень заметно, что делали её не для них.
Игра тормознутая и глючная. У меня какие-то нереальные лаги были при запуске. Поменял разрешение игры на 1920x1080 она стало плавной. Но управление на компе очень кривое, постоянно какие-то глюки с ним возникали. Один раз и вовсе движок почему-то решил, что я в воде, хотя я был на суше. В итоге персонаж болталась в воздухе под звуки хлюпанья воды и не могла двигаться никуда. Пришлось загружаться с контрольной точки. Жаль, что я в неё играл после прекрасной IV части (Black Flag), ибо на таком контрасте она выглядит ещё хуже.
Главный персонаж - девушка по имени Авелина. Единственное оригинальное отличие этой части от других - что можно переодевать её. 3 внешних вида для разных целей. Леди - дама в платье, не умеет лазать по зданиям и драться, но умеет очаровывать и нигде не вызывает особо подозрений. Рабыня - девушка в простой одежде (по сюжету Авелина дочь рабыни, которую освободили и взяли на воспитание в богатую семью), умеет лазать и сражаться, но не так, чтобы очень. Позволяет пролезать во всякие места под видом работницы и не очень вызывать подозрения у охраны. Асассин - полный боевой наряд, позволяет пользоваться всеми оружиями и рубиться по полной. Сразу вызывает подозрения у стражников.
В игре можно плавать на каноэ. Однако, поскольку управление очень кривое, постоянно с этим проблема. То врежешься, то не повернёшь, то просто встрянешь и не плывёшь дальше.
Локаций несколько. С одной стороны есть яркие места, с другой всё как-то также уныло и тоскливо выглядит как и в Assassin's Creed III.
Хотя вот Чичен-Итца порадовала. Древний храм, пещеры, катакомбы, неплохо.
Главные злодеи - какие-то невнятные. Сюжет тоже. Всё какое-то унылое и, по-моему, дико затянутое. Пока играл - раза 2 или 3 думал, что вот, наконец уже конец игры, но нет, сюжет зачем-то продолжался дальше. В отличие от других частей, заниматься всякими не сюжетными делами вроде покупки и открытия заведений в городе, совсем не хотелось, ибо оно как-то довольно бессмысленно выглядело. Пузомерок тоже нет почти, даже не пишется число точек для синхронизации.
Как и III части, можно лазить по деревьям и веткам в лесах. Пара прикольных миссий с этим связанных всё же было. Но их, опять же, кривое управление портило.
Графика тоже не фонтан, кроме, разве что, детализации персонажей. И то не всех, и то не целиком. Ну, оно, в принципе, и понятно. Делали изначально для карманной консоли.
В один из моментов отправляешь в Нью-Йорк, где встречаешься с героем III части индейцем Коннором. Только вот он нихрена не похож ни на героя III части, ни вообще на индейца. Только наряд его (на скрине выше не он). Тоже как-то странно.
Самое интересное у этой игры в конце. Причём после титров, когда ты думаешь, что всё кончилось определённым образом. Но всё-таки, вряд ли у меня появится желание снова сыграть в эту часть. Хотя мне, как фанату этой серии, посмотреть на неё всё же хотелось. Игра проходится за 3 вечера, для ознакомления можно поиграть.
Пока кодю на Node.js нужно постоянно что-то выводить в консоль. Например, ошибки. Но для большей информативности удобнее знать, где именно ошибка выводится. Тем более, что пока кодил под iOS такой удобный макрос всегда был под рукой, а с Node.js пришлось погуглить и поковыряться, т.к. многие примеры со Stack Overflow просто падали на последней версии Node.js 5.10.0. Падали из-за использования в них Error.captureStackTrace(err, arguments.callee), а сейчас уже нужно использовать NFE.
В итоге сделал то, что хотел. Оставлю тут как шпаргалку.
npm install colors --save
Файл logger.js:
'use strict';
let colors = require('colors');
colors.enabled = true;
exports.p = function logger(somethingForPrint) {
somethingForPrint = somethingForPrint || '';
const originalPrepareStackTrace = Error.prepareStackTrace;
Error.prepareStackTrace = (error, stack) => { return stack; };
let e = new Error;
Error.captureStackTrace(e, logger);
const stack = e.stack;
const filename = stack[0].getFileName().split('/').reverse()[0];
const trace = filename + ':' + stack[0].getLineNumber() + " " + colors.bold.black('%s') + "\n";
Error.prepareStackTrace = originalPrepareStackTrace;
console.log(trace, somethingForPrint);
};
Использовать:
const logger = require('../utils/logger');
logger.p('something happened');
// file.js:401 something happened