Arm1.ru

Tag: «полезное»

Анимация касания индикатора в UISlider

Стояла задача - при касании слайдера анимировать в приложении сделать анимированное увеличение ползунка. Так же, как это сделано у Apple в приложениях Apple Music и Podcasts в плеере, когда начинаешь перематывать позицию воспроизведения. Пока искал способ сдандартными средствами, убил немало времени. Очень не хотелось писать прям свой кастомный слайдер, хотелось использовать системный UISlider, что мне, в итоге, и удалось.

Читать далее...

comment comments

Лог-функция для Swift с выводом файла, метода и строки

Функция-шпаргалка для логирования в 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

comment comments

Простой console.log с выводом файла и номера строки в Node.js

Пока кодю на 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

comment comments

Transparent Image Viewer для OS X

Я всё пытаюсь что-нибудь придумать, чтобы можно было удобно делать pixel perfect вёрстку экранов при разработке iOS-приложений. Чтобы можно было удобно и наглядно сравнивать макет и результат. Запилил сегодня вот такую тулзу для OS X - почти прозрачное окно, в котором можно октрыть макет, наложить на Xcode или на симулятор и смотреть, что получилось. Ползунком можно менять прозрачность, чтобы проверять соответствие.

Может кому пригодится. А может кто-то тоже чувствует боль и поучаствует в разработке.

Исходники лежат на github.

Скачать бинарник.

P.S. моё первое приложение для OS X.

comment comments

Категория CALayer+UIColor

Хорошую штуку нашёл на Stack Overflow. В Xcode в Interface Builder можно задать что-то для UI через User Defined Runtime Attributes. Мне понадобилось задать border. Так вот толщину границы layer.borderWidth задать можно и она подхватится, а вот цвет - нет. layer.borderColor хранит значение типа CGColorRef, а цвет, который ты можешь выбрать в Interface Builder - это UIColor. Простая категория позволяет использовать UIColor через свойство layer.borderUIColor.

CALayer+UIColor.h :

//
// CALayer+UIColor.h
//
// Created by Sergey Armodin on 29/05/15.
// Copyright (c) 2015 Sergey Armodin. All rights reserved.
//

#import
#import

@interface CALayer (UIColor)
/**
* CGColor to borderColor
*/
@property(nonatomic, assign) UIColor* borderUIColor;
@end

CALayer+UIColor.m :

//
// CALayer+UIColor.m
//
// Created by Sergey Armodin on 29/05/15.
// Copyright (c) 2015 Sergey Armodin. All rights reserved.
//

#import "CALayer+UIColor.h"

@implementation CALayer (UIColor)
/**
* Setter
*
* @param color UIColor
*/
- (void)setBorderUIColor:(UIColor *)color {
    self.borderColor = color.CGColor;
}

/**
* Getter
*
* @return UIColor
*/
- (UIColor *)borderUIColor {
    return [UIColor colorWithCGColor:self.borderColor];
}
@end

И вуаля:

comment comments

Симуляция плохого соединения с интернетом в OS X

Оставлю ещё одну шпаргалку в виде ссылки. Network Link Conditiner - тулза от Apple из набора Hardware IO Tools for Xcode. Позволяет лимитировать в макоси скорость соединения. Можно протестить, например, как приложение ведёт себя в условиях EDGE-соединений или хуже. То же самое есть в разделе Developer в настройках iOS, но то на девайсе, а тут в OS X.

Кстати, в том же наборе лежит симулятор для HomeKit. 

comment comments

node-couchdb-mover

На днях написал свою первую тулзу node.js. Писал лишь отчасти для себя, т.к. для меня она пока не очень актуальна, а вот кое для кого даже очень.

Тулза для CouchDB. Т.к. CouchDB хранит после изменений/удалений документов ревизии и не всегда их очищает, бывает, что база адски растёт в размере. Например, у ребят, для которых эта тулза актуальна сейчас, то, что должно весить 6 гигов, весит 50-60. Может быть они где-то запустили что-то или накосячили, понаменяв и понаписав кучу всего в базу, чем люто увеличили её размер. В общем, проще просто создать новую чистую базу и перенести туда все живые документы.

Тулза просто берёт все документы из 1 базы в CouchDB, и кладёт их в другую. Работает пока довольно топорно, берёт все документы скопом и потом по 1 кладёт в базу. Для баз с относительно небольшим количеством документов работает нормально, а вот если их там тысяч этак 80, то у меня на компе получение документов длилось около 4-5 минут. Поэтому переделаю её вскоре, чтобы брала документы пачками и фигачила внесение в базу не асинхронно, а по очереди.

Но пока пользоваться можно. Тулзу можно встроить, например, в свой node.js проект.

В консоли:
npm install node-couchdb-mover

В коде:
var mover = require('node-couchdb-mover');
mover.moveDocuments( 'dbName1', 'dbName2');

Кроме того, её можно использовать прямо из консоли:
npm install -g node-couchdb-mover
couchdb-mover --from=dbName1 --to=dbName2

 

Ну, и как это положено, исходники на гитхабе | пакет на npmjs.org.

comment comments

Как узнать ретина дисплей или нет?

Ко мне в блог много заходов из поисковиков по запросам вроде "Как определить дисплей retina". Попадают они ко мне на статью про Objective-C, но ищут они явно не код :) Запили в итоге такую вот страничку, на которую надо просто зайти через браузер с вашего iOS-устройства. Если ретина - результат будет залёным, как на скрине выше. Если не ретина - то красный, как на скрине ниже.

 

Работает для iOS-устройств (iPhone, iPad, iPod) и MacBook Pro Retina. На экранах с высокой плотностью пикселей на дюйм тоже пишет, что retina :)

Адрес страницы: http://arm1.ru/retina/

comment comments

Скрипт для фиксирования блока при скролле

Давно хотел такую штуку сделать, чтобы при скролле страницы какой-то блок скроллился вместе со страницей до определённого момента, а потом прилипал. Сегодня нашёл такой плагин под названием jQuery Sticky Scroller

Скачать его можно тут.

Подключается он довольно просто:

var scroller = new StickyScroller("#menu",
{
start: 270,
end: 50800,
interval: 200,
range: 100,
margin: 0
});

Собственно, по названию параметро понятно, что когда скролл уходит за 270 пикселей от верхней границы страницы - элемент #menu фиксируется на странице, то есть получает свойство CSS "position: fixed;". Параметр end отвечает за нижнюю границу отслеживания скролла, на случай, если фиксированным эллемент должен быть не всегда. Параметр margin задаёт то - с каким отступом от верхней границы окна браузера будет находиться элемент. 

У плагина есть также несколько публичных методов, описывать их смысла не вижу, описание есть на странице плагина.

Примеры поведения такого блока: Яндекс.Музыка. Конкретно это плагин я применил на avrora-zal.ru, ну и пример с более сложным его использованием на сайте автора.

comment comments

Увеличение громкости iPhone 4

Увеличение громкости iPhone 4

 

У меня iPhone  4 из Франции. В телефонах для продажи во Франции Apple обязали ограничить громкость звука в наушниках, мол, заботятся о своих гражданах и не хотят, чтобы они глохли. Мне, в условиях метро, громкости в итоге не хватает, к тому же наушники бывают разные, какие-то играют громче, у каких-то сопротивление другое и они играют тише. 

В общем это ограничение можно обойти. Для этого нужно сделать Jailbreak, после чего получить доступ к файловой системе и изменить пару plist-файлов. Вариантов много - от установки какого-нибудь Терминала через Cydia, до монтирования телефона как раздела на компе. Мне больше нравится второй вариант - поставил Phone Disk - он подклчил мой телефон как раздел, а дальше надо пошариться по файловой системе.

Читать далее...

comment comments

Встраивание Facebook sdk в ios-приложение

Шпаргалка. Инструкция по тому, где скачать и как встроить - в документации Facebook. Несмотря на то, что обновляли они проект на Github недавно (23 ноября на данный момент), в нагрузку идёт у них старая версия фреймворка для работы с JSON. А, т.к. в мой проект уже встроена более новая версия фреймворка приложение не компилилось.

Решение:

  1. после добавления SDK в проект удалить папку JSON из SDK Facebook;
  2. в файле FBRequest.m заменить строку #import "JSON.h" на #import "SBJson.h";
  3. в том же файле строку SBJSON *jsonParser = [[SBJSON new] autorelease] заменить на SBJsonParser *jsonParser = [[SBJsonParser new] autorelease].

Должно работать. 

comment comments

Обрезание слэша в url с 301 редиректом

А собственно почему бы и не повесить этот тут, потом будет легко найти, когда опять понадобится. Зачастую поисковики воспринимают страницы вида:
//arm1.ru/blog/yandex-upal-panika-v-twitter
//arm1.ru/blog/yandex-upal-panika-v-twitter/
  как разные страницы. Получается, что один и тот же контент технически по двум разным страницам, что не есть хорошо. Под катом код для автоматического отрезания символа / в конце с 301 редиректом, чтобы поисковики не дублировали страницы при индексировании.

# убираем QUERY_STRING строку из REQUEST_URI
$uri = $_SERVER['REQUEST_URI'];
if ( false === empty( $_SERVER['QUERY_STRING'] ) )
	$uri = str_replace( '?' . $_SERVER['QUERY_STRING'], '', $uri );
			
# переадресация через 301 редирект при присутствии слэша в конце $uri
if ( substr( $uri, -1 ) == '/' && strlen( $uri ) > 1 ) {
	$queryString = '';
	if ( false === empty( $_SERVER['QUERY_STRING'] ) )
		$queryString = '?' . $_SERVER['QUERY_STRING'];
 
	header( 'Location: ' . substr( $uri, 0, -1 ) . $queryString, true, 301 );
	exit;
}

 

comment comments

Пара настроек FCKEditor

В качестве шпаргалки - чтобы быстро настроить FCKeditor. Хоть он уже и устарел и разработчики делают CKEditor - но в нём нет бесплатного файлового менеджера, а в CKEditor - есть.

Это что-то вроде шпаргалки для быстрого подключения FCKEditor.

Читать далее...

comment comments

Ресайз анимированных gif-изображений с помощью Imagick

 По работе столкнулся с необходимостью обработки анимированных gif-аватарок. Исходные картинки могут быть любого размера, и их нужно уменьшить до нужного размера с кадрированием до квадрата. Под катом - как мы это решали.

Читать далее...

comment comments

Простой онлайн TimeStamp конвертер

По работе периодически приходится смотреть какие-то данные из базы. Время мы в основном храним в TimeStamp (кто не знает - это количество секунд, прошедших с сотворения мира Unix, то есть 1 января 1970 года).
По цифре вроде 1305233826 хрен поймёшь, что это за дата. Каждый раз писать в каком-нибудь скрипте конвертирование неудобно, поэтому сделал онлайн-конвертер. Показывает время в удобочитаемом виде.

Enjoy. Online TimeStamp Converter

comment comments