Страницы

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

пятница, 5 июля 2019 г.

Не работает Инсерт в БД?

вот такой простой код! и он не работает.. $name = "Uje";
$result3 = mysql_query("INSERT INTO coalition (name) VELUES ('$name')");//заносим в базу сообщение
if ($result3 == TRUE) {echo "TRU"; } else { echo "noo";}
echo $name;
?> тип поля в БД "name" varchar(225) на первый взгляд все верно но скрипт выдает "noo" как индикацию отсутствия результата не могу разобраться что не так( имя таблицы прописанно верно соединение с БД есть..


Ответ

Все было просто, у меня в таблице не стояли значения по умолчанию - а оказывается нельзя создавать ноую строку в БД когда значения остаются пустыми" а я в запросе некоторые значения не указывал)

Соответствие между dict.key() и dict.values()

Насколько я понимаю, из-за того, что словари словари - неупорядоченные коллекции, порядок, в котором идут элементы, никак не гарантируется.
Но можно ли быть уверенным, что наборы dict.keys() и dict.values() будут соответствовать друг другу?
Т.е., грубо говоря, что d[list(d.keys())[i]] == list(d.values())[i] для любого i < len(d)


Ответ

Если словарь не модифицировался, то да, можно быть уверенным. http://docs.python.org/2/library/stdtypes.html#dict.items

Чтение-запись в Propertylist XCode

Здравствуйте! Для моей программы нужно сохранение данных, но я никак не могу понять как записывать в plist'ы. Помогите, пожалуйста.


Ответ

Все о .plist'ах Совсем малые объемы данных можете сохранять при помощи NSUserDefaults Если стоит задача хранить большие объемы данных - смотрите в сторону sqlite или Core Data

Квадратные thumbnails из не квадратных изображений?

Уважаемое сообщество, подскажите пожалуйста куда копать? Проблема заключается вот в чем: Есть фотографии из соц сетей (вконтакте, инстаграм например). Изображения вытаскиваются из api, и обычно в ответе от api присутствует thumbnail фотографии (src_small к примеру). В случае с инстаграмом всё отлично - там по дефолту квадратные изображения. В случае с остальными соц сетями - изображения там какие попадутся. Так вот в чем вопрос: возможно ли средствами css отображать только квадратную область изображения ? Просто обрезать на сервере - довольно трудозатратная операция, если фотографии будут грузиться пачками по 20 (например). И если будет много пользователей делать это одновременно, страшно подумать что случится с моим дешевым хостингом (а пока вообще бесплатным) :)


Ответ

Осмелюсь как вариант предложить такой индусский код: http://jsfiddle.net/ptEy8/ Но очень хотелось бы увидеть ещё варианты! Хороший вопрос.

Копирование NSManagedObject-подкласса

Существует некий NSManagedObject-подкласс Visit. Появилась необходимость получить почти точную копию обьекта - из двадцати полей нужно изменить значение у трех. Можно ли сделать копию не таким трудоемким процессом как .... for(Visit *copiedVisit in arrayOfVisits) // массив обьектов с которых делаются копии { Visit *newVisit = (Visit *)[NSEntityDescription insertNewObjectForEntityForName:@"Visit" inManagedObjectContext:[self managedObjectContext]]; newVisit.date = [NSDate someNewDate]; // поле которое нужно изменить newVisit.name = copiedVisit.name; // далее переприсвоение значений полей одного объекта = полям другого newVisit.attribute = copiedVisit.attribute; newVisit.time = copiedVisit.time; ...
NSError *err = nil; if (![self managedObjectContext] save:&err]) { ... }; } а потом переприсвоением значений полей одного объекта полям другого? Некий аналог copy для NSManagedObject-подкласса?


Ответ

Насколько мне известно, у Core Data нет такой возможности из коробки. Мне кажется, вполне уместно определить для вашего класса Visit соответствующий метод -copyWithZone: в котором можно описать всю процедуру порождения копии, и затем пользоваться просто обычным copy, как вы и предполагаете в своем вопросе - только не "аналогом copy", а самым настоящим copy, потому что именно так он и работает - через определение copyWithZone.
Смотри мой ответ про клонирование UIView: Objective C: как клонировать UIView?

Java I/O для объёмных данных

Нужен совет опытных по поводу производительности Java I/O и много другого. Задачка такая - в нескольких потоках клиент шлет http post запрос весом до 1 мб каждый, в ответ приходят еще больший по весу (2-4 мб) ответ в формате JSON, который нужно спарсить и аккуратно завернуть в .csv файл. Количество запросов может доходить до десятков тысяч,все ответы сервера пишутся в 1 файл. Сервер один и тот же. (что делать с Keep-Alive ? ) . Соответственно возникает вопрос - а какие инструменты при этом использовать ? Соединение: HttpClient / HttpUrlConnection /Netty/etc Чтение ответа : BufferedReader/Scanner/etc Чем Json парсить ? jackson/gson/simple json Чем писать в файл, и нужно ли вообще писать во время работы или же лучше кидать в какой нибудь ArrayList, потом спарсить и записать. В общем, буду рад любым советам и подсказкам) Вопрос не мой, просто помогаю человеку :)


Ответ

1.) Для объемных файлов конкретный api особо не влияет на скорость передачи, все упрется в возможности железа. Заморачиваться с nio стоит, если есть например много легких соединений, и есть проблемы с переключениями контекстов. Так что выбирайте удобный, отлаженный api. Я бы взял apache http client 4. 2) BufferedReader - хорошее решение 3) Я бы взял jackson - мощный и быстрый. Gson скорее более специализированное решение для конвертации между бинами и json. 4) Писать лучше во время работы из другого потока, будет pipelinig. И запись конечно должна быть буферизованной, например через BufferedWriter. Keep alive лучше выключить. Файлы большие, время установки соединений ничтожно меньше времени передачи. Только морока будет с настройкой сервера. Еще советую на клиенте и сервере установить размеры tcp буфферов в один мегабайт, алгоритм нигла оставить включенным, scaling tcp окна тоже оставить включенным. И еще общий совет: делай каждую стадию отдельной группой потоков, потоки соединяй очередями. Это называется SEDA. Так ты сможешь получить максимальную пропускную способность. Кстати, увеличение длин очередей увеличивается пропускную способность, но ухудшает latency. Имей в виду. Автор ответа - Денис Боровиков, [http://vk.com/id36765][1]

Как оптимизировать код?

Нужно сделать так, чтобы за пальцем двигалась картинка (Bitmap f), а и выполнялось "стирание", но алгоритм движения картинки очень сильно нагружает устройство, и в итоге FPS=8. Без движения картинки "стирание" происходит при довольно большой частоте кадров. Как можно ускорить/оптимизировать этот код, чтобы картинка двигалась без лагов? Заранее ОГРОМНОЕ спасибо! public class WScratchView extends SurfaceView implements SurfaceHolder.Callback { private Context mContext; public WScratchViewThread mThread; List mPathList = new ArrayList(); private int mOverlayColor; private Paint mOverlayPaint; private int mRevealSize; private boolean mIsScratchable = true; private boolean mIsAntiAlias = false; private Path path; private float startX = 0; private float startY = 0; private boolean mScratchStart = false; private MediaPlayer phrase; Boolean timerRunned = false; int fWidth,fHeight, fX,fY, fIndent; boolean ignore_drawable = false; Bitmap bitmap, f; public static long scores = 0; public Paint paint, paintf; public Rect destin, destinf; public int fLeft, fTop, fRight, fBottom; Handler h; Runnable updateScores;
public WScratchView(Context ctx, AttributeSet attrs) { super(ctx, attrs); init(ctx, attrs); }
public WScratchView(Context context) { super(context); init(context, null); }
private void init(Context context, AttributeSet attrs) { mContext = context;
mOverlayColor = DEFAULT_COLOR; mRevealSize = DEFAULT_REVEAL_SIZE;
setZOrderOnTop(true); SurfaceHolder holder = getHolder(); holder.addCallback(this); holder.setFormat(PixelFormat.TRANSPARENT);
mOverlayPaint = new Paint(); mOverlayPaint.setXfermode(new PorterDuffXfermode(Mode.CLEAR)); mOverlayPaint.setStyle(Paint.Style.STROKE); mOverlayPaint.setStrokeCap(Paint.Cap.ROUND); mOverlayPaint.setStrokeJoin(Paint.Join.ROUND);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.layer); f = BitmapFactory.decodeResource(getResources(), R.drawable.f);
Resources res = getResources(); fHeight = res.getInteger(R.integer.fHeight); fWidth = res.getInteger(R.integer.fWidth); fIndent = res.getInteger(R.integer.fIndent);
h = new Handler(); updateScores = new Runnable() {
@Override public void run() { Main.tvScores.setText(Long.toString(scores)); } };
paint = new Paint(); paintf = new Paint(); paint.setFilterBitmap(true); paintf.setFilterBitmap(false);
Log.d("LOG_", "init complete"); }
@SuppressLint("DrawAllocation") @Override public void onDraw(Canvas canvas) { if (ignore_drawable)return; destin = new Rect(0, 0, getWidth(), getHeight()); canvas.drawBitmap(bitmap, null, destin, paint);
//Log.d("LOG_","draw start"); for (Path path: mPathList) { mOverlayPaint.setAntiAlias(mIsAntiAlias); mOverlayPaint.setStrokeWidth(mRevealSize);
canvas.drawPath(path, mOverlayPaint); }
destinf = new Rect(fLeft, fTop, fRight, fBottom); canvas.drawBitmap(f, null, destinf, paintf); }
@Override public boolean onTouchEvent(MotionEvent me) { ignore_drawable = true; synchronized (mThread.getSurfaceHolder()) { ignore_drawable = false; if (!mIsScratchable) { return true; }
if (!timerRunned) { timerRunned = true; Main.cdt.start(); } Log.d("LOG_", "bye");
switch (me.getAction()) { case MotionEvent.ACTION_DOWN: path = new Path(); path.moveTo(me.getX(), me.getY()); startX = me.getX(); startY = me.getY(); mPathList.add(path); break; case MotionEvent.ACTION_MOVE: playrandom(); fX = (int)me.getRawX(); fY = (int)me.getRawY(); fLeft = fX - fIndent; fTop = fY - fIndent - fIndent; if (fLeft < 0)fLeft = 0; if (fTop < 0) fTop = 0; fRight = fX - fIndent + fWidth; fBottom = fY - (fIndent*2) + fHeight; if (mScratchStart) { path.lineTo(me.getX(), me.getY()); } else { if (isScratch(startX, me.getX(), startY, me.getY())) { mScratchStart = true; path.lineTo(me.getX(), me.getY()); } } scores += Main.level; h.post(updateScores); invalidate(); break; case MotionEvent.ACTION_UP: mScratchStart = false; try {phrase.stop();} catch (Exception ex) {} break; } invalidate(); return true; } }
public void playrandom() { //Тут идёт очень большой метод, не связанный с вопросом. Я его пропущу. }
private boolean isScratch(float oldX, float x, float oldY, float y) { float distance = (float) Math.sqrt(Math.pow(oldX - x, 2) + Math.pow(oldY - y, 2)); if (distance > mRevealSize * 2) { return true; } else { return false; } }
@Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {}
@Override public void surfaceCreated(SurfaceHolder arg0) { mThread = new WScratchViewThread(getHolder(), this); mThread.setRunning(true); mThread.setPriority(1); mThread.start(); }
@Override public void surfaceDestroyed(SurfaceHolder arg0) { boolean retry = true; mThread.setRunning(false); while (retry) { try { mThread.join();
retry = false; } catch (InterruptedException e) {} }
}
class WScratchViewThread extends Thread { private SurfaceHolder mSurfaceHolder; private WScratchView mView; private boolean mRun = false;
public WScratchViewThread(SurfaceHolder surfaceHolder, WScratchView view) { mSurfaceHolder = surfaceHolder; mView = view; }
public void setRunning(boolean run) { mRun = run; }
public SurfaceHolder getSurfaceHolder() { return mSurfaceHolder; }
@SuppressLint("WrongCall") @Override public void run() { Canvas c; while (mRun) { c = null; try { c = mSurfaceHolder.lockCanvas(null); if (c != null) synchronized (mSurfaceHolder) { { mView.onDraw(c); } } } finally { if (c != null) { mSurfaceHolder.unlockCanvasAndPost(c); } }
try { TimeUnit.MILLISECONDS.sleep(50); } catch (InterruptedException e) {} } } }
public void resetView() { synchronized (mThread.getSurfaceHolder()) { mPathList.clear(); } }
public boolean isScratchable() { return mIsScratchable; }
public void setScratchable(boolean flag) { mIsScratchable = flag; }
public void setOverlayColor(int ResId) { mOverlayColor = ResId; }
public void setRevealSize(int size) { mRevealSize = size; }
public void setAntiAlias(boolean flag) { mIsAntiAlias = flag; } }


Ответ

Только по коду сказать что-то конкретное сложно. Стоит прогнать ваше приложение через профайлер (насколько я помню, он входит в состав Android SDK) и проверить, какой метод отъедает больше всего времени. Точно не скажу, но мне кажется, что это метод onTouchEvent. Во-превых, лучше не использовать блок synchronized, такая синхронизация отъедает слишком много ресурсов. Вместо него лучше использовать локи (также почитайте про методы lockCanvas() и unlockCanvasAndPost()). Во-вторых, этот метод будет отрабатывать очень много раз в секунду на каждое касание, что скорее всего и нагружает процессор. Для того, чтобы этого избежать стоит ограничить число срабатываний этого метода в секунду. Для этого подойдёт проверка на время предыдкщего срабатывания метода: если он отработал меньше чем, скажем, 50 милисекунд назад, то не вызываем обработчик.

Изменить стиль блока при нажатии

Не знаю JavaScript вообще. Только CSS и HTML. Помогите написать код, пожалуйста. Допустим, у меня есть блок A

У него есть стиль #a {width:100px; height:100px; position:absolute (или relative, не суть); top:0px} При нажатии на этот блок нужно чтобы у него был top:100px; left:50px к примеру. Насколько мне известно, средствами CSS можно лишь сделать так, чтобы на время нажатия на этот блок он перемещался, а когда отпустить кнопку мыши - он встанет на свое место. Как сделать, чтобы при клике на этот блок он переместился, а при еще одном клике встал назад? Очень, очень и очень желательно без JavaScript, ибо я его пока что ВООБЩЕ не знаю, если возможно. Если невозможно, помогите написать скрипт-шаблон, и хотя бы отдаленно расскажите какая команда за что отвечает. Спасибо большое, надеюсь поможете)) UPD Возможно сделать так, чтобы при клике у него менялись свойства? Или при клике вместо id="a" у него становился id="a1" ? Это возможно?


Ответ

Уже тыщу раз отвечал на подобный вопрос: HTML

CSS #a { width:100px; height:100px; position:absolute; top:0; left: 0; border: 1px solid black; transition: all 0.5s; } .switchable input { display:none; } .switchable input:checked+#a { top:100px; left:50px } http://jsfiddle.net/oceog/sFEH4/ фокус в использовании :checked и следующего за ним div. ограничение способа - нельзя помещать в такой
никаких input

Android: long click - как заставить работать так же как и onclick

Проблема такая: понаписывал я своих вьюшек (иконки разные с текстом) и для них определил onclick listener'ы, но тут проблема - если держать палец около секунды - то ничего происходить не будет (очевидно сработал он самый long click). Можно конечно создать onLongClickListener и вызывать в нём onClick, но тогда придётся каждой вьюшке назначить его. Пробовал поставить в xml longClickable = false, но это ничего не дало. В общем есть какое то нормальное решение, или придётся всё же обрабатывать onLongClick?


Ответ

Как по мне - так если пользователь сделал LongClick, значит он и хотел сделать лонг клик... Ну а если уж сильно надо - устанавливайте не OnClick, а OnTouch. И производите действия, скажем, по отпусканию вьюшки if (event.getAction() == MotionEvent.ACTION_UP) { //что нужно сделать по клику и лонг клику }

Верстка, css. Артефакты при масштабировании

Всем привет. Возникла такая проблема. При изменении масштаба в хроме (зажать Ctrl и крутить колесико) в верстке возникают артефакты, в виде 1 лишнего пикселя, или же наоборот, обрезание дивов на пиксель где - нибудь сбоку. Подскажите, пожалуйста, как с этим можно бороться? А если нельзя, то как объяснить появление этих пикселей. Адрес сайта для наглядности сброшу, если будет нужен


Ответ

На все воля браузера. Происходит естественно в результате округлений при расчетах масштабирования. Для примера 955 px как уменьшить в 2 раза? 955/2=477,5. Как отобразить полпикселя? Естественно округлив до целого числа, 478. Вот и весь секрет.

Повторение Item в ListView (CustomAdapter)

Здравствуйте!
Делаю вывод ListView, всё хорошо до момента пока ListView не становится длинным и появляется скролл.
На экран помещается 13 строк, я пролистываю его дальше и элементы начинают повторяться:
Вот после 13 должно идти дальше до 30.
В Адаптере это выглядит так:
@Override public View getView(int position, View convertView, ViewGroup parent) { View v; String str = items.get(position); if (convertView == null) { v = LayoutInflater.from(contextAdapter).inflate(R.layout.test_item, parent, false); TextView tvText = (TextView) v.findViewById(R.id.test_item_text); TextView tvText2 = (TextView) v.findViewById(R.id.test_item_text_2); if (tvText != null) tvText.setText("str:" + str); if (tvText2 != null) tvText2.setText("position:" + position); } else { v = convertView; } return v; }
Если я вынесу из if кусок с поиском элементов в лэйауте, то всё будет почти хорошо:
@Override public View getView(int position, View convertView, ViewGroup parent) { View v; String str = items.get(position); if (convertView == null) { v = LayoutInflater.from(contextAdapter).inflate(R.layout.test_item, parent, false); } else { v = convertView; } TextView tvText = (TextView) v.findViewById(R.id.test_item_text); TextView tvText2 = (TextView) v.findViewById(R.id.test_item_text_2); if (tvText != null) tvText.setText("str:" + str); if (tvText2 != null) tvText2.setText("position:" + position); return v; }

Но проблема в том, что каждый раз, когда я листаю список, он перестраивает ВСЕ видимые на данном экране элементы. Как сделать так, что бы он 1 раз сделал рендер итема, а потом брал из "сохраненных"?


Ответ

почитайте про паттерн ViewHolder здесь (п 6.3. Holder Pattern)

Как можно минимизированный CSS привести в нормальный вид?

Как можно минимизированный CSS привести в нормальный вид программными средствами?
Подходит:
Библиотека Программный код API сервиса
Не подходит:
Онлайн-сервис (этот вариант привлекает спам)


Ответ

В PHPStorm можно минифицированный код привести в нормальный (Code > Reformat Code - Ctrl + Alt + L). Комбинация может разниться от версии Схемы (то бишь настроек редактора). Указано сочетания для Default Scheme
По поводу минификации кода есть отдельные статьи и плагины.

Связь многие ко многим в Rails

Хочу связать тэги с постами, есть три модели:
class Post < ActiveRecord::Base has_many :tag_to_post has_many :tags, :through => :tag_to_post end
class Tag < ActiveRecord::Base has_many :tag_to_post has_many :posts, :through=> :tag_to_post end
class TagToPost < ActiveRecord::Base belongs_to :post belongs_to :tag end
В консоли ввожу post=Post.find(Id_существующего поста) После чего ввожу post.tags и получаю ошибку:
Circular dependency detected while autoloading constant TagToPost.
До того как написал сюда, нашёл вот такую запись: Rails: Why “has_many …, :through => …” association results in “NameError: uninitialized constant …”, где задача по всей видимости схожа с моей, после чего модели были приведены к текущему виду (до этого была другая ошибка "nameerror uninitialized constant"). Подскажите, пожалуйста, как решить мою проблему.


Ответ

У вас has_many :tag_to_post А должно быть has_many :tag_to_posts

Подтверждение записи данных в mongoDB

Как можно реализовать проверку того что данные записались в базу.


Ответ

Для этой цели в MongoDB специально введено понятние Write Concern. Выдержка из документации: write concern Specifies whether a write operation has succeeded. Write concern allows your application to detect insertion errors or unavailable mongod instances. For replica sets, you can configure write concern to confirm replication to a specified number of members. See Write Concern Дословно: Указывает, успешно ли выполнилась операция записи. "Write concern" позволяет вашим приложениям выявлять ошибки вставки или недоступности mongod. Для replica-set вы можете задать write concern, чтобы подтверждать репликацию в заданное число реплик. Существует определенный набор значений для этого параметра: Unacknowledged Acknowledged (by default) Journaled Replica Acknowledged По умолчанию драйвером используется Acknowledged уровень - mongod в этом случае будет сообщать клиенту о результатах записи. Т.е. клиент может отловить сетевые ошибки , получить сообщение duplicate key или другую ошибку. (Всё расписано в документации). Значение write concern'а в драйвере можно поменять в классе MongoClient

CSS: перенос элементов

Существует решение для построения дерева с использованием HTML + CSS. Еще немного JS используется для реализации функции свертывания узлов дерева. Вот собственно и сам пример. Проблема в том, что при большом количестве узлов, последние не помещаются в родительский контейнер. Можете предложить какие-то идеи по устранению данной проблемы? Что только не пробовал: и работал со свойством overflow и javascript задействовал - безрезультатно. Буду рад как готовому решению, так и его словесному описанию. Заранее спасибо. P.S.: Оригинал - CSS3 Family Tree


Ответ

Есть одна мысль. Сделать ul { white-space: nowrap; } li { display: inline-block!important; } Но надо будет тогда css крепко править, чтобы нужный вид со всеми линиями сохранился

Вопрос о Model и ViewModel в MVVM

Работали мы когда-то с WinForm и был у нас некий класс: class City { public int ID {get;set;}
public string Name {get;set;}
public List {get;set;} .... } Потом мы узнали про WPF и решили перейти на него. Но если это WPF, то занчит надо делать все по канону (т.е. с использованием MVVM) и надо бы сделать ViewModel. Дак вот тут-то я и теряюсь. Как лучше сделать? Доработать тот самый класс City - сделать его наследником INotifyPropertyChanged (При этом коллекции заменить на ObservableCollection), но ведь тогда у нас Model и ViewModel сольются воедино? Не хорошо получается, или хорошо?. Или же создать для него ViewModel: class CityViewModel : INotyPropertyCjanged { private City _city;
public int ID { get {return _city.ID; } set {_city.ID = value; RaisePropertyChanged("ID");} } ... } Но что же тогда делать с List? Как ее упаковать в ObservableCollection? Направьте пожалуйста на путь истинный... Примеры приветствуются! UPD И пока не забыл. Допустим нам надо наполнить нашу модель данными из, например, баз данных. Где должна лежать функция получения данных? Во ViewModel или View или еще где?


Ответ

Смотрите. Классы модели лежат отдельно, и не пересекаются с классами VM. Классы VM моделируют сущности вашей «бизнес-логики», то есть, внутренние объекты в терминах программы. Классы модели моделируют сущности своей предметной области. Например, ID интересен модели, но может быть вовсе не интересен программе, так что переносить его в VM нет особого смысла (разве что он нужен в UI). Таким образом, у нам получается вот что: Модель: class City { public int ID { get; private set; } public string Name { get; private set; } public List Areas { get; private set; } }
static class CityHelpers { static City GetCityByName(string name) { ... } } VM: class CityVM : INotifyPropertyChanged // или даже DependencyObject { public CityVM(City city) { name = city.Name; Areas = new ObservableCollection(); foreach (var area in city.Areas) Areas.Add(new AreaVM(area)); }
public Name { get { return name; } set { if (name == value) return; name = value; RaisePropertyChanged("Name"); } }
public ObservableCollection Areas { get; private set; }
// ну и ещё имплементация INotifyPropertyChanged } Функции получения данных лежат, понятно, в модели: VM не должна знать, как именно и откуда берутся данные. Но вот попросить модель загрузить данные должна именно VM (причём желательно грузить их не в UI-потоке, конечно, а то будет подвисать).

Как на эмулятор закачать картинки/фотографии?

Как на эмулятор Windows Phone 8 закачать картинки/фотографии с компьютера (не из своей программы)?


Ответ

Создайте папку TestImages в проекте и добавьте туда изображения. Установите значение Build action в Content на файлы в свойствах Visual Studio Измените .csproj (правый клик на проекте, 'Unload Project' потом правый клик, 'edit .csproj') Добавьте условие настройки в строки, которые включают файлы в проекте, как этот: Добавьте следующий код в App constructor #if DEBUG if (Microsoft.Devices.Environment.DeviceType == DeviceType.Emulator) { EmulatorHelper.AddDebugImages(); } #endif Добавьте класс EmulatorHelper using System; using System.Collections.Generic; using System.IO.IsolatedStorage; using Microsoft.Xna.Framework.Media;
namespace MyPhotoApp { public static class EmulatorHelper { const string flagName = "__emulatorTestImagesAdded";
public static void AddDebugImages() { bool alreadyAdded = CheckAlreadyAdded(); if (!alreadyAdded) { AddImages(); SetAddedFlag(); } }
private static bool CheckAlreadyAdded() { IsolatedStorageSettings userSettings = IsolatedStorageSettings.ApplicationSettings;
try { bool alreadyAdded = (bool)userSettings[flagName]; return alreadyAdded; } catch (KeyNotFoundException) { return false; } catch (ArgumentException) { return false; } }
private static void SetAddedFlag() { IsolatedStorageSettings userSettings = IsolatedStorageSettings.ApplicationSettings; userSettings.Add(flagName, true); userSettings.Save(); }
private static void AddImages() { string[] fileNames = { "img1", "img2", "img3", "img4", "img5" }; foreach (var fileName in fileNames) { MediaLibrary myMediaLibrary = new MediaLibrary(); Uri myUri = new Uri(String.Format(@"TestImages/{0}.jpg", fileName), UriKind.Relative);
System.IO.Stream photoStream = App.GetResourceStream(myUri).Stream; byte[] buffer = new byte[photoStream.Length]; photoStream.Read(buffer, 0, Convert.ToInt32(photoStream.Length)); myMediaLibrary.SavePicture(String.Format("{0}.jpg", fileName), buffer); photoStream.Close(); } } } } Теперь у Вас есть проект, который автоматически добавляет тестовые изображения в фотогалерею, при условии, что: build Configuration установлена в 'Debug' приложение запущено в эмуляторе изображения еще не были добавлены Преимущество в том, что это не влияет на Release XAP по производительности или размеру. Источник

Перемещение блока после каждого 3 элемента (jQuery)

Здравствуйте. Есть блок с N элементами и 1 блоком, необходимо, чтобы при клике на этот элемент, под него перемещался блок, который в данный момент имеет свойство display: none; Мой код перемещает блок каждый раз после 6 элемента: http://jsfiddle.net/Qe9sS/1/ Нужно, чтобы при клике на первый, второй, третий элемент - блок переместился под третий, при клике на четвертый, пятый, шестой - под шестой, и так далее. В оригинальном варианте элементы выстроены по 3 на линию, то есть, примерно в таком виде: элемент №1 элемент №2 элемент №3 элемент №4 элемент №5 элемент №6 Заранее спасибо.


Ответ

Если я правильно понял, то вы просто перемудрили, вот пример: var $bdetail = $(".b-detail"),$links=$(".content-item > a"); $(".content-item").on('click','> a',function (event) { event.preventDefault(); var index=parseInt($links.index(this)/3+1)*3; index=index>$links.length?$links.length:index; index--; var $that=$links.eq(index); if (!$that.next().is($bdetail)) { $bdetail.stop().slideUp('fast', function () { $bdetail.slideDown('slow').insertAfter($that); }); } }); http://jsfiddle.net/oceog/Qe9sS/8/

Устранение излишних запросов на сайте

Приветствую if(!isset($_SESSION['zapros'])){ //тут у нас запрос к базе, который возвращает массив $massiv; $_SESSION['zapros'] = $massiv; } Знаю, так делать неправильно, совать в сессию все запросы. Но в силу того, что 'мне хватает' - использую. Вопрос прост, как на сайте организовать уменьшение запросов от одного пользователя? Мой способ, из эры динозавров - сунуть в сессию. Но правильно ли это? Есть модная штука memcache, но никто не объяснит чем оно лучше той же сессии.. вот допустим у сессии лимит 128мб на всех пользователей (зависит от хостинга), а у мем кэша есть недостатки? Поможете разобраться? p.s. да, знаю можно вообще заранее подготовленные данные из файла читать. меня интересует чисто кэширование запросов


Ответ

Memcache >>>>>>>>>>>>> сессия. Как можно догадаться, мемкэш держит все в памяти, а сессия сохраняется на диск - скорости будут просто несопоставимы. Тем более, не будете же вы для каждого пользователя писать список десяти последних новостей, например? Ну и первое, что вас должно было смутить: сессия - это штука, созданная исключительно для работы с пользователем. По-хорошему кэширование должно быть встроено уже на уровне дб или модели, когда опциональным аргументом метода указывается, что запрос может быть закеширован.

Использование C или С++ ? [закрыт]

Изучаю "Си" недавно, после Java начал, сам язык очень понравился, минимум абстракций, очень простой и сложный одновременно. Вопрос в том что не вижу грани когда нужно использовать Си, а когда С++, "плюсы" я не знаю и представляю их себе как чистый "Си" только с прекрученным ООП и возникает вопрос: смысл использовать С++ если тоже можно написать на "Си" и он однозначно проще плюсов ?! Просто вакансии в основном на С++ вот и решил задать вопрос типа а как же Си, если везде используют "плюсы" ...


Ответ

Все очень просто - использовать C++ там, где это возможно. Где необходимо (низкий уровень, взаимодействие с API) можно опускаться к C-подмножеству (оставаясь в рамках синтаксиса C++). Писать на чистом C же есть смысл там, где такие жертвы окупятся, а этих областей не много: системное программирование (специфика Linux), да программировании контроллеров (ресурсы крайне ограничены).

При нажатии вставить HTML коды в textarea

Мучаюсь уж как 2 дня, подскажите как сделать такое: Есть картинки(иконки)сверху, нужно, чтобы при нажатие на любую из них в textarea который ниже находиться вставлялись спец коды к примеру , то есть HTML коды. мне подсказали что это делается на jquery


Ответ

Используй любой из WYSIWYG-редакторов. Если по-своему, то можно так: HTML:

b
JS: var ta = $('#qwe'), ico = $('.icon');
ico.on('click', function(){ switch ($(this).data('type')){ case 'b': ta.val( ta.val() + '' ); break; //можно дописать другие кейсы для новых иконок } }); Демо Можно улучшить, чтобы обрамляло выделенный текст.

Адаптивный drupal 7?

Создаю сайт на Drupal 7, хотелось бы его сделать адаптивным, но так как я начинающий верстальшик, то у меня с эти проблемы.
Есть какие-нибудь ресурсы посвященные этой теме? может статьи или видеоуроки какие-то?


Ответ

Есть видеокурс Responsive Design with Drupal [Lynda.com]
На просторах рунета можно скачать его бесплатно - поищите
На youtube есть много видео уроков и обзоров - просто введите в поиске на ютубе "drupal responsive"

Core Data не сохраняется число

Здравствуйте! Создал простенькую программку с поддержкой Core Data, типа Document–Based app. Имеется текстовое поле, соединённое с arrayController'ом, который в свою очередь соединён с Entity, у которой есть атрибут "name" типа "string" и атрибут "score" типа "decimal". Введённая в текстовое поле строка сохраняется без проблем. Также имеется другое текстовое поле: в него вводится число и после нажатия кнопки "Go" значение из поля передаётся в метку. Метка соединена абсолютно точно так же как и первое текстовое поле, но почему-то значение метки не сохраняется. С чем это связано и как это исправить? Для наглядности, проект можно скачать отсюда: https://www.dropbox.com/sh/kfp61xu3i4zj3kz/QCnPtlVqtE


Ответ

У вас проблема в том, что "запись" в базу не происходит. Изыскания показали, что данные из TextField записываются в базу только после переключения "фокуса" из этой TextField в другое место. А у вас получается, что фокусировки нет совсем. Попробуйте дополнить код "принудительно" записю данных в Базу. Например: - (IBAction)changeScore:(id)sender { [_scoreLabel setDoubleValue:[_scoreField doubleValue]]; id saveObj = [_arrayController selectedObjects][0]; double newDob = [_scoreField doubleValue]; NSNumber * decim = [NSNumber numberWithDouble:newDob]; [saveObj setValue:decim forKey:@"score"]; }

Проблема с ObjectInputStream. (StreamCorruptedException: invalid type code: AC)

Вообще изначальная задача - написать игру с двумя игроками, что-то типа точек. т.е. один игрок (клиент) делает ход, отправляет данные (координаты x и y) на сервер. Сервер обрабатывает эту информацию и отправляет сообщение с какими-то данными всем подключенным клиентам. Все это надо реализовать на сокетах. За основу взяла реализацию чата, но мне удобнее передавать объекты, поэтому использую ObjectInputStream и ObjectOutputStream. Написала пример: клиент вводит координаты x y, отправляет на сервер. На сервере хранится матрица А. Получаем от клиента x,y, присваиваем A[x][y]=1, отправляем всем клиентам объект класса ServerAnswer (матрица, x,y). Клиент получает и выводит матрицу. Для начала запускаю только один клиент. Первый раз все работает, но когда я ввожу новые координаты на клиенте, они отправляются на сервер, он посылает ответ и на клиенте при попытке выполнения - sa = (ServerAnswer)ois.readObject(); вылетает ошибка апр 17, 2014 12:06:45 PM client2.SocketInputThread run SEVERE: null java.io.StreamCorruptedException: invalid type code: AC at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1377) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) at client2.SocketInputThread.run(SocketInputThread.java:37) at java.lang.Thread.run(Thread.java:744) Подскажите. пожалуйста, что не так в коде. Код Сервера: public class Server2 {
public static void main(String[] args) { System.out.println("Program starting..."); try { ServerSocket ss = new ServerSocket(3129,0, InetAddress.getByName("localhost")); System.out.println("Server starting..."); while(true){ Socket s = ss.accept(); // ожидание новых клиентов SocketThread socketThread = new SocketThread(s); Thread t = new Thread(socketThread); t.start(); // запуск нового потока для каждого нового клиента } } catch (IOException ex) { Logger.getLogger(Server2.class.getName()).log(Level.SEVERE, null, ex); }
} } Класс SocketThread: public class SocketThread implements Runnable {
private Socket s = null;
private boolean exit = true; private int x = -1; private int y = -1; private int p = 0; private int [][]A; private ArrayList listSocket = null; private ObjectInputStream ois = null; private ObjectOutputStream oos = null;
public SocketThread(Socket s) { this.s = s; }
@Override public void run() { try { System.out.println("User connect..."); ListSocket.addSocketToList(s); // добавление текущого сокета с глобальной список сокетов
InputStream in = s.getInputStream(); ois = new ObjectInputStream(in);//получаем от игрока новое ребро
A = new int [5][5]; for (int i = 0; i<5; i++) for (int j = 0; j < 5; j++) { A[i][j] = 0; }
while (s.isConnected()) {
Para new_p = (Para)ois.readObject();
x = new_p.X(); y = new_p.Y(); p = new_p.P();
A[x][y] = p; System.out.println(x + ";" + y); ServerAnswer sa = new ServerAnswer(5, 5); sa.SetAns(new_p, A);
listSocket = ListSocket.getListSocket(); for (Socket socket : listSocket) { // отсылка сообщения всем сокетам
oos = new ObjectOutputStream(socket.getOutputStream()); oos.writeObject(sa); oos.flush(); }
} ListSocket.removeSocketWithList(s); // если поток завершается то сокет клиента удаляется из списка сокетов System.out.println("User disconnect..."); } catch (IOException ex) { try { s.close(); } catch (IOException ex1) { Logger.getLogger(SocketThread.class.getName()).log(Level.SEVERE, null, ex1); } Logger.getLogger(SocketThread.class.getName()).log(Level.SEVERE, null, ex); } catch (ClassNotFoundException ex) { Logger.getLogger(SocketThread.class.getName()).log(Level.SEVERE, null, ex); } } } Клиент: public class Client2 {
public static void main(String[] args) { try { System.out.println("Client starting..."); Socket s = new Socket("localhost",3129); System.out.println("Connect to server..."); Thread threadIn = new Thread(new SocketInputThread(s));// создание отдельного потока на считывание даных от сервера Thread threadOut = new Thread(new SocketOutputThread(s));// создание отдельного потока на ввод даных с клавиатуры threadIn.start(); threadOut.start(); } catch (UnknownHostException ex) { Logger.getLogger(Client2.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(Client2.class.getName()).log(Level.SEVERE, null, ex); } } } SocketInputThread: public class SocketInputThread implements Runnable {
private Socket s = null; private ObjectInputStream ois = null;
public SocketInputThread(Socket s) { this.s = s; }
@Override public void run() { try { InputStream in = s.getInputStream(); ois = new ObjectInputStream(in);
while(true){ ServerAnswer sa;
sa = (ServerAnswer)ois.readObject(); String str = "";
for (int i=0; iprivate Socket s = null; private ObjectOutputStream oos = null;
public SocketOutputThread(Socket s) { this.s = s; }
@Override public void run() { try { Scanner sc = new Scanner(System.in);
oos = new ObjectOutputStream(s.getOutputStream()); while (true) { int x = sc.nextInt(); int y = sc.nextInt(); Para p = new Para(); p.SetPara(x,y,1);
oos.writeObject(p); oos.flush(); } } catch (IOException ex) { Logger.getLogger(SocketOutputThread.class.getName()).log(Level.SEVERE, null, ex); } } }


Ответ

На один ObjectOutputStream должен приходиться ровно один ObjectInputStream Поясню: Корректный object stream выглядит так: [stream header], [object], [object], [object],... У вас object stream'ы выглядят так: [stream header], [object], [object], [stream header], [object], ... Stream header записывается каждый раз при создании нового ObjectOutputStream. Ваш invalid type code: AC означает, что ObjectInputStream ожидал прочитать объект, а прочитал хидер начала потока. То есть ошибка тут: for (Socket socket : listSocket) { // отсылка сообщения всем сокетам oos = new ObjectOutputStream(socket.getOutputStream()); Нужно хранить не список сокетов, чтобы каждый раз, проходясь по ним, создавать новые ObjectOutputStream'ы, а хранить список ObjectOutputStream'ов и переиспользовать их.

Как генерировать объекты за экраном с заданным промежутком

Приветствую всех! Делаю игру на spritekit с бесконечным уровнем (like Doodle jump)и возникла проблема: Не могу понять как генерировать платформы за экраном так, чтобы новые генерировались только после того, как предыдущая платформа уехала на определенное расстояние? Вот пример кода для генирации платформ - (void)addPlatforms { int random = arc4random() % (int)(self.frame.size.width-80)+100;
// right end platform SKSpriteNode *rightEndPlatform = [SKSpriteNode spriteNodeWithImageNamed:@"leftPlatform"]; rightEndPlatform.size = CGSizeMake(16, 16); rightEndPlatform.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(rightEndPlatform.size.width, rightEndPlatform.size.height - 5)]; rightEndPlatform.position = CGPointMake(random, 0);
// left end platform SKSpriteNode *leftEndPlatform = [SKSpriteNode spriteNodeWithImageNamed:@"rightPlatform"]; leftEndPlatform.size = CGSizeMake(16, 16); leftEndPlatform.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(leftEndPlatform.size.width, leftEndPlatform.size.height - 5)]; leftEndPlatform.position = CGPointMake(rightEndPlatform.position.x - PLATFORM_RANGE, rightEndPlatform.position.y);
// left platform SKSpriteNode *leftPlatform = [SKSpriteNode spriteNodeWithImageNamed:@"centerPlatform"]; leftPlatform.size = CGSizeMake(leftEndPlatform.position.x, 16); leftPlatform.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:leftPlatform.frame.size]; leftPlatform.position = CGPointMake(leftEndPlatform.position.x - leftPlatform.size.width/2, leftEndPlatform.position.y);
// right platform SKSpriteNode *rightPlatform = [SKSpriteNode spriteNodeWithImageNamed:@"centerPlatform"]; rightPlatform.size = CGSizeMake(self.frame.size.width+rightEndPlatform.position.x, 16); rightPlatform.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:rightPlatform.frame.size]; rightPlatform.position = CGPointMake(rightEndPlatform.position.x + rightPlatform.size.width/2, rightEndPlatform.position.y);
// add to the scene [self addChild:rightEndPlatform]; [self addChild:leftEndPlatform]; [self addChild:leftPlatform]; [self addChild:rightPlatform];
// add platforms to array [platformArray addObject:rightEndPlatform]; [platformArray addObject:leftEndPlatform]; [platformArray addObject:leftPlatform]; [platformArray addObject:rightPlatform];
for (int i = 0; i < [platformArray count]; i++) { SKSpriteNode *sprite = [platformArray objectAtIndex:i]; sprite.physicsBody.usesPreciseCollisionDetection = YES; sprite.physicsBody.dynamic = NO; sprite.name = [NSString stringWithFormat:@"beforePlayer"]; } } Генерирую платформу, потом напротив через промежуток другую платформу и достраиваю от краев экрана до этих платформ линии, получая стенку с проходом. Далее двигаю созданную конструкцию -(void)update:(CFTimeInterval)currentTime { for (int i = 0; i < [platformArray count]; i++) { SKSpriteNode *platform = [platformArray objectAtIndex:i]; platform.position = CGPointMake(platform.position.x, platform.position.y + PLATFORM_SPEED); if (platform.position.y > self.frame.size.height+100) { [platform removeFromParent]; } } } а генерация платформ происходит по времени timer = [NSTimer scheduledTimerWithTimeInterval:TIME_INTERVAL target:self selector:@selector(addPlatforms) userInfo:nil repeats:YES]; Вот и вопрос, вообще правильно ли я делаю или есть лучше вариант, как генерировать платформы не по времени а по расстоянию (первая сгенерированная платформа уехала на 100 единиц , тогда генерируем вторую, вторая уехала на 100 единиц- генерируем третью и т.д) Спасибо за внимание!


Ответ

Сразу прошу прощения, не стал вчитываться в код, (как известно, разбирать чужой код это, как лезть кому-то в душу) ). Наиболее изящный, по моему скромному мнению, выход из этой ситуации таков: 1) Остановите движение платформ, временно закомментировав соответствующую часть кода в update 2) На неподвижном экране создайте максимально возможное число платформ (на нужном Вам расстоянии друг от друга). Это легко сделать, с помощью цикла for. 3) Сдвиньте точку генерации первой из платформ на нужное расстояние за экраном. 4) Далее, в методе update начинайте двигать платформы (кстати, доступ к платформе можно получить, присвоив ей имя (если не знаете как, я напишу)) и, при этом, как только платформа пройдет нужное расстояние (то, что между каждой из платформ) за экран, Вам необходимо переместить ее в начальную точку (в ту, в которой происходила генерация первой платформы). При выполнении данного алгоритма у Вас получится непрерывный "поток" платформ, причем без наложений и дополнительной генирации (то макимальное число платформ вы просто перемещаете "по кругу") Надеюсь, у меня получилось донести до Вас мысль об общем построении таких конструкций. Если нужно что-то описать подробней, пишите, не стесняйтесь.

JS PING серверов

Доброго всем Пол дня мучаюсь с решением одного вопроса. Есть список пулов для майнинга, надо определить пинг до серверов. Пинг должен быть с IP пользователя до IP сервера, т.е. с моего сервера не пойдет, поэтому пришел к JS. После долгих поисков соорудил такую констукцию: to_host ='http://5.9.6.228'; timeStart = new Date().getTime(); $.get(to_host).error(function (){ ping_time = new Date().getTime() - timeStart; ping_time_sec = ping_time; document.write(''+ num +' Ping '+ to_host +' OK. Time '+ ping_time_sec + ' msec.
' ); }) Скрипт в консоли вываливает ошибку: XMLHttpRequest cannot load http://5.9.6.228/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. Но при этом получает ответ от сервера и я могу измерить это время. Можно ли считать полученное время временем PINGа в привычном понимании? Если совсем нет, подскажите решение, задолбался искать. Спасибо)


Ответ

На SO предлагают использовать нативный Image для проверки связи.
Кусок кода, из которого понятна идея:
function Pinger_ping(ip, callback) { if(!this.inUse) { this.inUse = true; this.callback = callback this.ip = ip;
var _that = this;
this.img = new Image();
this.img.onload = function() {_that.good();}; this.img.onerror = function() {_that.good();};
this.start = new Date().getTime(); this.img.src = "http://" + ip; this.timer = setTimeout(function() { _that.bad();}, 1500); } }
Часть времени в первый запрос уйдет на разрешение имени в ip, поэтому для имен лучше измерять повторный запрос, когда ip закэширован.
fiddle

Как правильно использовать INotifyPropertyChanged для извещения “родителя” о изменение экземпляра?

Проблема такая: необходимо изменять значения в коллекции при изменении хотя бы одного из полей в объекте. Если ближе к самой идеи кода, то при изменении длины одного из участков трубы, нужно пересчитать другие. Архитектура в коде такая: родительский абстрактный класс public abstract class AbstractTube, от которого наследуется класс public class TubingStage : AbstractTube, и создается лист из труб public class CollectionTubingStage: ObservableCollection < TubingStage > , INotifyPropertyChanged {}
//Есть обработчик события и само событие в классе TubingStage:
public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } }
// И код свойства в том же классе
public override double Lenght { get { return TLenght; } set { TLenght = value; NeedAutoAlign = true; NotifyPropertyChanged("Lenght of stage has been changed!"); } } Как мне правильно воспользоваться INotifyPropertyChanged для этого? Не понятно как из экземпляра коллекции получить доступ к самой коллекции, для ее модификации.


Ответ

Не-не, это не дело элемента коллекции, менять саму коллекцию. Делайте так: Участок трубы реализует INotifyPropertyChanged Класс Tube содержит приватно коллекцию участков. Он же занимается добавлением и удалением этих самых участков. ObservableCollection вообще не нужен, труба знает, когда в ней добавляются/уходят куски. При добавлении куска труба подписывается на его PropertyChanged, при удалении отписывается На PropertyChanged нужно пересчитать общую длину. Так же как и на добавлении и удалении куска. Если сильно хочется, можно закешировать длины кусков, чтобы не опрашивать их повторно при изменении лишь одного куска. А можно и не делать, оптимизация не особо большая, больше мороки, чем пользы.

Обрезание блоков на Ipad

При просмотре кода на Ipad'e блоки обрезаны с правой стороны, хотя ширина 100%. В чем проблема? http://rghost.ru/55715542


Ответ

- это должно помочь width - установите свою ширину По умолчанию ширина окна просмотра на iPhone устанавливается равной 980px. Но ваш дизайн может не соответствовать данному диапазону. Значение может быть для шаблона слишком большим или маленьким. посмотрите здесь

Как сохранить SMS в журнале исходящих сообщений

Добрый день! Кто может подсказать, прошу помочь. Мне необходимо после отправки смс из программы (с помощью SmsManager) сохранить это сообщение в отправленных. Как мне его записать в этот журнал? Вариант: отправлять смс с помощью Intent не подходит. Спасибо!


Ответ

Тема достаточно сложная. Документации нет. Обещают вроде к версии 4.5 наконец опубликовать нормальное API. Ну а пока делается это так: ContentValues values = new ContentValues(); values.put("address", "123456789"); //номер телефона куда отправлен смс values.put("body", "test"); //текст сообщения values.put("date", System.currentTimeMillis()); values.put("read", 1); //сообщение прочитано values.put("seen", 1); //сообщение просмотрено values.put("type", 2); //тип сообщения исходящее values.put("person"), contactId); //идентификатор контакта в БД контактов values.put("thread_id", conversationId); //идентификатор беседы getContentResolver().insert(Uri.parse("content://sms/sent"), values); Где брать идентификатор беседы? В некоторых телефонах он не требуется - система сама подставляет нужный, в некоторых это вызывает крах системы (правда редко), в некоторых сообщение просто теряется и не отображается. В общем случае идентификатор беседы это ключевое поле возвращаемое провайдером бесед content://mms-sms/conversations/ (опять же не для всех телефонов). Идентификатор контакта также можно не вставлять - работает и без него нормально. Правда, если будут 2 контакта с одинаковыми номерами - то могут быть сюрпризы. Поля read/seen/type также необязательны (в большинстве случаев). В общем гуглите, изучайте исходники Android'а - флаг в руки и барабан на шею :)

Ассоциации Rails - Автоматический выбор текущего пользователя как автора поста

Доброго времени суток! Подскажите, пожалуйста, имеются две модели: class User < ActiveRecord::Base has_many :hotels end и class Hotel < ActiveRecord::Base belongs_to :user end Миграция: class AddUserIdToHotels < ActiveRecord::Migration def change add_column :hotels, :user_id, :integer end end Форма создания нового поста про отель: <%= simple_form_for(@hotel, :html => {:multipart => true}) do |f| %> <%= f.input :title %> <%= f.input :star_rating, collection: 1..5 %> <%= f.input :room_description, as: :text %> <%= f.input :price_for_room %>

Address

<%= f.select :hotels_country, priority: ["Ukraine", "Russia", "Europe"] %> <%= f.input :state %> <%= f.input :city %> <%= f.input :street %> <%= f.input :breakfast_included %> <%= f.input :photo, as: :file %> <%= f.association :user %> <%= f.button :submit, class: "btn btn-large btn-primary" %> <% end %> Вопрос: как реализовать, чтобы при создании поста про новый отель в таблице hotels в поле user_id был текущий пользователь? При выше приведенной реализации получается, что в строке <%= f.association :user %> есть выпадающий список всех пользователей из таблицы users, а необходим только текущий, чтобы каждый пост автоматически был привязан к пользователю, который его создал.


Ответ

например в контроллере перед сохранением отеля: @hotel.user_id = current_user.id можно и через hidden_field в форме, только этот вариант не секурен

Нормальные формы БД

Добрый день! Прошу оценить мое понимание темы. 1 форма : в таблицах отсутствуют столбцы такие, что они состоят из избыточных, повторяющихся(из строки в строку) данных. Как привести: разделить такие столбцы на несколько(по количеству повторяющихся записей) 2 форма : 1я форма + в таблицах есть столбцы такие, что они не являются ключами, но имеют функциональную зависимость с остальными столбцами(задав значение таких столбцов, получим остальные). Как привести: разделить таблицу на несколько(по количеству потенциальных ключей, в итоге в каждой таблице будет только 1 первичный ключ). 3 форма : 2я форма + в каждой таблице отсутствуют неключевые столбцы, которые зависят друг от друга. если изменить значение в таком столбце, необходимо изменить и в сопряженных. Как привести: так же как и 2ю, разделив по зависимым столбцам и сделав их первичными ключами. Буду благодарен за комментарии.


Ответ

1НФ = Отношение -> 4 фундаментальных свойства. 2НФ = 1НФ + нет неключевых атрибутов, зависящих от части ключа. 3НФ = 2НФ + нет взаимозависимых неключевых атрибутов.

Как данные с тега ссылки записать в массив?

Нужно данные с тегов ссылок записать в массив.

День рождения:


Ответ

var linksData = [];
$('a').each(function() { linksData.push($(this).text()); }); Данный код сработает абсолютно для всех ссылок на странице. Если вам нужно в конкретном блоке, то делайте выборку так $('.labeled a') .....

Составление подробной документации о вашей сети

Здравствуйте.Вот решил в кучу собрать свои документы, которых невероятно много: о всех устройствах, да с анализами разными. Т.е. на данный момент у меня имеется гора различных документов, включающих базовые настройки, бекапы, описание шагов предыдущего траблшутинга и т.д.Хочу собрать все это в один документ, упростить до чего возможно, чтобы в случае чего почти любой "продвинутый" пользователь мог найти решение хотя бы простейших проблем в мое отсутствие.Более того хочется собрать в кучу т.н. Security Concept. Который даст некоторый уровень понимания, где у нас "узкие" места.Немаловажным является то, чтобы такой "пакет" документов было как можно легче обновлять, дабы поддерживать его в актуальном состоянии.Посему возник вопрос, как вы делаете это у себя на предприятии? Хочется услышать советы, работающие решения, для гетерогенных систем и предприятий с 50+ работников.Спасибо заранее за ответы!


Ответ

База знаний DokuWiki. На стартовой странице - понятные ссылки в алфавитном порядке, типа "1С", "АТС", "Новый компьютер", "Принтеры", "Картриджи", "Wi-Fi" и т.д. На видном месте есть поиск. Права можно настроить - без авторизации только просмотр. Некоторые разделы можно закрыть от посторонних (пароли). Обновлять проще некуда. Таблицы и рисунки вставляются достаточно просто. Править можно с любого компа - пароль поменял и тут же задокументировал. Тему оформления можно без излишеств подобрать, у меня - Backpack. Использую в сети около 80 хостов. Доволен. Рекомендую.

Программы взлома соцсетей [закрыт]

Добрый день! Мне вот интересна такая тема, доступны ли широкой общественности программы по взлому страничек пользователей разных социальных сетей (Вконтакт, одноклассники, фейсбук и другие) или это миф очередной? Почему-то вызывают сомнение, что такой продукт программный можно найти на просторах Интернета. Одна девушка мне сказала, что она взламывает программами специальными вконтакт и одноклассники. На мой взгляд, это маловероятно, чтобы человек без образования компьютерного мог это сделать. Для интереса скачивал пару таких программ, якобы взламывающих страницы, и не обнаружил ничего хорошего, кроме обмана: имитация взлома, спам, смс-подтверждение для распаковки программы и прочая чушь. И потом взлом в большинстве случаев происходит якобы по перебору возможных паролей (взлом "ломом"), что социальная сеть просто бы такое количество попыток входа в аккаунт отвергла бы. И второй нюанс - на такой взлом ушло бы много времени, а не то, что пишут в программах прогнозируемое точное время взлома в районе 15 минут. Что скажете по этому поводу, есть ли ПО взлома соцсетей или это просто обманка для дураков?) Второй вопрос: каким же образом осуществляют реальные взломы (мысли сразу о xss-атаках и уязвимостях) социальных страниц пользователей?


Ответ

Бред. Программ для взлома ВК и Одноклассников нет. Максимум - это всякие вирусы на компьютер жертвы или фейк сайты с авторизацией.

Как замерить время выполнения кода в миллисекундах?

Привет. Использую функцию GetTickCount() для измерения времени выполнения в миллисекундах, но вот кусок кода: UINT32 start = GetTickCount(); upper = lower + step; while (upper < n) { result += (double)(upper-lower)/6.0*(func(lower,degree) + 4*func(double(upper+lower)/2,degree) + func(upper,degree)); upper += step; lower += step; } if (upper >= n) { upper = n; result += (double)(upper-lower)/6.0*(func(lower,degree) + 4*func(double(upper+lower)/2,degree) + func(upper,degree)); } UINT32 end = GetTickCount(); UINT32 diff = end - start; В конце концов получается, что diff = 0. Если в while добавить какой-нибудь вывод (cout), то время наконец-таки замеряется. Так вот вопрос: как можно замерить время выполнения в миллисекундах? Уж больно быстро выполняется программа.


Ответ

Вы никогда не сможете замерить точное время выполнения вашего кода. Многозадачность в Windows - интересная штука, в любой момент времени операционная система может решить переключить контекст выполнения с вашей на другую задачу... И в итоге вы получите не совсем те результаты :) И присуще это не только Windows. В подобных ситуациях обычно поступают следующим образом: замеряют выполнение N повторений требуемого участка, и затем вычисляют среднее время выполнения одного повторения...

Формат ввода текста в EditText по аналогии с таймером в стандартном приложении “Часы”

Нужно сделать ввод десятичной дроби следующим образом: в самом начале в поле ввода отображается 0.000, при вводе цифр получается следующее ввели "3" -> 0.003 ввели "1" -> 0.031 ввели "6" -> 0.316 ввели "9" -> 3.169 ввели "0" - > 31.690 и т.д. Да, можно свой велосипед, но хотелось бы найти красивое решение. Даже гуглить не знаю как.


Ответ

Попробуйте это: edittext.addTextChangedListener(new NumberTextWatcher());
class NumberTextWatcher implements TextWatcher {
boolean mEditing;
public NumberTextWatcher() { mEditing = false; }
public synchronized void afterTextChanged(Editable s) { if (!mEditing) { mEditing = true; // Strip symbols String digits = s.toString().replaceAll("\\D", ""); NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMinimumFractionDigits(3); try { String formatted = nf.format(Double.parseDouble(digits) / 1000); s.replace(0, s.length(), formatted); } catch (NumberFormatException nfe) { s.clear(); } mEditing = false; } }
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
public void onTextChanged(CharSequence s, int start, int before, int count) { } }

Resolve-Path не разрешает путь, указанный в переменной

В сценарии: $VHDstorage = "d:\term_profile\"
$Domains = “domain1.local", “domain2.local”, “domain3.local” $TemplProfilePrefix = "UVHD-" $TemplProfileSuffix = ".vhdx" $LifetimeProfile=60
ForEach ($Domain in $Domains) { Search-ADAccount -server (get-addomain $Domain).pdcemulator -accountdisabled | where {$_.lastlogondate -lt (get-date).addmonths(-$LifetimeProfile)} | ForEach-Object -Process { $pathto = $VHDstorage + '*\' + $TemplProfilePrefix + $_.SID.Value + $TemplProfileSuffix (Resolve-Path -Path $pathto).path } } неверно отрабатывает блок: (Resolve-Path -Path $pathto).path т.е. не выводится ничего, хотя переменная $pathto содержит строку поиска. Что интересно, создание переменной в консоли Powershell и последующая передача этой переменной как параметра в Resolve-Path выдает необходимый результат. Как решить эту проблему?


Ответ

Разобрался. Чтобы вся эта конструкция делала то, что задумано, нужно строку с Resolve-Path изложить в следующей редакции: Resolve-Path -Path $pathto | ForEach-Object -Process { $_.Path } Да и $LifetimeProfile=60 (в месяцах) я взял слишком большим, из-за чего не видел результатов.

Почему не работает запрос?

Запрос не выдает результата, хотя в таблице он точно есть. Сам запрос: SELECT * FROM `tasks` WHERE MATCH (`description`) AGAINST (?) ORDER BY MATCH (`description`) AGAINST (?) DESC где ? строка поиска. Эмуляция на SQL Fiddle


Ответ

Вопрос решил, установкой IN BOOLEAN MODE SELECT * FROM `tasks` WHERE MATCH (`description`) AGAINST (? IN BOOLEAN MODE) ORDER BY MATCH (`description`) AGAINST (? IN BOOLEAN MODE) DESC

Laravel игнорирует метод в контроллере

Есть контроллер: class HomeController extends BaseController { public function index() { return View::make('hello'); } } и при наличии роута: Route::get('/', 'HomeController@index'); появляется ошибка: BadMethodCallException Method [index] does not exist. Команда php artisan routes, возвращает то что нужно: +--------+------------+------+----------------------+----------------+---------------+ | Domain | URI | Name | Action | Before Filters | After Filters | +--------+------------+------+----------------------+----------------+---------------+ | | GET|HEAD / | | HomeController@index | | | +--------+------------+------+----------------------+----------------+---------------+ Версия: Laravel 4.2.11


Ответ

Проблема решена. Вся проблема была в том что в папке vendor/laravel находилась папка laravel полностью дублирующая корневую директорию из-за этого пространства имен спутались и поиск был не в корневой директории а в папке vendor Пригодится кому-нибудь на будущее. :)

Насколько и где уместно использовать System.gc()?

Здравствуйте. Насколько и где уместно использовать System.gc()? При начале работы программа потребляет где-то 8-10 мб, чуть после количество потребляемой памяти вырастает до 100, 200-250 мб, после чего освобождается. По таймеру провожу System.gc() при росте объема памяти до 100+ мб, после чего объем потребления сокращается опять до 8-10 мб. Нормально-ли так делать или все-таки лучше заняться внутренней оптимизацией (правда, есть сомнения, что это сильно сократит объем)? Просто присвоение уже не нужному объекту null не меняет картину происходящего и вроде, и так программа уже слегка оптимизирована, конечно, не до идеала, но все же, поэтому и пользуюсь System.gc(), чтобы не пугать пользователей. UPD Таким образом получаю объем потребления, может быть, это не самый лучший способ. private Long getMemoryTotal(){ long allocatedMemory = (Runtime.getRuntime().totalMemory()- Runtime.getRuntime().freeMemory()); long resultkb = allocatedMemory / 1024; long resultmb = resultkb / 1024; return resultmb; }


Ответ

System.gc() уместно использовать только некоторых случаях. К примеру, если дальше идет участок кода, который сильно требовательный к памяти. И поэтому делают подготовку. Но все это лишняя работа. Уборщик мусора достаточно грамотный, чтобы сам делать уборку, когда нужно. При начале работы, программа потребляет где-то 8-10 мб, чуть после количество потребляемой памяти вырастает до 100, 200-250 мб, после чего освобождается. Нормальное дело для типичного приложения. Просто присвоение уже не нужному объекту null не меняет картину происходящего а GC не следит за каждым чихом. поэтому и пользуюсь System.gc(), чтобы не пугать пользователей. Учитывая аппетиты браузеров, пользователей не испугать 100-200 мегабайтами памяти. Но Вы сделали ошибку, выбрав Java и беспокоясь о памяти. Выбирайте что-то одно - либо Java, либо тревога о памяти. Я бы на Вашем месте понаблюдал картину в более длинной динамике. Скажем так, 10-20 дней работы. Если память не будет подыматься выше какого-то предела, то причин к тревоге нет. А если она постоянно растет - вот тут нужно тревожиться. И как получились эти цифры - 200Мб? С диспетчера задач? Диспетчер задач не является профайлером и цифры, которые там указаны, достаточно специфичны. Их ещё нужно правильно трактовать. Многие программы на java (да и не только) выделяют немного памяти про запас, чтобы потом более быстро работать. Вызывая принудительную уборку мусора, Вы заставляете комп больше работать.

Как обратиться к локальному файлу по ссылке в приложении Chrome

Доброго времени суток! Можно-ли получить доступ к локальному файлу из приложения или расширения под Chrome используя пути такого вида: file:///C:\Folder\File.jpg C:\Folder\File.jpg При попытке создать объект File() из локальной ссылки появляются ошибки: Error: GET chrome-extension://acnoddeoamaikpmmdkehnkppmcgcpfjl/C:ImagesTestcat.jpg net::ERR_FILE_NOT_FOUND Not allowed to load local resource: C:\Images\myjpeg.jpg За полным разъяснением этого вопроса смотреть мой ответ.


Ответ

Приложение или расширение Chrome не может получить доступ к локальному файлу напрямую, так как это было бы серьезным нарушением безопасности. Конечно, это ограничение можно обойти, как мне объяснили на stackoverflow через Native host. Правда, лично я не пробовал этого делать, так как свою проблему решил просто сохранением локальных файлов внутри Indexed BD. Подробнее обо всех известных мне способах хранения файлов и последующей работы с ними читайте далее.
Работа с файлами через Indexed BD.
Как сохранить файл в indexedbd? Ответ с разъяснениями здесь Как получить файл по сети и сохранить в indexedbd? Ответ здесь
Используем FileSystem API для сохранения и работы с файлами.
Справка по FileSystem API Статья о работе с FileSystem API
Local Storage & Session storage & Cookie Storage
Как работать с cookie storage? Справка здесь. Как сохранить файл в local storage? Как работать с session storage (временное хранилище)?
Сами файлы (их объекты) для работы с ними Вы можете получить через drag&drop или . Почитать подробнее о том, как это делается с примерами и последующим разбором полетов можно здесь
Надеюсь, что ответ объяснил хотя бы поверхностно о работе с файлами в приложениях и расширениях Google Chrome.

Отсортировать массив объектов по значеням второго массива

Нужно отсортировать массив sel по массиву resources или можно создать другой массив, вида sel, только отсортированный по resources. Есть 2 массива: Первый массив: var resources = [ ["1717", "1859", "3000"], ["1616", "1600"] ]; Второй массив, который нужно отсортировать или создать подобный, но отсортированный по первому: var sel = [ [ {"id":"3000","title":"3G"}, {"id":"1859","title":"4G"}, {"id":"1717","title":"Customer"} ], [ {"id":"1600","title":"Should"}, {"id":"1616","title":"Ranking"}
] ]; Первый элемент массива sel [ {"id":"3000","title":"3G"}, {"id":"1859","title":"4G"}, {"id":"1717","title":"Customer"} ] должен иметь порядок, как в массиве resources ["1717", "1859", "3000"] Заранее спасибо.


Ответ

var sorted_sel = []; resources.forEach(function(line, i){ sorted_sel[i] = []; line.forEach(function(resources_el){ sel[i].forEach(function(sel_el){ if(sel_el.id === resources_el) sorted_sel[i].push(sel_el); }); }); });

Переход во фрагмент при нажатии на кнопку

Всем добрый вечер, уже какой день мучаюсь с этими фрагментами, все никак не могу реализовать, например, у нас есть активити, на нем расположена кнопка, и при нажатии на нее, сразу же открывается новое окно фрагмент. Вот в этом приложении так реализовано. https://play.google.com/store/apps/details?id=com.formul.fizik&hl=ru Нажимаем и открывается. Обновление Дело в том, что реализовать переход из одного активити в другое активити, проблем нет, но я никак не пойму, как с помощью фрагментов можно сделать быстрый переход, возьмем тот же справочник, который выше. При нажатии на кнопку, мгновенно открывается содержание определенной темы. К сожалению ошибка http://joxi.ru/GrqBoweHQnpGmz Ошибку исправил, но у меня получается при нажатии на фрагмент появляется фрагмент, и кнопки остаются, и я могу нажать еще раз и еще раз на кнопку и так кол-во раз, появится фрагмент. Обновление 2 Я исправил импорт с import android.support.v4.app.Fragment; на import android.app.Fragment; - ошибка пропала. Я создал layout: activity_main и fragment. Fragment1.class и MainActivity В Fragment.class я прописал public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment1, null); } } А в MainActivity заскринил http://joxi.ru/1A5J4n9tn0BprE Так же fragment.xml http://joxi.ru/Y2LDVWqH9wyJ26 activity_main http://joxi.ru/l2ZYByVHwDKGmJ


Ответ

Принцип тут такой: 1) В разметке активити есть контейнер (FrameLayout, например) с id="yours_id". 2) В активити, при нажатии на кнопку, добавляем фрагмент в контейнер: Fragment yoursFragment=new YoursFragment(); FragmentTransaction trans=getFragmentManager().beginTransaction(); trans.add(R.id.yours_id, yoursFragment); trans.commit(); 3) Чтобы всё это работало, вам скорее всего придётся переделать всю логику активити под фрагменты (т.е. кнопка, запускающая открытие фрагмента тоже должна быть во фрагменте, и оба фрагмента должны быть в одном контейнере); Обновление Если же вы хотите, чтобы на экране "исчезали" все кнопки и 1-й фрагмент появлялся поверх всего, то вам надо сами кнопки встроить в другой фрагмент. Далее при старте активити добавлять фрагмент с кнопками (в FrameLayout), а при нажатии на одну из них делать trans.replace(R.id.yours_id, frag1); trans.addToBackStack(null); trans.commit(); Так у вас будет всё содержимое с экрана по нажатию кнопки заменяться на frag1, а при нажатии на кнопку "назад" показываться опять фрагмент с кнопками.

Как использовать LIB от другого компилятора?

Имеется LIB, собранная в BC3.1, она использует его RTL. Собственно, вопрос заключается в том, как воспользоваться этой библиотекой в другом компиляторе? Исходников библиотеки, понятное дело, нет. Есть ли способ собрать "добавку" в BC3.1 к этой библиотеке, которую потом спокойно использовать в другом компиляторе?


Ответ

Вам необходимо будет сделать библиотеку-прослойку. Поскольку исходная lib использует RTL, взаимодействовать с нею нужно только компилятором версии, в которой она была собрана. Соответственно, при помощи этого компилятора необходимо собрать новую библиотеку, которая будет клиентом к исходной, предоставлять интерфейс к функциональности исходной, и этот интерфейс должен удовлетворять ряду "переносимых" критериев: "Ansi C" интерфейс. Т.е. никаких экспорта классов, никакого экспорта STL и т.п.. Экспорт только функций, входные и выходные параметры только стандартные типы. Никаких include-ов стандартных библиотек. Если Вы сделаете один header, в идеале ему вообще не нужно содержать сторонних include-ов. Если содержит, в идеале это "Ansi C", как, например, "windows.h" (могу ошибаться, но, вроде бы, он без включений STL, классов и т.п.) Библиотека не будет бросать никакие exception. Все их от исходной необходимо обрабатывать, но не пробрасывать выше. Перехвать exception компиляторозависим. Вся память, выделяемая внутри библиотеки, должна освобождаться внутри библиотеки. Если где-то управление жизнью выделенной памяти передается клиенту, то интерфейсу надо иметь функцию, которая будет позволять освобождать такую память. Лучше отказаться от абстрактных структур. Теоретически это не должно быть проблемой, но многие детали реализации виртуализации не стандартизированы, а значит компиляторы могут выполнять их по-разному, и это на практике (у меня между MinGW и VS разных версий, хотя между разными компиляторами MinGW и между разными VS такой проблемы не наблюдал) приводит к проблемам. Вроде бы ничего не забыл.

Android ViewPager как пролистывать напопловину?

Есть два фрагмента и перелистывающий их ViewPager, мне нужно, чтобы первый фрагмент занимал по ширине не весь ViewPager, а его часть, т.е. чтобы был полностью виден первый фрагмент и левая часть второго фрагмента. Возможно такое сделать?


Ответ

viewpager.setClipToPadding(false) viewpager.setPadding(left,0,right,0) Где left и right - ширина "куска" левого и правого фрагментов, которые будут показываться одновременно с основным. Если нужно добавить также и отступ между фрагментами: viewpager.setPageMargin(int)

Как в JS вставить разметку HTML?

Всем привет. Подскажите, как в JS вставить HTML блок с содержимым? Например:

Текст текст
Текст текст

Так оно почему-то не работает, а как правильно, чтобы потом подключил этот файл и оно читало разметку?


Ответ

http://jsfiddle.net/aqjLk2yk/ http://jquery-docs.ru/attributes/html/ http://jquery-docs.ru/attributes/text/

Не сохраняется добавление записи в БД, EF

Есть банальная табличка
Создана она как локальная база (.mdf) Пишу добавление:
ProjEntities context = new ProjEntities(); context.Tables.Add(new Table { ProductName = "Book", Price = 85 });
context.SaveChanges();
Изменения не добавлялись в базу. Хотя, если сразу за сохранением с контекста выбрать записи в список, то добавленная запись есть.


Ответ

Под локальной базой обчыно подразумевается подключение к SQL Express / SQL Local DB с указанием AttachDBFileName = |DataDirectory|\mydatabase.mdf
|DataDirectory| в случае не-ASP.NET приложения означает "та папка, в которой лежит exe файл". Т.е. это скорее всего не папка проекта, в которой лежат исходники, а папка bin.
Т.е. при указании пути через |DataDirectory| программа работает не с mdf-файлом, добавленным в проект, а с его копией в bin.
Это не является спецификой EF, то же самое происходит и при ручной работе с SQL через ADO.NET.
Поэтому при таком способе подключения обычно проявляются две связанных проблемы.
Проблема 1: изменения, внесенные программой "не видны" в базе данных. Причина: программа работает с копией файла в bin, а разработчик проверяет на наличие изменений оригинал в папке проекта. Решение: исправляется просмотром файла из bin. Проблема 2: изменения, внесенные программой, теряются при перезапуске программы из студии (по F5 / Ctrl + F5). Причина: - mdf файл по умолчанию добавляется проект с Build Action = Content, и настройкой Copy To Output Folder = Always. Это означает, что при перестроении приложения (при повторном его запуске из студии) файл базы из проекта копируется в папку bin, заменяя лежащий там файл, в который были сохранены данные при прошлом запуске. Решение: исправляется сменой значения Copy To Output Folder для mdf-файла в проекте на If Newer.

Алгоритм распознавания состояний глаз - открыты/закрыты

Добрый день. Требуется реализовать алгоритм, позволяющий определять, в каком состоянии находятся его глаза, если можно так выразиться. Нужно определять состояния Открыты, Закрыты, можно еще Закрыты на хх%. Буду признателен за подсказки, где можно про это почитать.
UPD Прошу только навести, где есть информация о распознавании глаз.


Ответ

Задача очень нетривиальна и, предваряя поиск решения, требует конкретизации условий, в которых необходимо производить детекцию моргания или просто текущего состояния глаз в кадре: открыты или закрыты.
Возьмём, к примеру, стандартный случай.
Если на исходном изображении лицо не заполняет всю видимую область, то таковую необходимо локализовать. Для решения этой задачи существует не так уж и много решений, но то, что имеется в подавляющем количестве случаев более чем удобоваримо. Речь прежде всего о каскаде Хаара. Во многих фреймворках, так или иначе касающихся тематики компьютерного зрения, имеется реализация данного инструмента, позволяющая с относительно высокой точностью локализовать местоположение лица в кадре.
После нахождения региона, содержащего лицо, уже в нём необходимо локализовать местоположение обоих глаз. Как правило, начав с каскада Хаара в случае с лицом, не останавливаются в использовании этого же инструмента и для глаз. Просто берут соответствующий файл классификатора, заранее обученный на поиск желаемого типа объекта. К слову сказать, оба типа классификаторов (для лиц, глаз, да и других объектов) имеются во многим известном фреймворке OpenCV, ориентированном как раз на решение задач, навроде той, что встала перед автором вопроса.
Не стану останавливаться на задаче, как реализовать детекторы лиц и глаз посредством каскада Хаара (метод Виолы-Джонса) в том же OpenCV, так как об этом расписано в сети, наверное, вдоль и поперёк, да и вопрос конкретно не затрагивает эту область.
Предположим, что после применения алгоритмов детекции мы получили следующие изображения, отражающие два состояния глаз: открыты и закрыты.

Изображения мною взяты исключительно для примера, но в реальности, если съёмка ведётся с обычной вебкамеры, области глаз получаются значительно меньше. Это просто в следствие того, что специально подносить собственную физиономию близко к объективу редко у кого возникает желание. Но именно в следствие этого (условий съёмки, упоминаемых мною в самом начале) как правило и начинаются расхождения в подходах к определению местоположения зрачка.
Методов по детекции зрачка разработано довольно много. От самых простых, до комплексных. Очень многие подробно расписаны (к сожалению в подавляющем большинстве случаев на английском). А для некоторых имеется и вполне свободный доступ к исходникам. На том же гитхабе можно обнаружить довольно много различных решений. Например такое или такое. Последнее, кстати, не требует локализации области глаз, только лишь лица.
Вообще, детекция зрачка кажется очевидным путём для решения поставленной задачи: зрачок есть - глаз открыт, нет зрачка - глаз закрыт. Но у многих методов, идущих этим путём, имеется проблема с детекцией в том случае, если глаз полуприкрыт или закрыт вовсе. В этом случае происходят ложные срабатывания алгоритмов и те выдают местоположение зрачка аккурат на ресницах, "лежащих" на соединении верхнего и нижнего века. То есть, искомое состояние о закрытии глаза способны выдавать далеко не все методы.
Для решения этой проблемы можно использовать машинное обучение или даже предварительно сделать образцы открытого и закрытого глаз, а затем сравнивать с этими шаблонами новые кадры. Но можно пойти и от обратного, например, применив самый простой детектор кожи. Очевидно, что если глаз закрыт, цветом кожи будет покрыто практически всё изображение глаза, а если открыт, то далеко не всё.
int main() { // Загрузить изображения открытого и закрытого глаз из файлов. cv::Mat eye_opened_mat = cv::imread("eye-opened.jpg"); cv::Mat eye_closed_mat = cv::imread("eye-closed.jpg");
// Показать, что загрузили в отдельных окошках. cv::imshow("eye-opened", eye_opened_mat); cv::imshow("eye-closed", eye_closed_mat);
// Сконвертировать цветовое пространство изображений в YCbCr. cv::Mat opened_mat, closed_mat; cv::cvtColor(eye_opened_mat, opened_mat, cv::COLOR_BGR2YCrCb); cv::cvtColor(eye_closed_mat, closed_mat, cv::COLOR_BGR2YCrCb);
// Изъять из картинок указанные диапазоны значений пикселей // для каждого из цветовых каналов YCbCr. cv::inRange(opened_mat, cv::Scalar(0,133,77), cv::Scalar(255,173,127), opened_mat); cv::inRange(closed_mat, cv::Scalar(0,133,77), cv::Scalar(255,173,127), closed_mat);
// Показать результат в отдельных окошках. cv::imshow("grd-opened", opened_mat); cv::imshow("grd-closed", closed_mat); cv::waitKey();
return 0; }
Этот код использует OpenCV. Результат будет следующий:

Разница между закрытым и открытым глазами очевидна и не составит никакого труда алгоритму выдать правильный ответ о состоянии глаза. Преимуществом данного подхода является скорость. Работает он очень быстро. Недостаток: чувствительность к перепадам освещённости, ну и конечно к неграм (без обид), для цвета кожи которых придётся подбирать иные коэффициэнты.

Как последовательно запустить несколько процессов, а код завершения последнего потомка передать первому процессу?

Добрый вечер. Подскажите как правильно выполнить задачу? Необходимо создать цепочку из 5 последовательно запущенных процессов, когда каждый дочерний процесс становится родителем для следующего потомка. Код завершения последнего потомка передать первому процессу. В первом процессе вывести данное число на экран.
Создал в цикле 5 процессов:
pid_t return_value;
for(int i = 0; i < 5; i++) { return_value = fork(); printf("%s %d %s %d
", "Процесс: ", getpid(), "PID: ", return_value); }
return 0;
Данный код выдает мне в терминале огромную простыню,
Я так понимаю что это из-за того, что после создания нового процесса они продолжают выполняться параллельно. Как код завершения последнего потомка передать первому процессу так и не выяснил. Подскажите как правильно сделать?


Ответ

Надеюсь, Вы уже сами успешно решили свою задачку, но на всякий случай вот простой код.
#include #include #include #include
int main (int ac, char *av[]) { int n = 5, s; srand(getpid());
while (n--) if (fork()) break;
if (n < 0) { // last child s = rand() % 100; printf("child %d exit rc: %d
", (int)getpid(), s); exit(s); }
wait(&s); if (n != 4) // all except first exit(WEXITSTATUS(s));
printf("Grandfather %d: child exited: %d
", (int)getpid(), WEXITSTATUS(s));
return puts("End") == EOF; }
Т.е. делаем цикл по переменной (в коде -- n), которая наследуется новым процессом и в нем запускаем новый процесс. Родитель выходит из цикла, ждет завершения потомка (тот в свою очередь ждет завершения своего потомка и так 5 раз). Если это не прародитель (определяем по n), то выходим с кодом завершения потомка, который получили в wait()
(без pipe передать PID последнего процесса в первый не получится (конечно, кроме разделяемой памяти или файла), но это мы с Вами вроде уже обсуждали).

Многопоточный epoll

Написал код с epoll_create1(0); epoll_ctl(); epoll_wait(); и при вызове epoll_wait(); из двух потоков с удивлением вижу, что они возвращают одинаковые сокеты.
Мне казалось, что epoll можно использовать из разных потоков. Я не прав? Как получить многопоточный epoll? Есть ли стандартное решение или он просто заменяет select() и многопоточность нужно реализовывать самому?


Ответ

Все оказывается до банальности просто, достаточно использовать флаг EPOLLONESHOT в epoll_ctl() и сокет будет выдаваться один раз.

Система плагинов

Захотелось научиться работать с отражением и вот этим всем. Начал с простенького, решил написать подключаемый плагин, который автоматически подгрузится из именной папки.
Что бы не мучиться с отражением методов и прочей нечистью на ум конечно же приходит наследование и полиморфизм. То есть мне нужен какой-то базовый класс с начальным функционалом от которого будут наследоваться все другие плагины.
То есть нужно сделать отдельную библиотеку с апи, которую будут использовать обе стороны (программа и плагин).
public interface IPlugin { void Loaded(); }
Вот такой класс придумал в этой библиотеке. Теперь я могу спокойно ее подключать к плагину и наследоваться.
public class Test : IPlugin { #region Implementation of IPlugin
public void Loaded() => Console.WriteLine( "Hello World" );
#endregion }
Вот у меня уже две библиотеки, одна с моим апи, другая его использует. Теперь мне нужно как-то загрузить сборку с плагином и использовать его методы. Вот тут мне и нужна помощь.
Так как библиотека плагина использует другую библиотеку с апи, я не смогу ее так просто загрузить, так как выскочит ошибка мол либе не хватает референсов. Как правильно загрузить плагин указав что сборка которая ему нужна уже загружена в программу?
Вот код которым я пытаюсь что-то наколдовать:
private static void Main ( string[] args ) { var pluginsPath = $"{Directory.GetCurrentDirectory()}\\Plugins"; var files = Directory.GetFiles( pluginsPath , "*.dll" );
foreach ( var file in files ) { Console.WriteLine( $"Trying load: {file}" ); Assembly assembly;
try { assembly = Assembly.Load( file ); } catch ( Exception ex ) { Console.WriteLine( ex.Message ); continue; }
var types = assembly.GetTypes().Where( type => type.IsClass && type.GetInterface( nameof( IPlugin ) ) != null );
foreach ( var type in types ) { var plugin = Activator.CreateInstance( type ) as IPlugin;
if ( plugin == null ) { Console.WriteLine( "Null" ); continue; }
plugin.Loaded(); } } }
Падает еще на первом try с сообщением:
Необработанное исключение типа "System.IO.FileLoadException" в mscorlib.dll Дополнительные сведения: Не удалось загрузить файл или сборку "C:\Users\anweledig\Documents\Visual Studio 2015\Projects\Anweledig\ConsoleApplication\bin\Debug\Plugins\TestPlugin.dll" либо одну из их зависимостей. Данное имя сборки или база кода недействительны. (Исключение из HRESULT: 0x80131047)


Ответ

Вы можете просто загрузить другую библиотеку. Все ее зависимости будут автоматически загружены.
Проблема может быть только в случае, если библиотека лежит не в той же папке, в которой лежит ваше приложение, и вы при этом загружаете ее через Assembly.LoadFrom. Чтобы это обойти, вам нужно указать рантайму что зависимости надо искать в папке плагина, а не в папке вашего приложения. Тогда можно будет использовать обычный Assembly.Load и заодно заработает станадартный механизм загрузки сборок.
Для этого можно использовать создание аппдомена с указанием AppDomainSetup.ApplicationBase
Т.е. схема примерно такая:
У вас есть базовая dll для плагинов - MyApp.SDK, в ней базовый класс (а лучше - интерфейс):
public abstract class Plugin { public abstract void Loaded(); public abstract void Unload(); }
в ней же код загрузки и вызова плагина (для простоты)
public static class PluginInvoker { public static void InvokePlugin() { var pluginAssembly = Assembly.Load("SomePlugin"); var pluginType = pluginAssembly.GetTypes().Where(t => typeof(Plugin).IsAssignableFrom(t)).Single(); Plugin plugin = (Plugin)pluginType.GetConstructor(new Type[0]).Invoke(null); plugin.Loaded(); } }
есть реализация этого плагина в SomePlugin.dll:
public class Test: MyApp.SDK.Plugin { public override void Loaded() { Console.WriteLine("Loaded"); }
public override void Unload() { Console.WriteLine("Unloaded"); } }
в SomePlugin есть референс на MyApp.SDK.
И есть главное приложение, в котором есть ссылка на MyApp.SDK, но нет ссылки на SomePlugin:
static void Main(string[] args) { AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationBase = @"C:\Projects\MyApp\SomePlugin\bin\Debug\";
AppDomain pluginDomain = AppDomain.CreateDomain("plugin", null, setup); pluginDomain.DoCallBack(PluginInvoker.InvokePlugin); }
ApplicationBase задает папку, откуда AppDomain будет загружать сборки - т.к. это папка плагина, то все, на что он ссылается, будет корректно загружено.
Если плагины подгружаются из подпапки приложения (например, из Plugins), то в вместо AppDomainSetup.ApplicationBase можно использовать AppDomainSetup.PrivateBinPath
Если же при этом плагины вообще не планируется выгружать, и все плагины лежат в одной папке (без подпапок на каждый из плагинов) - то можно обойтись без отдельного AppDomain, просто дописав путь к папке с плагинами в секцию app.config/
код примера на github: https://github.com/PashaPash/PluginLoadSample