Страницы

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

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

Получение данных из URL после знака # (hash) на сервере

Доброго времени суток Друзья! Продолжаю писать свою CMS систему, среди её "фишек" будет функция перехода в режим "быстрой навигации". Режим быстрой навигации, это по сути реализация системы клиент -><- сервер : Клиент заходит на сайт, обработчик на сервере принимает запрос вида "?m:s;p:h;i:1;", генерирует каркас(шаблон) и отдаёт. Клиент получив каркас, отправляет новый запрос(Ajax) на сервер и заполняет принятыми в ответ данными необходимые поля. Слишком растянул вступление для вопроса, но хотелось бы по лучше объяснить, что же я хочу узнать. При переходе по следующей ссылке : mysite.ru/?m=s&p=h&i=1 сервер получит эти данные через суперглобальный массив $_GET При переходе по следующей ссылке : mysite.ru/#m:s;p:h;i:1; серверу необходимо получить данные после знака решётки(#). Всё бы ничего, есть вариант использовать Javascript и с помощью браузера передать эти данные на сервер, но есть одно "но", а если эту ссылку открыл не браузер, а например поисковый робот? И тут собственно возникает вопрос : Как на сервере только средствами PHP получить данные из URL после знака решётки(#) ? Использовать функцию parse_url() можно, но она позволяет обработать строку запроса, а не получить её. В интернете по этому поводу мало информации, а где то ещё и видел, что средствами только PHP сделать этого нельзя. Есть сервис от Яндекс, Яндекс.Музыка, там реализовано аналогичное. Хочу дополнить свой вопрос : А можно ли с помощью Javascript превращать текущий URL в URL вида "?m:h;......." при этом не переходя на него, хотелось бы как то всётаки реализовать такую совместимость и для поисковика, и для пользователя, который захочет взять ссылку себе на заметку.


Ответ

Судя по всему такое всё-таки невозможно. Понимаю, меня тоже такой ответ не устраивает, но был опыт поиска решения. Сервер просто не получает хэш. Так что только яваскриптом его отдельно отправлять. Для поисковых роботов и прочих безяваскриптовых существ должны быть адреса вида mysite.ru/m:s;p:h;i:1;, по которым доступна та же самая информация без аякса.

Генератор чисел логнормального распределения

Здравствуйте!
Был у меня здесь недавно вопрос, пошел я по пути формирования нового значения, базирующемся на распределении вероятности. Спасибо большое @neofit !
Получилась интересная картина, очень напоминающая лонормальное распределение:
распределение http://upload.dexstudio.com.ua/botva2.jpg
Теперь, собственно, вопрос, как генерировать число из этого распределения? Есть готовые решения, например, для Java, которые способны принимать данное распределение и выдавать значение где-то среди этой красоты?


Ответ

Пример: Вам нужно чтобы событие 1 произошло с шансом 75%, событие 2 с шансом 10%, событие 3 с шансом 15%. Генерируете случайное число от 0 до 99. Если число в интервале 0-74, то событие 1, 75-84 событие 2, 85-99 событие 3. В Вашем вопросе все тоже самое. Сумма длин всех полосок- это число 99 в примере. Длина каждой полоски задает интервал попадания.

Вес переменой

Не подскажете функцию для подсчета веса переменой(массива)


Ответ

$before=0; $a='испытуемая переменная либо массив'; $before = memory_get_usage(); unset($a); echo 'размер переменной составил: ',$before-memory_get_usage(),' байт'; upd @Sh4dow на самом деле, 208 байт на $before, а echo бесплатно(я так понимаю из за того что строка не подгружается в память, а сразу выводится) да и есть еще несколько ньюансов, из критических то что php автоматически оптимизирует расход памяти и если переменные имеют одинаковое значение, то под последню выделяется память только для создания ссылки (208 байт) поэтому конструкция типа: $a='испытуемая переменная либо массив'; $a=$b; $before = memory_get_usage(); unset($a); echo 'размер переменной составил: ',$before-memory_get_usage(),' байт'; вернет 208 байт для числа, 128 для строки либо массива. p.s. а вот почему для числа выделяется столько памяти, для меня загадка.

UML редактор для C#?

В VisualStudio есть вполне рабочий редактор UML. В экспресс выпуске он исключен, но мне он больше подходит по некоторым причинам. Также хочется разрабатывать проект вне дома (на работе), где студия не доступна, а также не доступен флеш и интернет. Какой редактор (Portable) можете посоветовать скачать и почему?


Ответ

Мне нравится Software Ideas Modeler А отсюда вы сможете подобрать редактор, наиболее подходящий под ваши нужды/вкусы.

Почему в одном случае привязка работает, а во втором нет?


- using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes;
namespace WpfApplication1 { /// /// Логика взаимодействия для MainWindow.xaml /// public partial class MainWindow : Window { public string MyText { get; set; }
public MainWindow() { InitializeComponent(); }
private void MenuItem_Click(object sender, RoutedEventArgs e) { MessageBox.Show(MyText); } } }


Ответ

Замечательный вопрос! Дело в том, что при создании интерфейса когда мы используем Menu, то само меню не перехватывает фокус текущего элемента при нажатии на дочерний MenuItem. Так как в режиме привязки к TextBox по умолчанию стоит режим обновления свойства LostFocus, то соответственно обновиться свойство не может, так как фокус остается на TextBoxe. Это сделано для того, чтобы валидация проходила только после потери фокуса, а не после каждого изменения значения TextBox при наборе. В первом примере нет меню как такового, а MenuItem считается простым контролом. Поэтому при нажатии на него TextBox теряет фокус и свойство обновляется. Проблемы или ошибки здесь нет. Для решения данной задачи нужно просто выбрать другой режим обновления для TextBoxа.

Сохранение данных формы при уходе с сайта

Итак имеется форма заказа на сайте с большим количеством полей (уже оптимизированных и все равно количество достаточно большое). Задача: Когда пользователю наскучило заполнять данные, он нажимает на вкладке крестик или закрывает браузер - сохранить все его введенные данные формы куда либо (в сессию по средствам PHP, и похоже что это единственный доступный вариант). Цель: После прошествия некоторого времени пользователь возвращается на сайт, открывает форму, а у него уже форма почти заполнена теми данными которые он в прошлый раз не дозаполнил, тем самым ускоряя весь процесс заказа продукции. Особенности: Форма работает по средствам JQuery и отправляется на сервер AJAX запросом, ну и соответственно заказ тем самым совершается. Браузер не кэширует такие формы, и после перезагрузки страницы снова приходится заполнять.


Ответ

Не все браузеры поддерживают, или корректно работают с событием закрытия страницы. Но даже если вам пойдет реализовать данную "фичу" для некоторых браузеров, то на мой взгляд сделать это можно так: - сериализация формы в строку - записать массив в cookie на большой срок Тем самым когда пользователь вернутся на страницу можно восстановить данные из cookie. При использовании jquery используйте serialize(); Реализация представленная пользователем @knes, поможет обойтись Вам без события закрытия страницы.

Синхронная обработка асинхронно накопленных данных. Теория.

Всем привет! Подскажите, пожалуйста, общий метод работы в следующем случае (и из той же категории): Предположим, есть набор id объектов, хранящихся в локальной БД мобильного приложения. var ids = [1, 3, 5]. Получать объект по его id я могу простым запросом к БД из транзакции: for (var i in ids) transaction.executeSql( 'SELECT * FROM table WHERE id = '+i, [], self.querySuccess, self.errorCB ); И вот мне в коллбэк приходят вытащенные объекты, мне надо их все сохранить в какой-нибудь массив, и когда я получу все желаемые объекты, что-то с этим массивом сделать. Например, на сервер пульнуть. Как я делаю: перед началом цикла запоминаю сколько объектов я должен получить из БД, в коллбэке веду счетчик пришедших объектов, и таким образом узнаю, когда я получил все объекты. Вопрос: нормально ли это, или велосипед? Может есть другие методы для решения подобных задач?


Ответ

Посмотрите в сторону библиотеки Async.js, в ней есть множество методом, с помощью которых можно решить вашу проблему, например async.map async.map( ids, function(item, callback){ transaction.executeSql( 'SELECT * FROM table WHERE id = '+item, [], function(result){ // здесь наверно получаете результат выполнения запроса, его надо передать вторым параметром в callback callback(null/*error*/, result); }); }, function(err, resгlt){ // в result будет окончательный результат } );