Страницы

Поиск по вопросам

четверг, 22 ноября 2018 г.

Что лучше использовать: сессии или куки?

У меня на сайте все блоки обновляются через jQuery. Так как хочу сократить SQL запросы, хочу сделать маленький кэш. И вот думаю использовать сессии.
Суть вопроса: что лучше использовать сессию или куки? Для каждого блока - разное время обновления.


Ответ

Если вам надо хранить интерфейсную информацию: например, чтобы отмеченные чекбоксы не сбрасывались при перезагрузке страницы, то используйте куки. Если вы хотите хранить информацию, связанную с безопасностью, то однозначно сессии - их подменить можно, но очень трудно. И да, как уже было сказано, и то, и то не работает при выключенных куках.

Авторизация через социальные сети

Всем привет. Хочу реализовать возможность заходить и регистрироваться на сайте через социальные сети, но появилось несколько вопросов, по поводу реализации данной задумки. Имеются различные сервисы по реализации этого метода Loginza и uLogin. Они как бы удобные, но в тоже время нет. Решил реализовать самостоятельно. У меня уже имеется база с пользователями, где человек авторизовывается на сайте с помощью е-маил и пароля. Стал интересен момент, что если использовать сервисы, то один человек, в зависимости в сколки соц. сетях он зарегистрирован он может создать зарегистрировать более одного аккаута, что я бы не хотел. Пробовал uLogin, вроде все удобно, кроме перечисленного недостатка выше и еще после регистрационного момента, человека редиректит на мой сайт и передает ему данные для обработки в POST. Мой сайт реагирует на это, как на попытку атаки csrf. Так же метод зависит от сервиса, в случаи неполадки функция не будет работать на моем сайте. Первый вопрос, который я хотел бы узнать: Каким образом производится регистрация, если у меня уже есть база пользователей, где авторизация по е-маилам? Может ли человек зарегистрированный на сайте ранее пользоваться авторизацией через соц. сети? Если с помощью ВКонтакте авторировываться вручную, то он не дает адрес почты, а если через uLogin, то есть такая возможность. Второй вопрос, который я хотел бы узнать: Как предотвратить возможность клонирования аккаунтов из разных соц. сетей? Искал подобную информацию в интернете - не нашел. Если вы нашли, то ссылки будет достаточно. =)


Ответ

Сделайте привязку логинов из соцсетей/openid к аккаунтам на вашем сайте по схеме 1 аккаунт - несколько записей из соцсетей/openid. Если человек авторизовывается через uLogin/Loginzу, привязывать полученный результат к уже существующему аккаунту (сверять по адресу почты) или создавать новый при отсутствии такого имейла в вашей базе. То есть, если на разных логинах соцсетей/openid у человека одинаковый адрес email - при входе через эти разные логины всё-равно получится одна учётная запись на вашем сайте. Ещё, обратите внимание как это сделано на хэшкоде и на многих других сервисах: на странице "Настройки доступа" есть "внешние источники аутентификации для вашей учетной записи". Их может быть несколько, но все они ведут на одну учётку. Тоесть, если рассматривать email как "уникальный" ключ, то можно отследить повторные входы одного человека, тем более что uLogin при входе через вконтактик отдаёт адрес почты пользователя. Насчёт зависимости от сервиса посредника - это да, но вот только без него вам надо будет по отдельности налаживать взаимодействие с каждым из провайдеров авторизации. Можете попробовать сделать какую-нибудь резервную схему - с гуглом/вконтактиком/маилру наладить прямое взаимодействие, и, на случай если uLogin сломается, работать без посредника. Насчёт кода - и uLogin и Loginza предоставляют примеры работы и плагины для популярных cms/фреймворков. Можно скачать и изучить как они устроены.

Django. Кто как создает urlpatterns?

Меня интересует кто как создает urls для Django. Больше интересует динамически, чем вручную каждый путь руками писать. Например в ModelAdmin есть функция get_urls, которая для каждой модели создает свои пути. Делитесь своим опытом! def get_urls(self): from django.conf.urls import patterns, url
def wrap(view): def wrapper(*args, **kwargs): return self.admin_site.admin_view(view)(*args, **kwargs) return update_wrapper(wrapper, view)
info = self.model._meta.app_label, self.model._meta.module_name
urlpatterns = patterns('', url(r'^$', wrap(self.changelist_view), name='%s_%s_changelist' % info), url(r'^add/$', wrap(self.add_view), name='%s_%s_add' % info), url(r'^(.+)/history/$', wrap(self.history_view), name='%s_%s_history' % info), url(r'^(.+)/delete/$', wrap(self.delete_view), name='%s_%s_delete' % info), url(r'^(.+)/$', wrap(self.change_view), name='%s_%s_change' % info), ) return urlpatterns


Ответ

Посмотрел код. Здесь, на мой взгляд, несколько другой случай, нежели "нежелание писать руками". Так как джанговская админка - динамически подстраивается под зарегистрированные модели, ей необходимо регистрировать urlы таким способом. url(r'^$', wrap(self.changelist_view), name='%s_%s_changelist' % info), В этом коде то, в принципе, и нет динамических url - они все типовые. А их динамичность (то есть зависимость от имени используемой модели в данном случае) находится на один уровень выше (/my_model/ и /my_model/add/). Здесь же регистрируются типовые действия для каждой модели: история действий, добавить, удалить и т. д. Динамичность здесь выражается только в уникальном name, который используется в основном для reverse и создается главным образом, как я понимаю, для ускорения работы этой функции (чтобы не было необходимости в поисках нужной функции проверять ее на каждый регэксп - ну то есть для чего и был придуман этот атрибут: указал имя url - и вперед). Если у вас приложение делает нечто подобное джанговской админке - да, такая динамичность имеет место быть. В ином случае логике не место в url-паттернах, как я и написал в комментарии к вопросу.

Прилипание элемента к верху экрана при прокрутке

При загрузке некоторый элемент находится не в самом верху экрана. При прокрутке, когда верхняя часть документа скрыта, положение элемента фиксируется. Пример - поисковая строка Яндекса при просмотре результатов. Задача фиксации объекта (прилипания к верху экрана) решается при помощи javascript/jquery... Возможно ли сделать это на чистом CSS?


Ответ

Без js нельзя. Fixed Floating Elements. Смысл в изменении класса для элемента при скроллинге.

GIT: ошибка “Not a git repository”

Резко перестал работать GIT. Что я делаю:
Был проект. Я с ним работал давно и не трогал его совсем. И тут он мне понадобился.
Я выполнил команду git status, чтобы убедиться, что там ничего нету левого и все нормально и.... получил в лицо ошибку:
fatal: Not a git repository (or any parent up to mount parent ) Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
То же самое происходит при попытке выполнить любую команду. Я не расстроился и попытался клонировать git репозиторий еще раз. Вроде бы все успешно, репа клонирована, но и в ней происходит такая же ерунда.
В инете порылся, ответа, к сожалению, не нашел. Помогите, пожалуйста.


Ответ

Решено.
Git хранит в себе все права на файлы и папки. По неосторожности было выполнено chmod -R 0777 *, после чего git решил, что это слишком большие права и теперь он не является адекватным репозиторием.

Как найти файлы на хостинге по первой части имени?

Доброго всем времени суток, господа! Нужен совет php гуру. Есть на сайте директория tmp, внутри файлы, у которых известны имена (какое откуда), но не написаны расширения. Алгоритм такой, знаем первую часть имени - нужно найти есть ли файлы начинающиеся на это имя, и есть ли вообще, скажем начинается на f931992748863024fda1b647080e8ffa (я так подозреваю что в прошлом это был session_id, но не суть) Вот подскажите, как найти все файлы, которые начинаются на указанное имя? (их может быть несколько, может быть 1, а может и не быть) . file_exists(), к сожалению, требует точного совпадения. Вторая часть файлов обычно _1.txt, _5.docx ... в таком формате, т.е. подчеркивание, цифра, точка, и какое то расширение. Очень хотелось бы получить ответ на php p.s. формировать массив о содержимом каталога, и потом его перебирать - думаю не выход, т.к. конкретно у меня в каталоге более 10тыс файлов. Это займет много времени.


Ответ

Как вариант: $dir = opendir($path); $string_to_search='f931992748863024fda1b647080e8ffa';
while(($file = readdir($dir)) !== false) { $a[] = strstr($file,$string_to_search); } print_r($a); closedir($dir);

Наследование в С++

Есть вот такой вот код (пример): class A{ public: A(int x,int y){//конструктор с параметрами //nothing... } };
class B:public virtual A{ public: B(int x,int y,int z):A(x,y){//констрктор, в котором вызываются конструктор родитля, все логчно //nothing... } };
class C:public virtual B{ public: C(int x,int y,int z,int value):B(x,y,z),A(x,y){//вот только так работает //nothing... }
}; Почему в классе С приходится писать вызов коструктор A. Почему он не может вызваться из класса B? Есть какое-то подозрение, будто это связано с виртуальным наследованием. Но хочу узнать наверняка.


Ответ

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

Сортировка массива методом вставки в несколько потоков

Какие идеи есть, чтобы отсортировать массив элементов в n потоков методом вставки?


Ответ

Делим массив на n частей, сортируем каждую в отдельном потоке "вставками", а частичные результаты сливаем в один "слиянием", которое так же можно рекурсивно распараллеливать, если надо.

Алгоритм Шенкса-Тонелли

Есть две последовательности чисел:
x, x + 1, x + 2, ...
и
x2(mod n), (x + 1)2(mod n), (x + 2)2(mod n), ... где n — любое: n ⩽ x2
Необходимо найти первый элемент из второй последовательности, который делится на простое p
Простым перебором от начала последовательности это делать долго при большой последовательности и больших p
На сколько я понял, тут нужно использовать алгоритм Шенкса-Тонелли. Правда, я не понял, как его тут применить.
Собственно вопрос: как применить к данной задаче данный алгоритм?
Или, если вы знаете способ решить задачу еще быстрее — как это сделать?


Ответ

В общем, не так много где этот вопрос расписан, особенно, в русскоязычной литературе.
Я бы тоже не стал описывать ответ если бы не одно но: данный вопрос актуален при реализации алгоритма квадратичного решета на этапе просеивания. Решение данного сравнения позволит найти элементы, делящиеся на числа из факторной базы без перебора, что значительно ускорит процесс просеивания при больших простых из факторной базы.
Собственно, ответ на мой вопрос:
Сперва теория:
Рассмотрим конечное поле GFp (p > 2), и элемент a, являющийся квадратичным вычетом по модулю p. Требуется найти x такое, что x2 ≡ n (mod p).
Представим число p − 1 в виде p − 1 = 2rs, где s – нечетно. Заметим, что поскольку p − 1 – четно, то r ⩾ 1.
Пусть z – квадратичный невычет по модулю p. Вычислим y ≡ zs (mod p). Поскольку порядок любого элемента является делителем числа 2rs, то порядок y является делителем 2r, откуда y2r ≡ 1 (mod p). Можно также показать, что y2r−1 ≡ −1 (mod p), т.е. порядок элемента y равен в точности 2r
Вычислим далее элементы:
λ0 ≡ as (mod p) ω0 ≡ a(s+1)/2 (mod p)
Заметим, что ω02 ≡ aλ0 (mod p) и x2 ≡ a (mod p) ⟹ x2s ≡ as ≡ λ0 (mod p).
Поскольку порядок элемента xs является делителем 2r, то порядок λ0 является делителем 2r−1
Идея метода Шенкса–Тоннелли состоит в построении последовательности пар чисел (ωi, λi), удовлетворяющих условию:
ωi2 ≡ aλi (mod p) (i = 1, 2, 3, ...)
причем порядок λi+1 является собственным делителем порядка λi, до тех пор, пока порядок очередного λi не окажется равным 0. Тогда для найденного i выполнятся условия λi = 1 и ωi2 ≡ a (mod p) откуда x = ωi является искомым корнем.
Поскольку исходные значения (λ0, ω0) уже определены, то осталось просто описать формулы для вычисления значений (λi+1, ωi+1):
λi+1 ≡ λi · a · y2r−m(mod p) ωi+1 ≡ ωi+1 · y2r−m−1(mod p)
где m - порядок элемента λi. Так же, корнями будут все числа, кратные p.
Реализация же алгоритма крайне проста:
int Shenks_Tonelli(int p,long long n){ n=n%p; int s=p-1,r=0; //получаем разложение p-1 while(s%2==0){ s/=2; r++; } //начальные значения: λ и ω int l = PowMod(n,s,p); int w = PowMod(n,(s+1)/2,p); //находим порядок λ int mod=l,m=0; while(mod!=1){ mod=MulMod(mod,mod,p); m++; } //находим квадратичный невычет int z = quadratic nonresidue(p); //находим коэф-ты, на которые будем умножать int yd_l=PowMod(PowMod(z,s,p),pow(2,r-m),p); int yd_w=PowMod(PowMod(z,s,p),pow(2,r-m-1),p); //находим корень while(l!=1){ l=MulMod(l,yd_l,p); w=MulMod(w,yd_w,p); } return w; }
Правда, этап просеивания можно еще ускорить, если находить корни сравнения x2 ≡ n (mod pβ), и делить числа, отстоящие от них на pβ, постепенно понижая β. Корни такого сравнения находятся по индукции. Подробнее об этом здесь

Уменьшение размера Android приложения

Здравствуйте. Как при разработке под Android добиться минимального размера, готового, приложения? Увлекся изучением java и дроидом. Попытался сделать "локатор" с помощью Google Maps Android API v2. Полученный apk весит 657 кб, установленное приложение 1.87 мб. (100 строк кода, никаких картинок, ничего лишнего). Тот же "Антивирусов Dr.Web Light" - весит 2.24 мб. Как добиться, что бы готовое приложение занимало как можно меньше места без потери в быстродействии и функциональности? Заранее благодарен.


Ответ

Использовать ProGuard. Он вырезает все неиспользуемые функции. Так же можно отказаться от использования библиотек.

Правильно ли реализован паттерн Builder ? [закрыт]

Здравствуйте !!! Недавно, я приступил к изучению паттернов проектирования. Один из самых первых паттернов, который был реализован - это Builder. Какие у Вас есть замечания по данной реализации. Заранее спасибо ! Исходный код: 1) Абстрактный класс BaseCarBuilder public abstract class BaseCarBuilder { public abstract void buildCategory(CategoryCar pCategoryCar); public abstract void buildCarcass(CarcassType pCarcassType) ; public abstract void buildEngine(Engine pEngine); public abstract void buildColorCarcass(ColorCar pColorCar) ; public abstract void buildDoors(int pDoors) ; public Car getBuiltCar() { return null; } } 2) Класс Car. public class Car {
public final static int TWO_DOORS = 2; public final static int THREE_DOORS = 3; public final static int FOUR_DOORS = 4; public final static int FIVE_DOORS = 5;
private int doorsCount;
private Engine engine; private String carName; private ColorCar colorCar; private CarcassType carcassType; private CategoryCar categoryCar;
public Car(String pCarName) {
this.carName = pCarName; }
public ColorCar getColorCar() { return colorCar; }
public void setColorCar(ColorCar colorCar) { this.colorCar = colorCar; }
public CarcassType getCarcassType() { return carcassType; }
public void setCarcassType(CarcassType carcassType) { this.carcassType = carcassType; }
public CategoryCar getCategoryCar() { return categoryCar; }
public void setCategoryCar(CategoryCar categoryCar) { this.categoryCar = categoryCar; }
public int getDoorsCount() { return doorsCount; }
public void setDoorsCount(int doorsCount) { this.doorsCount = doorsCount; }
public Engine getEngine() { return engine; }
public void setEngine(Engine engine) { this.engine = engine; }
public String getCarInfo() {
String info = "car name = " + carName + " *** category car = " + categoryCar + " *** carcass tape = " + carcassType + " *** engine = " + engine + " *** color = " + colorCar + " *** count doors = " + doorsCount; System.err.println("---------------------------------------------------"); return info; } } 3) Класс MersedesBenzBuilder, который наследуется от BaseCarBuilder public class MersedesBenzBuilder extends BaseCarBuilder {
private Car car;
public MersedesBenzBuilder() {
car = new Car("Mersedes Benz"); }
@Override public void buildCategory(CategoryCar pCategoryCar) {
car.setCategoryCar(pCategoryCar); }
@Override public void buildCarcass(CarcassType pCarcassType) {
car.setCarcassType(pCarcassType); }
@Override public void buildDoors(int pDoors) {
car.setDoorsCount(pDoors); }
@Override public void buildEngine(Engine pEngine) {
car.setEngine(pEngine); }
@Override public void buildColorCarcass(ColorCar pColorCar) {
car.setColorCar(pColorCar); } } 4) Есть класс Директор (Диспетчер). public class Director {
public Car buildNewCar(BaseCarBuilder carBuilder, CategoryCar pCategoryCar, CarcassType pCarcassType, int pDoors, Engine pEngine, ColorCar pColorCar) {
Car tempCar = null;
if (carBuilder != null) {
carBuilder.buildCategory(pCategoryCar); carBuilder.buildCarcass(pCarcassType); carBuilder.buildDoors(pDoors); carBuilder.buildEngine(pEngine); carBuilder.buildColorCarcass(pColorCar); tempCar = carBuilder.getBuiltCar();
} else {
final String nullPoint = "Yoa are not create car_builder"; Exception exception = new NullPointerException(nullPoint); exception.printStackTrace(); } return tempCar; } }
5) Класс который запускает этот паттерн RunBuilderPattern.
public class RunBuilderPattern {
public static void main(String[] args) {
Car car = null; Director director = new Director();
MersedesBenzBuilder mersedesBenzBuilder = new MersedesBenzBuilder();
car = director.buildNewCar( mersedesBenzBuilder, CategoryCar.SPORT_CAR, CarcassType.CABRIOLET, Car.TWO_DOORS, Engine.PETROL, ColorCar.RED);
System.out.println("CAR INFO: " + car.getCarInfo()); } } 6) Дополнительные классы, точнее Enum-ы: public enum CarcassType {
SEDAN, UNIVERSAL, CABRIOLET, HATCHBACK, COUPE, LIMOUSINE }
public enum CategoryCar {
CARGO, PASSENGER, BUS, SPORT_CAR }
public enum ColorCar {
BLACK, WHITE, RED, GREEN, BLUE, ORANGE, BROWN }
public enum Engine {
DIZEL, PETROL, GAZ, HUBRID } 7) Вот что выводится в консоль: CAR INFO: car name = Mersedes Benz *** category car = SPORT_CAR *** carcass tape = CABRIOLET *** engine = PETROL *** color = RED *** count doors = 2 Жду Ваших замечаний, советов, ругани и брани !!!


Ответ

Всегда пожалуйста: public abstract class BaseCarBuilder {
// Мне почему-то кажется, что для примера можно было обойтись двумя-тремя // методами вида buildSomething. Ваш текущий код — это один большой // boilerplate, где из-за геттеров и сеттеров теряется смысл. public abstract void buildCategory(CategoryCar pCategoryCar);
// Carcass — крайне неудачный термин. См. http://goo.gl/SCMO1q public abstract void buildCarcass(CarcassType pCarcassType) ;
// Параметры с именами вида pSomething не следуют naming convention. // Если бы вы, кстати, инвертировали слова в именах вида pColorCar ----> // carColor (или просто color), уже стало бы лучше и понятнее. // pCategoryCar в текущем варианте означает что-то в духе "машина с // какой-то там категорией", а используется в значении "категория машины". public abstract void buildEngine(Engine pEngine);
// Опять-таки, плывет нейминг. В текущем варианте по названиям методов // получается, что ваш builder можно попросить сделать "просто carcass", а // можно "цветной carcass". Почему бы не объединить buildColorCarcass и // buildCarcass в один метод или просто сделать buildCarcass + buildColor? public abstract void buildColorCarcass(ColorCar pColorCar) ;
// Эти замечания — не очень принципиальные. См. ниже. public abstract void buildDoors(int pDoors) ;
public Car getBuiltCar() { return null; }
public class Car { // public final static int TWENTY_ELEVEN_DOORS = 2011. Почему не enum? public final static int TWO_DOORS = 2; public final static int THREE_DOORS = 3; public final static int FOUR_DOORS = 4; public final static int FIVE_DOORS = 5;
private int doorsCount;
private Engine engine; private String carName; private ColorCar colorCar; private CarcassType carcassType; private CategoryCar categoryCar;
public Car(String pCarName) {
this.carName = pCarName; }
public ColorCar getColorCar() { return colorCar; }
....
public Engine getEngine() { return engine; }
public void setEngine(Engine engine) { this.engine = engine; }
// Погодите, а не 'toString' ли это, часом? Вы, кстати, задумались над тем, // что, если написать в *произвольном* месте кода вот это, // // [[[ // String info = car.getCarInfo(); // info = car.getCarInfo(); // info = car.getCarInfo(); // ...... // info = car.getCarInfo(); // ]]] // // то ваш stderr окажется зафлужен строчками вида "------------------"?
public String getCarInfo() {
String info = "car name = " + carName + " *** category car = " + categoryCar + " *** carcass tape = " + carcassType + " *** engine = " + engine + " *** color = " + colorCar + " *** count doors = " + doorsCount; System.err.println("---------------------------------------------------"); return info; } }
public class MersedesBenzBuilder extends BaseCarBuilder {
private Car car;
public MersedesBenzBuilder() {
car = new Car("Mersedes Benz"); }
@Override public void buildCategory(CategoryCar pCategoryCar) {
car.setCategoryCar(pCategoryCar); }
....
@Override public void buildColorCarcass(ColorCar pColorCar) {
car.setColorCar(pColorCar); } }
public class Director {
public Car buildNewCar(BaseCarBuilder carBuilder, CategoryCar pCategoryCar, CarcassType pCarcassType, int pDoors, Engine pEngine, ColorCar pColorCar) {
// Вот, теперь к главному. Вы неправильно поняли Builder по Gang of // Four, и поэтому получилась чушь. При изучении паттернов один из самых // важных принципов, как бы банально это не звучало, заключается в том, // чтобы *четко* следовать тому, что написано. Давайте внимательно // посмотрим на UML-диаграмму для паттерна Builder (http://goo.gl/rX9gMN). // Сколько параметров у метода Director.construct? Один. А у вас сколько? // Сколько параметров у метода Builder.buildPart? Ноль. А у вас сколько? // А что это значит? Правильно, что вы неверно истолковали суть этого // паттерна.
// В паттерне Builder важен следующий инвариант: как только объект // ConcreteBuilder создан, он более не допускает параметризации извне. // Идея заключается в том, что конкретный экземпляр Builder умеет // каким-то своим способом совершать "маленькие шажки" к созданию // объекта (buildPart), а Director умеет объединять шажки из интерфейса // Builder таким образом, чтобы получился объект.
// Конкретно в вашем случае детали типа Engine.PETROL и // CategoryCar.SPORT_CAR должны были быть "зашиты" в реализации класса // MersedesBenzBuilder. А у вас получилась такая штука, что вы вместо // Builder'a сделали крайне неочевидный named constructor, который // весело перебрасывает аргументы туда-сюда.
// Годную реализацию этого паттерна на Java можете посмотреть здесь — // http://goo.gl/KRk1L // Также рекомендую вам ознакомиться с паттерном Fluent Builder — // http://goo.gl/HIulBb
// И да, паттерны обычно тем или иным способом решают какую-то // прикладную задачу. Поэтому "приступать к изучению паттернов," не // имея под рукой хорошей задачи — это довольно плохая идея. Придумайте // себе хорошую задачу и пытайтесь применять паттерны для ее решения, а // не придумывайте задачи, чтобы применить паттерны.
// Хороший пример такой задачи как раз и приводится в книге GoF // (http://www.amazon.com/dp/0201633612), где они step-by-step // разрабатывают текстовый редактор.
Car tempCar = null;
if (carBuilder != null) {
carBuilder.buildCategory(pCategoryCar); carBuilder.buildCarcass(pCarcassType); carBuilder.buildDoors(pDoors); carBuilder.buildEngine(pEngine); carBuilder.buildColorCarcass(pColorCar);
// Я, кстати, вообще не понимаю, как это может работать, поскольку // в вашем коде метод getBuiltCar всегда возвращает null. tempCar = carBuilder.getBuiltCar();
} else { // Простите, здесь у меня просто глаза вытекли. final String nullPoint = "Yoa are not create car_builder"; Exception exception = new NullPointerException(nullPoint); exception.printStackTrace(); } return tempCar; } }
// Какое сказочное название для класса :) public class RunBuilderPattern {
public static void main(String[] args) {
Car car = null; Director director = new Director();
MersedesBenzBuilder mersedesBenzBuilder = new MersedesBenzBuilder();
// Ух ты! Смотрите! Я на самом деле работаю как простой конструктор, // но два раза разворачиваю и заворачиваю параметры. car = director.buildNewCar( mersedesBenzBuilder, CategoryCar.SPORT_CAR, CarcassType.CABRIOLET, Car.TWO_DOORS, Engine.PETROL, ColorCar.RED);
System.out.println("CAR INFO: " + car.getCarInfo()); } }
// ... а вот эти штуки неплохо бы переместить в класс Car. public enum CarcassType {
SEDAN, UNIVERSAL, CABRIOLET, HATCHBACK, COUPE, LIMOUSINE }
public enum CategoryCar {
CARGO, PASSENGER, BUS, SPORT_CAR }
public enum ColorCar {
BLACK, WHITE, RED, GREEN, BLUE, ORANGE, BROWN }
public enum Engine {
DIZEL, PETROL, GAZ, HUBRID }

Поделиться в Facebook [iOS 7]

Доброе время суток, ситуация такая: есть textField, как мне информацию с textField рассказать в Facebook? И что для этого нужно?


Ответ

Доброе время суток уважаемый! Вам нужно - это добавить фреймворк: "Social.framework"; Импортировать "Social/Social.h"; В файле .h объявить SLComposeViewController *slComposeViewController //название может быть произвольное; Сама реализация: //Допустим наш textView/Field называется "textViewDetailNotes". // .m if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) { slComposeViewController = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook]; [slComposeViewController setInitialText:[[self textViewDetailNotes] text]];
[self presentViewController:slComposeViewController animated:YES completion:nil]; [[self textViewDetailNotes] resignFirstResponder]; } else { //Если пользователь не авторизован в Настройки/Facebook }