Страницы

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

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

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

Доброго всем времени суток, господа! Нужен совет 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 }