Страницы

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

четверг, 13 июня 2019 г.

Как объявить параметр output хранимой процедуры в C#?

EXEC @return_value = [Obj_Insert2] @Check = 1, @cID = @cID OUTPUT
SELECT 'Return Value' = @return_value
как объявить обычный параметр @check понятно
sqlCmd.Parameters.Add("@Check", SqlDbType.Int).Value = 1;


Ответ

Можно создать отдельно объект SqlParameter и установить его свойства:
SqlParameter par = new SqlParameter("@cID", SqlDbType.Int); par.Direction = ParameterDirection.Output; par.Value = value; sqlCmd.Parameters.Add(par);
Или же сразу добавить параметр в команду:
sqlCmd.Parameters.AddWithValue("@cID", value).Direction = ParameterDirection.Output;

Преобразование типов с#

Объясните почему возникает ошибка на этапе выполнения?
namespace CSharp { internal class B { } internal class D : B { } internal class Program { private static void Main() { Object o1 = new Object(); B b1 = new B(); D d6 = (D)b1; //System.InvalidCastException - не удалось привести тип объекта "CSharp.B" к типу "CSharp.D" B b5 = (B)o1; //System.InvalidCastException - не удалось привести тип объекта "CSharp.Object" к типу "CSharp.B" } } }


Ответ

Все просто, переменная b1 ссылается на объект типа B. Тип B в свою очередь является базовым для типа D, т.е. D является производным от B. Привести объект базового типа к более производному нельзя.
D d6 = (D)b1;
Аналогичная проблема и с этой строчкой
B b5 = (B)o1;
P.S. Небольшое замечание, если мы напишем следующий код:
B b = new D(); D d = (D)b;
и попробуем его выполнить, ошибки не будет. Здесь важно понимать следующее, что несмотря на то, что переменная b у нас типа B, она ссылается на объект типа D, поэтому приведение к типу D сработает. Т.е. строчка ниже выполнится без проблем.
D d = (D)b; // все ОК

Запись string в бинарый файл . С++

Нужна помощь.
У меня есть класс с полями типа: string, int и float; Как мне занести данные даного класса в бинарный файл?
Пример кода:
class foo { string Name; int Age; public:
void show() { cout << "Name = " << Name << endl; cout << "Age = " << Age << endl; } };
int main() { foo obj("Something Name", 10); foo obj2;
ofstream file("file.bin", ios::binary | ios::app); file.write((char *)(&obj), sizeof(obj)); file.close();
ifstream file2("file.bin", ios::binary); file2.read((char *)(&obj2), sizeof(obj2)); file2.close();
obj2.show();
return 0; }
В результате работы программы выскакивает ошибка.


Ответ

Этот вопрос обсуждался, но раз вы спрашиваете как, а не почему :), то примерно так:
class foo { string Name; int Age; public:
void show() { cout << "Name = " << Name << endl; cout << "Age = " << Age << endl; }
void write(ostream& os) { os.write((char*)&Age, sizeof(Age)); // Запись POD-члена size_t len = Name.length()+1; // Длина с нулевым байтом os.write((char*)&len, sizeof(len)); // Запись длины os.write((char*)Name.c_str(),len); // Запись данных }
void read(istream& in) { in.read((char*)&Age,sizeof(Age)); // Чтение POD-члена size_t len; // Переменная для длины in.read((char*)&len, sizeof(len)); // Чтение длины записанной строки char * buf = new char[len]; // Выделение буфера для чтения in.read(buf,len); // Чтение (с нулевым байтом) Name = buf; // Присвоение считанной строки члену delete[]buf; // Освобождение памяти } };
А дальше -
ofstream file("file.bin", ios::binary | ios::app); obj.write(file);
Ну и, соответственно, read
Это - наброски без проверки ошибок, попроще - чтоб была понятна идея. Можно читать прямо в строку, функцию write нужно сделать константной etc etc... но главное, надеюсь, ясно?

Visual studio 2017 есть ли способ дебажить web запросы?

Использую в своём C# проекте библиотеку xNet. Возникла потребность посмотреть что передаёт данная библиотека в интернет без установки сторонних приложений. Для примера хотелось бы посмотреть данные такого запроса:
using xNet; // using (var request = new HttpRequest()) { request.AllowAutoRedirect = false; request.UserAgent = Http.FirefoxUserAgent(); request.AddUrlParam("name", name).AddUrlParam("password", password); var content = request.Post("http://ru.stackoverflow.com");//что он отправил? }
Хотелось бы иметь инструмент, который был бы похож на дебагер запросов от Firefox. Может кто-нибудь знает как это сделать далеко не отходя от visual studio 2017.


Ответ

Если вы пишете бот для сайта, то вам надо знать что отправляет не только ваш бот, но и сайт - формы, AJAX, чтобы все это в точности повторить, поэтому отладка кода не совсем корректное решение, более правильно использовать сниффер - Fiddler, Wireshark, Charles, в нем можно все сравнить до последнего символа. Если же занимаетесь полноценным реверс-инжинирингом приложения, и нужно например понять где отправляется запрос с нелегальной передачей конфиденциональных данных на китайский сервер, то используется именно отладка кода, как в другом ответе, причем в отличие от сниффера она позволяет легко перехватить или просто заблокировать отправку запроса и получение ответа. А вообще-то, нужно и то, и другое, часто неясно каким образом формируется параметр HTTP, и приходится работать с кодом.

spree footer image path ошибка

Добрый день. Начал использовать spree,к горю или к сожалению... Скорее всего второе.
Проблема в том, что мои изображения не отображаются корректно, а именно во вьюхах разных контроллеров.
Вот примеры моих вьюх:
spree/layouts/spree_application.html.erb
<%= render partial: 'spree/shared/footer' %>
spree/shared/_footer.html.erb


  • Изображения лежат в appname/public, и корректно отображается лишь на главной странице, на других пропадают изображения, хотя это же футер из application.
    2) Судя по гайду с офф сайта изображения должны находиться в других папках, куда я их не вставлял, какие пути не указывал в web inspector, все равно не отображается :(
    Помогите пожалуйста
    p.s в другом вопросе на стаке увидел вот такое :
    "Найдите файл spree/backend/config/routes.rb . В конце этого файла есть строка" Файл этот есть на гитхабе, а вот где он расположен на компьютере...


    Ответ

    и корректно отображается лишь на главной странице, на других пропадают изображения
    Не кажется странным? Выходит, загружаемость или незагружаемость изображения зависит от текущей страницы? Значит ли это, что картинка указана относительным путём?
    Хм... а ведь так и есть:

    Чтобы искать всегда именно в корне сайта, нужно начинать путь с /, чтобы URL был относительным для сайта, но не для страницы (т. е. имел тот же источник, но не путь):


    Относительные URL описываются RFC 1808. Там попадаются строгие технические описания, но с объяснениями рядом с ними стоит ознакомиться.

    Простое if условие не работает, где может быть ошибка?

    Скрипт для Unity, но возможно здесь просто оевидная C# ошибка которую я не вижу... Имеется скрипт, "печатающий" текст по букве. Он применен к тексту кнопки кнопки (text, потомок button). Нужно чтобы скрипт запускался только если кнопка нажимабельна (interactable).
    Я создал публичную переменную чтобыперетащить в нее кнопку в Unity, и использовал GetComponent(), но почему-то не работает.
    Ниже короткий скрипт. Почему это не сработало, где ошибка? Заранее спасибо!
    UPD скрипт слегка обновлен но по-прежнему не работает.

    using UnityEngine; using System.Collections; using UnityEngine.UI;
    // attach to UI Text component (with the full text already there)
    public class UITextTypeWriter : MonoBehaviour {
    public Text txt; string story; public Button ThisButton;
    void Start() { txt = GetComponent(); story = txt.text; txt.text = "";

    if (ThisButton.interactable) { StartCoroutine(PlayText()); } }
    IEnumerator PlayText() { foreach (char c in story) { txt.text += c; yield return new WaitForSeconds(0.125f); } }
    }


    Ответ

    isActiveAndEnabled - вернет false, если компонент изначально был активен, и true если скрипт был активирован(ГО был не активен, а потом его включили или деактивировали, а затем активировали.) - поправьте меня если я не прав.
    public Text txt; string story; public Button ParrentButton;
    void Awake() { txt = GetComponent(); story = txt.text; txt.text = "";
    ParrentButton = transform.parent.GetComponent

    Как избавиться от подзапросов? Выборка sql

    Задание: Добавить новый заголовок документа (одной командой insert); -Номер документа = последний номер документа+1; -Дата=текущая дата; -Тип=расход,если документов типа "приход "больше ,чем документов типа "расход".В противном случае тип=приход. -Учесть,что в таблице DMZ изначально может не быть ни одной строки.
    Таблица DMZ - документ.DDM - дата, NDM- номер документа,PR - приход/расход (1-приход, 2-расход)товара. Сам запрос есть :
    INSERT INTO DMZ (DDM, NDM, PR) SELECT GETDATE() DDM, (isnull((SELECT MAX(NDM) FROM DMZ), 0) + 1) NDM, CASE WHEN isnull((SELECT COUNT(*) FROM DMZ WHERE PR = 1), 0) > isnull((SELECT COUNT(*) FROM DMZ WHERE PR = 2), 0) THEN 2 ELSE 1 END

    Запрос работает , но нужно его оптимизировать,заменив два запроса в операторе CASE на один.Как это сделать?
    Вставляю диаграмму бд , если чем-то поможет.


    Ответ

    нужно его оптимизировать,заменив два запроса в операторе CASE на один. Как это сделать?
    Можно получить COUNT для PR=1 и PR=2 одновременно с помощью PIVOT
    ;WITH DMZ1 AS (SELECT PR FROM DMZ) SELECT [1], [2] FROM DMZ1 PIVOT (COUNT(PR) FOR PR IN ([1], [2])) P;
    Соответственно, исходный запрос может быть преобразован, например, в:
    ;WITH DMZ1 AS (SELECT PR FROM DMZ) INSERT INTO DMZ (DDM, NDM, PR) SELECT GETDATE() DDM, (isnull((SELECT MAX(NDM) FROM DMZ), 0) + 1) NDM, CASE WHEN EXISTS( SELECT 1 FROM DMZ1 PIVOT (COUNT(PR) FOR PR IN ([1], [2])) P WHERE [1] > [2] ) THEN 2 ELSE 1 END;
    Обычную группировку c CASE тоже можно использовать:
    SELECT [1] = COUNT(CASE WHEN PR=1 THEN 1 END), [2] = COUNT(CASE WHEN PR=2 THEN 1 END) FROM DMZ;
    Использование PIVOT иногда даёт более лаконичную запись, но CASE более гибок (PIVOT хотя и представляет собой синтаксический сахар, однако в SqlServer синтаксис PIVOT развит не настолько хорошо как, например, в Oracle).
    Обычная группировка с CASE здесь будет даже предпочтительнее, поскольку позволит и максимальный номер документа достать в одном запросе:
    SELECT MAXNDM = ISNULL(MAX(NDM), 0), [1] = COUNT(CASE WHEN PR=1 THEN 1 END), [2] = COUNT(CASE WHEN PR=2 THEN 1 END) FROM DMZ;
    Соответственно, исходный запрос может быть преобразован в такой:
    INSERT INTO DMZ (DDM, NDM, PR) SELECT GETDATE(), ISNULL(MAX(NDM), 0) + 1, CASE WHEN COUNT(CASE WHEN PR=1 THEN 1 END) > COUNT(CASE WHEN PR=2 THEN 1 END) THEN 2 ELSE 1 END FROM DMZ;

    Форматирование кода в VS Code (C#)

    Как настроить форматирование кода в VS Code под C# привык к нормальному компактному синтаксису в стиле Java, т.е.
    void Start(){ Sphere.GetComponent().material.color = Color.black; }
    а VS предлагает так:
    void Start() { Sphere.GetComponent().material.color = Color.black; }


    Ответ

    К сожалению, в данный момент это не built-in фича, но проблема легко решается установкой стороннего расширения:
    Ctrl + P -> ext install csharpfixformat -> Install
    Форматирование: Ctrl + Alt + I
    Конфигурационные строки описаны тут (по умолчанию установлен как раз Java стиль)

    Новая почта(Android API)

    Не получается получить доступ к API новой почты.
    Использую Retrofit для работы с сетью.
    Вот таким образом формирую интерфейс:
    @FormUrlEncoded @POST("/v2.0/json") Call getSity(@Field("apiKey") String key, @Field("modelName") String modelName, @Field("calledMethod") String calledMethod);
    Ну и затем обращаюсь к серверу:
    Call call = api.getSity("key","InternetDocument","getDocumentList"); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { Log.d("TAG", "Success"); }
    @Override public void onFailure(Call call, Throwable t) { Log.d("TAG", "Fail"); } });
    ну и собственно инициализация:
    Gson gson = new GsonBuilder().create(); Retrofit retrofit = new Retrofit.Builder() .client(getUnsafeOkHttpClient()) .baseUrl("https://api.novaposhta.ua") .addConverterFactory(GsonConverterFactory.create(gson)) .build(); API api = retrofit.create(API.class);
    В ответ ловлю:
    java.net.SocketTimeoutException: failed to connect to api.novaposhta.ua/185.128.233.69 (port 8883) after 10000ms
    Увеличивал время ожидания до 60 секунд, не помогло. Да и данных там не так много чтобы тянуть их дольше минуты
    UPD:


    Ответ

    Попробуйте подергать API через Postman это поможет проверить насколько правильно вы указываете ключи, заголовки. Извините, не силен в android и java, ничего не могу сказать по вашему коду, но вообще ошибка таймаута это скорее серверные проблемы. Вообще странный порт, вы пробовали менять на 80 или 443?
    Ну Вам же вернуло ошибку. Скорее всего она заключается в том, что вы отправляете данные в url, а надо в body выставить raw и в нем сформировать джисон согласно описанию в доках, добавить хоть какие-нить хеды и отправить это все на https://api.novaposhta.ua/v2.0/json

    Добавление информации в файл

    Можно ли на Си поменять определенную информацию в конкретном месте в файле, а все остальное оставить?


    Ответ

    Можно, если размер измененной информации соответствует размеру исходной.
    Представьте файл магнитофонной лентой (забавно, уже нужно задумываться - а видел ли собеседник такую :)), на которой записаны разные песни. Вы хотите одну из них, в средине, заменить. Подгоняете ленту в нужное место (fseek()), и перезаписываете (fwrite()).
    Но если новая песня короче старой - останется кусок старой (или, если просто сотрете этот кусок - тишина), если длиннее - перезапишете начало следующей.
    Иначе - только перезапись всего, что находится после изменяемой информации, на новые места.
    Т.е., переводя на наши компьютерные реалии - если в файле записаны, например, одинакового размера структуры, то одну из них можно заменить, не трогая другие. Если текст - то слово (строку, абзац) можно заменить только словом (строкой, абзацем) той же длины.

    Вопрос по циклу md5 hashlib хеширования

    Всем привет! столкнулся с необъяснимой ситуацией: есть цикл, который получает слово рандомом, а потом хеширует его в md5 при помощи hashlib и записывает в тхт-файл. Слова рандомом получает как надо, но почему то хеш в выходном файле получается один и тот же, как будто хешируется одно и то же слово. не пойму почему так:
    import random from hashlib import md5 import requests import time out = input (r'Укажите файл для сохраниния: ') out2 = open (out, 'w') slovar = ('q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m','1','2','3','4','5','6','7','8','9','0') for i in range (99): randomm = random.choice(slovar) + random.choice(slovar) + random.choice(slovar) + random.choice(slovar) randomm2 = md5(b'randomm').hexdigest() r = requests.get ('http://mysite.com/'+ str(randomm2)) out2.write (randomm2 + '+' + str(r.status_code) + '
    ') time.sleep (1) out2.close


    Ответ

    Проблема в строчке
    randomm2 = md5(b'randomm').hexdigest()
    Выше у вас есть переменная randomm, наверное, просто опечатка.
    Попробуйте поменять на:
    randomm2 = md5(randomm.encode()).hexdigest()

    Как создать такие скошенные углы [дубликат]

    На данный вопрос уже ответили: Кривая граница элемента 5 ответов Здравствуйте как создать такие скошенные углы при помощи svg ?


    Ответ

    Как заставить работать clip-path в Firefox - всё точно также, только координаты полигона другие. Начало - левый, верхний угол - 0,0 Далее правый верхний угол - 1,0 Верт. вниз --1,0.1 Скос до середины - 0.5, 0.2 Скос от середины - 0,0.1


    Android Studio. Application Installation failed

    При попытке установить приложение на AVD получил сообщение:
    Installation failed with message Failed to finalize session: INSTALL_FAILED_INVALID_APK: /data/app/vmdl886175740.tmp/5_slice__ signatures are inconsistent.
    It is possible that this issue is resolved by uninstalling an existing version of an apk if it is present, and than re-installing.
    StackTrace:
    04-28 15:31:08.031 1563-1601/system_process E/PackageInstaller: Commit of session 886175740 failed: /data/app/vmdl886175740.tmp/5_slice__ signatures are inconsistent 04-28 15:31:08.033 4026-4026/? E/Pm: Failure details: Bundle[{android.content.pm.extra.STATUS=4, android.content.pm.extra.SESSION_ID=886175740, android.content.pm.extra.LEGACY_STATUS=-2, android.content.pm.extra.STATUS_MESSAGE=INSTALL_FAILED_INVALID_APK: /data/app/vmdl886175740.tmp/5_slice__ signatures are inconsistent}]
    После выбора "Удалить существующее приложение" пишет:
    04-28 15:37:02.849 4314-4314/? E/Pm: Failure details: Bundle[{android.content.pm.extra.STATUS=1, android.content.pm.extra.PACKAGE_NAME=com.xpendence.development.currencyconvarter, android.content.pm.extra.LEGACY_STATUS=-1, android.content.pm.extra.STATUS_MESSAGE=DELETE_FAILED_INTERNAL_ERROR}]
    Ошибка стала появляться после сборки APK и загрузки значков приложения.


    Ответ

    В общем, как правильно подсказал Юра Иванов, отключайте Instant Run, иначе, намучаетесь с компиляцией.

    Списки без использования указателей

    Как можно реализовать связный список без использования указателей (создавать списки, добавлять в список, удалять из списка), если есть только статический массив?


    Ответ

    Запросто.
    Структура типа
    struct Data { int value; // Данные, словом int next, prev; // ИНДЕКСЫ следующего и предыдущего элементов списка, // скажем, -1 - в роли NULL };
    Все. Массив таких структур. Каждая структура связана с предыдущей и следующей, храня не указатели на них, а их индексы в этом массиве.
    Подробнее разжевывать не надо? :)
    Вот демонстрационная программка (с очень небольшой функциональностью):
    #include #include #include
    typedef struct Node_ { int value; int prev, next; int occupied; } Node;
    int getNode(Node*list, int size) // Возврат первого свободного { for(int i = 0; i < size; ++i) if (!list[i].occupied) { list[i].occupied = 1; return i; } return -1; }
    void freeNode(Node*list, int index) { list[index].occupied = 0; }
    // Добавление в список, возврат индекса int addToList(int*head, Node* list, int size, int value) { int idx = getNode(list,size); if (idx >= 0) { list[idx].value = value; list[idx].next = list[idx].prev = -1; if (*head < 0) // Пустой список { *head = idx; } else { // Ищем последний int curr = *head; while(list[curr].next >= 0) { curr = list[curr].next; } list[curr].next = idx; list[idx].prev = curr; } } return idx; }
    void showList(int head, Node* list) { // Идем по списку и выводим int curr = head; while(curr >= 0) { printf("%d ",list[curr].value); curr = list[curr].next; } puts(""); }
    int main(int argc, const char * argv[]) { Node list[100] = {{0,0,0,0}}; int head = -1; addToList(&head,list,100,1); addToList(&head,list,100,2); addToList(&head,list,100,3); showList(head,list);
    }
    Как видите, просто роль указателей выполняют индексы. Что такое указатель, в конце концов? Средство показать, где лежит интересующая информация. Он и показывает - в ячейке с таким-то номером.
    Вот, нашел статейку, можно было и не мучиться :) - см. тут: https://rsdn.org/article/alg/list.xml

    yum list installed: Out of memory allocating

    Имеется fedora 25 с 4ГБ ОЗУ. При выполнении команды #yum list installed или yum list installed > text получаю
    Out of memory allocating 4294967296 bytes!
    4294967296 bytes == 4Гб
    На момент выполнения команды в системе доступно более 3Гб свободной ОЗУ. Swap свободен 500Мб
    В системном журнале:
    [79678.056028] Out of memory: Kill process 16669 (dnf) score 548 or sacrifice child [79678.056032] Killed process 16669 (dnf) total-vm:6713724kB, anon-rss:3627656kB, file-rss:0kB, shmem-rss:0kB
    Куда копать? по какой причине 4Гб не хватает? как решить проблему?


    Ответ

    Количество байт выделяемой памяти является круглым числом, что наводит на мысль либо об ошибке в программе, либо о некачественной проверке входных данных. Входными данными являются также и временно сохранённые файлы -- кэш. На просторах интернета предлагают удалить данные (.solv файлы) из каталога /var/cache/. В некоторых случаях можно попробовать удалить весь кэш dnf, PackageKit, находящийся там (есть некий отчёт об ошибке про это).
    Ну и пища для размышлений: статья годичной давности про dnf

    Как узнать тип свойства класса, если оно обозначено модификатором доступа private

    Есть класс, в нём есть свойство и конструктор
    public class Pen { private int inkContainerValue = 1000;
    public Pen(int inkContainerValue) { this.inkContainerValue = inkContainerValue; }
    в стороннем классе я создаю объект этого класса и хочу узнать какого тип переменная inkContainerValue как это реализовать?


    Ответ

    Вы делаете почти правильно. Вот такой код получает нужный вам тип:
    var classType = typeof(Pen); var field = classType.GetField( "inkContainerValue", BindingFlags.Instance | BindingFlags.NonPublic); var fieldType = field.FieldType;
    Вам нужно было работать с GetField (т. к. inkContainerValue — это поле, а не свойство), и указать флаги, разрешающие рефлексию приватных полей.

    Тем не менее, присоединяюсь к комментарию @andreycha: скорее всего вам это не нужно.

    Статус “В наличии” на витрине товара Woocommerce?

    В "Товарах" можно изменить статус товара на "Нет в наличии". Данный статус появляется в карточке товара и исчезает кнопка "Добавить в корзину". Как отобразить этот статус в витрине товара (в подкатегории) под каждым товаром?


    Ответ

    Код такой в function.php
    function action_woocommerce_after_shop_loop_item() { global $product; if ($product->stock_status == 'instock') { echo '

    В наличии: ' . $product->stock . '
    '; } else { echo '
    ' . 'Нет в наличии' . '
    '; } }; add_action( 'woocommerce_after_shop_loop_item', 'action_woocommerce_after_shop_loop_item');

    Переключение адресов на яндекс карте

    Нашел такой пример кода из комментариев к вопросу - Плавное перемещение карты яндекс по клику
    Подставил свои значения в data-goto = "Киев" и все перестало работать.
    Вопрос как можно настроить переключение карты по клику на ссылку (адрес через data-goto) и как разместить кастомный маркер на карте с этим самым адресом?
    Подозреваю что вывод маркера можно сделать как-то так
    myPlacemark2 = new ymaps.Placemark(destinations['Киев'], { balloonContent: ...
    Но что-то с destinations[data-goto] что-то никак не свяжу.
    //Дождёмся загрузки API и готовности DOM. ymaps.ready(init); function init() { var result = document.getElementById('result'), // для отладки // в этой версии координаты просто элементы массива (и они поменяны местами) destinations = { 'Москва': [55.753559, 37.609218], 'Санкт-Петербург': [59.938531, 30.313497], 'Екатеринбург': [56.829748, 60.617435], 'Одесса': [46.466444, 30.7058] }, // Создание экземпляра карты и его привязка к контейнеру с // заданным id ("map"). myMap = new ymaps.Map('map', { // При инициализации карты обязательно нужно указать // её центр и коэффициент масштабирования. center: destinations['Москва'], // Москва zoom: 10 }); // все ок result.textContent = 'map init'; // куда скакать function clickGoto() { // город var pos = this.getAttribute('data-goto'); // или this.getAttribute('title') result.textContent = pos; // переходим по координатам myMap.panTo(destinations[pos], { flying: 1 }); return false; } // навешиваем обработчики var col = document.getElementsByClassName('goto'); for (var i = 0, n = col.length; i < n; ++i) { col[i].onclick = clickGoto; result.textContent = result.textContent + ' ' + i; } }

    Перейти
    Перейти
    Перейти
    Перейти

    Так вообще не работает не кастомный значок не клик:
    //Дождёмся загрузки API и готовности DOM. ymaps.ready(init); function init() { // в этой версии координаты просто элементы массива (и они поменяны местами) destinations = { 'Москва': [55.753559, 37.609218], 'Санкт-Петербург': [59.938531, 30.313497], 'Екатеринбург': [56.829748, 60.617435], 'Одесса': [46.466444, 30.7058] }, // Создание экземпляра карты и его привязка к контейнеру с // заданным id ("map"). myMap = new ymaps.Map('map', { center: destinations['Москва'], zoom: 10, controls: [] }); // куда скакать function clickGoto() { // город var pos = this.getAttribute('data-goto'); // или this.getAttribute('title') result.textContent = pos; // переходим по координатам myMap.panTo(destinations[pos], { flying: 1 }); return false; } // навешиваем обработчики var col = document.getElementsByClassName('goto'); for (var i = 0, n = col.length; i < n; ++i) { col[i].onclick = clickGoto; result.textContent = result.textContent + ' ' + i; } var myPlacemark = new ymaps.Placemark(destinations['Москва'], { }, { iconImageHref: 'map-icon.png', iconImageSize: [79, 96], iconImageOffset: [0, -50], }); /* Добавляем */ myMap.geoObjects .add(myPlacemark); }
    Перейти
    Перейти
    Перейти
    Перейти

    Помогите пожалуйста в решении проблемы!!!
    Заранее не известны все адреса, редактироваться будут только через data атрибут а не через скрипт, поэтому прописывать вручную все адреса в destinations нет смысла.
    Вообщем есть ссылки с адресами типа строки, карта. Как осуществить отображение нужного адреса на карте по клику на ссылку с этим самым адресом?


    Ответ

    Необходимо добавить Киев с массив destination, чтобы иметь возможность переходить на него В API 2.0 несколько другой способ добавления маркеров Привести в порядок атрибуты href для ссылок не помешает.
    Минимально модифицировав ваш код, получилось так:
    //Дождёмся загрузки API и готовности DOM. ymaps.ready(init); function init() { var result = document.getElementById('result'), myMap = new ymaps.Map('map', { center: [55.753559, 37.609218], // Москва zoom: 12 }); // все ок result.textContent = 'map init'; // куда скакать function clickGoto() { // город var city = this.getAttribute('data-goto'); // или this.getAttribute('title') result.textContent = city; // получение координат по адресу - асинхронная функция var myGeocoder = ymaps.geocode(city); myGeocoder.then( function(res) { coords = res.geoObjects.get(0).geometry.getCoordinates(); // переходим по координатам myMap.panTo(coords, { flying: 1 }); // добавляем маркер var placeMark = new ymaps.Placemark(coords, { balloonContent: city }); myMap.geoObjects.add(placeMark); }, function(err) { alert('Ошибка'); } ); return false; } // навешиваем обработчики var col = document.getElementsByClassName('goto'); for (var i = 0, n = col.length; i < n; ++i) { col[i].onclick = clickGoto; result.textContent = result.textContent + ' ' + i; } }

    Россия, Москва, Красная площадь, 1
    Украина, Киев, улица Крещатик, 1/2
    Россия, Свердловская область, Екатеринбург, проспект Ленина, 1
    Украина, Одесса, Приморский бульвар, 1

    В идеале - хранить инфо о том, какие маркеры уже созданы, чтобы не создавать их снова, но вроде бы yandex их не дублирует.

    запуск службы delphi

    Появилась необходимость в создании службы на delphi, почитав инфу в гугле начал писать код, получилось вот что :
    type TService4 = class(TService) procedure ServiceStart(Sender: TService; var Started: Boolean); procedure ServiceStop(Sender: TService; var Stopped: Boolean); procedure ServiceExecute(Sender: TService); public function GetServiceController: TServiceController; override; end;
    var Service4: TService4;
    implementation
    {$R *.DFM}
    procedure ServiceController(CtrlCode: DWord); stdcall; begin Service4.Controller(CtrlCode); end;
    function TService4.GetServiceController: TServiceController; begin Result := ServiceController; end;
    procedure TService4.ServiceStart(Sender: TService; var Started: Boolean); begin Started := True; end;
    procedure write(); var s:string; RC: Cardinal; f:textfile; begin assignfile(f,'D:\temp1.txt'); rewrite(f); writeln(f,'123'); closefile(f); end;
    procedure TService4.ServiceStop(Sender: TService; var Stopped: Boolean); begin Stopped := True; end;
    procedure TService4.ServiceExecute(Sender: TService); begin while not Terminated do begin ServiceThread.ProcessRequests(True); write(); end; end;
    Но после регистрирования службы и ее запуска на диске D так и не появился желанный файл temp1.txt. Подскажите, что я делаю не так?


    Ответ

    Работа вашего сервиса останавливается после достижения вот этой строки:
    ServiceThread.ProcessRequests(True);
    т.к. из этого метода, при вызове его с параметром True, управление вернётся только после получения команды Terminate
    Чтобы всё заработало, вам надо сделать следующее:
    в ServiceStart создать и запустить отдельный рабочий поток, который в своём методе Execute будет выполнять нужную вам работу (вызывать функцию write()) в ServiceExecute вызывать метод ServiceThread.ProcessRequests с параметром False в ServiceStop останавливать и уничтожать рабочий поток.

    Адаптированный пример, из книги Dniele Teti - Delphi CookBook
    ServiceU.pas:
    unit ServiceU;
    interface
    uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs, WorkerThreadU;
    type TSampleService = class(TService) procedure ServiceExecute(Sender: TService); procedure ServiceStart(Sender: TService; var Started: Boolean); procedure ServiceStop(Sender: TService; var Stopped: Boolean); procedure ServicePause(Sender: TService; var Paused: Boolean); procedure ServiceContinue(Sender: TService; var Continued: Boolean); private FWorkerThread: TWorkerThread; public function GetServiceController: TServiceController; override; end;
    {$R *.dfm}
    var SampleService: TSampleService;
    implementation
    procedure ServiceController(CtrlCode: DWord); stdcall; begin SampleService.Controller(CtrlCode); end;
    function TSampleService.GetServiceController: TServiceController; begin Result := ServiceController; end;
    procedure TSampleService.ServiceContinue(Sender: TService; var Continued: Boolean); begin FWorkerThread.Continue; Continued := True; end;
    procedure TSampleService.ServicePause(Sender: TService; var Paused: Boolean); begin FWorkerThread.Pause; Paused := True; end;
    procedure TSampleService.ServiceStart(Sender: TService; var Started: Boolean); begin FWorkerThread := TWorkerThread.Create(True); FWorkerThread.Start; Started := True; end;
    procedure TSampleService.ServiceStop(Sender: TService; var Stopped: Boolean); begin FWorkerThread.Terminate; FWorkerThread.WaitFor; FreeAndNil(FWorkerThread); Stopped := True; end;
    procedure TSampleService.ServiceExecute(Sender: TService); begin while not Terminated do begin ServiceThread.ProcessRequests(false); TThread.Sleep(1000); end; end;
    end.
    WorkerThreadU.pas:
    unit WorkerThreadU;
    interface
    uses System.Classes;
    type TWorkerThread = class(TThread) private FPaused: Boolean; protected procedure Execute; override; public procedure Pause; procedure Continue; end;
    implementation
    uses System.SysUtils, System.IOUtils;
    procedure TWorkerThread.Continue; begin FPaused := False; end;
    procedure TWorkerThread.Execute; var ExePath, LogFileName: string; Log: TStreamWriter; begin try FPaused := False; ExePath := TPath.GetDirectoryName(GetModuleName(HInstance)); LogFileName := TPath.Combine(ExePath, ClassName + '_' + IntToStr(CurrentThread.ThreadID) + '.txt'); Log := TStreamWriter.Create(TFileStream.Create(LogFileName, fmCreate or fmShareDenyWrite)); try while not Terminated do begin if not FPaused then begin Log.WriteLine('Message from thread: ' + TimeToStr(now)); end; TThread.Sleep(1000); end; finally Log.Free; end; except on E: Exception do begin TFile.WriteAllText(TPath.Combine(ExePath, 'CRASH_LOG.TXT'), E.ClassName + ' ' + E.Message); end end; end;
    procedure TWorkerThread.Pause; begin FPaused := True; end;
    end.

    Java пример livelock

    Как livelock выглядит в коде ? В интернете найдены лишь примеры с жизнью, где встречаются люди в коридоре.


    Ответ

    Примером может быть простой алгоритм консенсуса. Предположим, что есть некоторый алгоритм, который согласует текущее значение какого-то регистра. Если в момент выработки консенсуса приходит сообщение об обновлении данных, алгоритм сбрасывается и начинает сначала. Если такие сообщения приходят слишком часто, получается тот самый live lock - система постоянно работает, но никак не может согласовать значение. Упрощенным примером (это не алгоритм консенсуса) будет подсчет всех записей, которыми управляет приложение - если в момент подсчета прилетает сообщение о том, что была изменена или добавлена запись, алгоритм должен начаться сначала. Если сообщения добавляются слишком часто, система попадает в live lock.

    История цен. Как правильно? MySQL

    Как правильно спроектировать таблицы, чтобы учитывать изменение цен на услуги. Есть две таблицы:
    mysql> SHOW COLUMNS FROM services; +---------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+----------+------+-----+---------+----------------+ | service_id | int(11) | NO | PRI | NULL | auto_increment | | lesson_id | int(11) | NO | MUL | NULL | | | service_end | datetime | NO | | NULL | | | service_start | datetime | NO | | NULL | | +---------------+----------+------+-----+---------+----------------+ mysql> SHOW COLUMNS FROM lessons; +--------------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+---------------+------+-----+---------+----------------+ | lesson_id | int(11) | NO | PRI | NULL | auto_increment | | lesson_name | varchar(60) | NO | UNI | NULL | | | lesson_worth | decimal(20,4) | NO | | NULL | | +--------------+---------------+------+-----+---------+----------------+
    Необходимо, чтобы в таблице services хранились цены до их изменения, если таковые и будут, то есть изменения цен для lessons не задевали имеющиеся строки в services Нашел решение с таблицей хранящая историю изменения цен (если есть лучше, предложите), то какую цену хранить в services: из таблицы истории или из lessons?
    UPD
    Пришел к этой модели, исходя из ответа.
    mysql> SHOW COLUMNS FROM services; +---------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+----------+------+-----+---------+----------------+ | service_id | int(11) | NO | PRI | NULL | auto_increment | | lesson_id | int(11) | NO | MUL | NULL | | | service_end | datetime | NO | | NULL | | | service_start | datetime | NO | | NULL | | +---------------+----------+------+-----+---------+----------------+ mysql> SHOW COLUMNS FROM lessons; +-------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+-------------+------+-----+---------+----------------+ | lesson_id | int(11) | NO | PRI | NULL | auto_increment | | lesson_name | varchar(60) | NO | UNI | NULL | | +-------------+-------------+------+-----+---------+----------------+ mysql> SHOW COLUMNS FROM worths; +------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+---------+-------+ | worth_id | int(11) | NO | PRI | NULL | | | lesson_id | int(11) | NO | MUL | NULL | | | worth | decimal(20,4) | NO | | NULL | | | worth_date | datetime | NO | | NULL | | +------------+---------------+------+-----+---------+-------+


    Ответ

    Нашел решение с таблицей хранящая историю изменения цен (если есть лучше, предложите)
    По моей практике, таблица с историей изменения - это лучшее решение.
    какую цену хранить в services: из таблицы истории или из lessons?
    С точки зрения реляционной алгебры, если что-то можно получить из одних таблиц, то не стоит это добавлять в другие. Т.е. в идеале цена должна храниться только в таблице истории цен.
    С точки зрения производительности, имеет смысл ту цену, которая читается чаще других (например, актуальную на сегодня, или цену на дату открытия услуги) хранить в основной таблице. Но делать это имеет смысл только если вы уверены, что этот один join с таблицей истории серьезно сказывается на производительности.
    Поправка. Если для клиента может предоставляться индивидуальная скидка, то поле с ценой в services обязательно.

    Push-уведомления

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


    Ответ

    Можете по последнему коннекту отсылать пуши, а можете запускать локальные нотификации. Например если пользователь свернул приложение, запускаем нотификацию,
    func applicationDidEnterBackground(_ application: UIApplication) { let content = UNMutableNotificationContent() content.title = "Notification" content.body = "Sample" let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5.0, repeats: false) //покажет через 5 секунд let request = UNNotificationRequest(identifier:requestIdentifier, content: content, trigger: trigger) UNUserNotificationCenter.current().add(request){(error) in if (error != nil){ print(error?.localizedDescription ?? "") } } }
    если пользователь открыл приложение - убиваем ее.
    func applicationDidBecomeActive(_ application: UIApplication) { UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: [requestIdentifier]) }
    Если не запускал определенное время - показывается.
    Пример на GitHub

    Как вынести часть активити за пределы экрана и оперировать ей?

    Идея такая. Пользователь сдвигает активити пальцем вниз, после чего, становится виден скрытый за пределами экрана элемент и следует обработка события. Полагаю, будет правильным думать в сторону увеличения высоты активити больше 160dp и установки верхней точки отображения не с 0dp, а с той позиции, которая нам нужна.
    На рисунке ниже всё схематично нарисовано. Тёмно-серым обозначена видимая часть экрана, активити обозначена малиновым. Изначально мы видим только часть активити и можем её двигать пальцем.

    Как воплотить эту идею в жизнь?
    UPD. Решил попробовать решить задачу через ScrollView. Взял пример из интернета. В примере существуют 3 кнопки, нажимаешь последнюю — контент съезжает на 200 пикселей.
    import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ScrollView;
    /** * Created by promoscow on 12.05.17. */
    public class ScrollViewDemoActivity extends Activity { Button buttonScrollUp, buttonScrollDown, buttonScrollToTop; ScrollView myScroll;
    /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sc2);
    buttonScrollUp = (Button) findViewById(R.id.scrollup); buttonScrollDown = (Button) findViewById(R.id.scrolldown); buttonScrollToTop = (Button) findViewById(R.id.scrolltotop); myScroll = (ScrollView) findViewById(R.id.myview); myScroll.scrollTo(0, 200);
    buttonScrollUp.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub myScroll.scrollBy(0, 20); } });
    buttonScrollDown.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub myScroll.scrollBy(0, 20); } });
    buttonScrollToTop.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub myScroll.scrollTo(0, 200); } }); } }
    Строчка myScroll.scrollTo(0, 200); смещает контент вниз на 200. Я добавляю её сразу после инициализации:
    myScroll = (ScrollView) findViewById(R.id.myview); myScroll.scrollTo(0, 200);
    Не работает!
    UPD. Сработало с оборачиванием в Runnable:
    myScroll.post(new Runnable(){ public void run(){ myScroll.scrollBy(0, 200); } });


    Ответ

    Поместить весь контент в ScrollView, а затем при создании активити сдвинуть позицию скролла
    ScrollView sv = (ScrollView)findViewById(R.id.scroll); sv.scrollTo(..., ...);

    dd из /dev/ram0 не содержит внесённых изменений

    Создаю ramdisk:
    $ dd if=/dev/zero of=/dev/ram0 bs=1k count=5000
    Форматирую в ext2:
    $ mke2fs -m0 /dev/ram0 5000
    Монтирую в ~/ramdisk
    $ mount /dev/ram0 ~/ramdisk
    Создаю там некоторые файлы, изменяю и т.д.
    Создаю образ:
    $ dd if=/dev/ram0 of=~/initrd bs=1k count=5000
    Но в нем существуют только файлы, которые существовали до изменения. Подскажите, что я делаю не так.


    Ответ

    перед созданием образа надо либо вызвать программу sync для сброса буферов ввода/вывода на файловые системы, либо, лучше, вообще отмонтировать файловую систему:
    $ sudo umount /dev/ram0