Страницы

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

суббота, 13 июля 2019 г.

VK api - Как скрыть статус “online” авторизированного пользователя?

Есть приложение под Android для работы с `VKontakte. В нем происходит авторизация по средствам VK SDK. При этом статус авторизированного пользователя - "online". Каким образом можно реализовать так называемую "невидимку" (статус пользователя "offline" когда пользователь авторизирован и находиться в приложении)? Единственное, что приходит в голову - написать свои хранимые процедуры, в которых будут обрабатываться запросы к VKontakte API и работать уже с ними. Правильное ли это решение или есть другие способы?


Ответ

https://vk.com/dev/account.setOffline
Помечает текущего пользователя как offline (только в текущем приложении).

Проход текста через условие в цикле программы. С++ Winapi

Написал программку небольшую. Которая сохраняет из EditControl текст в файл. Все просто в целом. Но мне надо подставлять определенные значения в текст, которые заданны в массиве самой программы. В консольном варианте все просто для меня было а тут я потерялся немного. Есть такое условие, что бы вместо набранных в EditControl цифр подставлялись буквенные значения. Вместо 1 - X, 2 - Y, 3 - A, 4 - B. К примеру набрав строку в Control Edit B+3,2,1,DB2. В файл уже был записан вот такой результат B+A,Y,X,DBY. В чем собственно я потерялся? Так в том, что я не могу понять куда подставить этот цикл по замене элементов в массиве. Помогите кто сможет. Я уже неделю с этим мучаюсь.
#include #include #include "resource.h"
using namespace std;
#define ESC_OF "Отказ от выбора или ошибка выполнения функции "
HWND hEdit1; HWND hEdit2;
CHAR text_1[] = { 0 }; CHAR text_2[] = { 0 };
BOOL CALLBACK DlgProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow ) { DialogBoxParam( hInstance, MAKEINTRESOURCE( IDD_DIALOG1 ), 0, ( DlgProc ), 0 ); return 0; }
BOOL CALLBACK DlgProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { BOOL success; static OPENFILENAME ofn; static char szFile[MAX_PATH];
switch( uMsg ) { case WM_INITDIALOG: { // Добавление компонентов на форму // Инициализация структуры ofn ofn.lStructSize = sizeof( OPENFILENAME ); ofn.hwndOwner = hwnd; ofn.lpstrFile = szFile; ofn.nMaxFile = sizeof( szFile ); ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0"; ofn.lpstrDefExt = "txt"; //Иконка HICON hIcon1 = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( IDI_ICON1 ) ); SendMessage( hwnd, WM_SETICON, 1, ( LPARAM )hIcon1 ); //Текстовые поля hEdit1 = GetDlgItem( hwnd, IDC_EDIT1 ); hEdit2 = GetDlgItem( hwnd, IDC_EDIT2 ); SetWindowText( hEdit1, text_1 ); SetFocus( hEdit1 ); break; return TRUE; }
case WM_COMMAND: // Обработка кнопок и нажатий switch( LOWORD( wParam ) ) { case IDC_BUTTON1: strcpy_s( szFile, "" ); success = GetSaveFileName( &ofn );
if( success ) { MessageBox( hwnd, ofn.lpstrFile, "Файл сохранен под именем:", MB_OK ); HANDLE hFile = CreateFile( ofn.lpstrFile, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); const int size = 2048; TCHAR buff[size] = { 0 }; hEdit2 = GetDlgItem( hwnd, IDC_EDIT2 ); DWORD off = 0;
do { GetWindowText( hEdit2, buff, size ); WriteFile( hFile, buff, size, &off, NULL ); } while( off < 0 );
CloseHandle( hFile ); } else { MessageBox( hwnd, ESC_OF"GetSaveFileName", "Отказ от выбора или ошибка", MB_ICONWARNING ); }
break;
case IDOK: MessageBox( hwnd, "Была нажата кнопка ОК", "Info", MB_OK | MB_ICONINFORMATION ); break;
case IDCANCEL: EndDialog( hwnd, 0 ); return FALSE; }
break;
case WM_CLOSE: EndDialog( hwnd, 0 ); return FALSE; }
return FALSE; }


Ответ

В обработчике нажатия кнопки case IDC_BUTTON1: есть цикл:
do { GetWindowText( hEdit2, buff, size ); WriteFile( hFile, buff, size, &off, NULL ); } while( off < 0 );
GetWindowText() - берет текст из контрола и складывает его в массив buff. WriteFile() - записывает этот массив buff в файл.
Соответственно, нужно между этими двумя вызовами функций подправить содержимое buff как Вам надо (т.е. вставить цикл по замене символов).

Загрузка изображений JS

Ситуация такая: Есть скрипт который загружает файл на сервер, возможно ли сделать так чтобы при выборе файла не надо было нажимать кнопку загрузить, он автоматом чтобы грузился.
JS:
function hideBtn(){ $('#upload').hide(); $('#res').html("Идет загрузка файла"); }
function handleResponse(mes) { $('#upload').show(); if (mes.errors != null) { $('#res').html("Возникли ошибки во время загрузки файла: " + mes.errors); } else { $('#res').html("Файл " + mes.name + " загружен"); } }
HTML:



Ответ

Проще простого. Кнопка Загрузить в форме нам больше не нужна.


// как только загрузится страница $(document).ready(function() { // повесить следующий обработчик на input c id userfile $("#userfile").on('change', function(e) { //выпольнить запрос $("#imgForm").submit(); });
});

Соединение с mysql по ssh туннелю в Windows

Есть сервер с MySQL, и к нему надо конектиться на клиенте созданном на php devel studio. Хочу сделать коннект через ssh туннель, на юниксе это можно сделать так:
shell_exec("ssh -f -L 127.0.0.1:3307:127.0.0.1:3306 user@remote.rjmetrics.com sleep 60 >> logfile"); $db = mysqli_connect("127.0.0.1", "sqluser", "sqlpassword", "rjmadmin", 3307);
Но клиент будет работать на Windows, как можно сделать тоже самое без использования дополнительных прог? Либо возможно есть какой то компонент в devel studio для этой цели?


Ответ

putty можно использовать из командной строки windows, что-то в таком духе:
shell_exec("putty.exe -ssh user@remote.rjmetrics.com -L 127.0.0.1:3307:127.0.0.1:3306");

C#. Windows Service. Подтекает память

Подскажите, пожалуйста, в каком месте я допустил ошибку, что служба постепенно поджирает память
Задача службы при старте загружать построчно адреса из файла Services.txt в List и через определенный интервал делать GET-запрос по каждому URL из файла
Program.cs
static class Program { static void Main() { ServiceBase[] ServicesToRun = { new ServicePusher() };
ServiceBase.Run(ServicesToRun); } }
ServicePusher.cs
public partial class ServicePusher : ServiceBase { private static readonly Logger Log = LogManager.GetCurrentClassLogger(); private Timer ServiceTimer; private readonly List ServiceUrl = new List();
public ServicePusher() { InitializeComponent(); }
protected override void OnStart(string[] args) { if (!File.Exists(AppDomain.CurrentDomain.BaseDirectory + "/Services.txt")) { Log.Error("Не найден Services.txt"); throw new FileNotFoundException("Не найден Services.txt"); }
using (StreamReader sr = new StreamReader(AppDomain.CurrentDomain.BaseDirectory + "/Services.txt")) { string line;
while ((line = sr.ReadLine()) != null) { Uri serviceUri = null;
try { serviceUri = new Uri(line); } catch (Exception ex) { Log.Error($"Ошибка при получении адреса сервиса ({line}): {ex}"); }
if (serviceUri != null) { ServiceUrl.Add(serviceUri); } else { Log.Error($"Некорректный адрес сервиса ({line}) в файле Services.txt"); } } }
ServiceTimer = new Timer { Interval = Config.Interval };
ServiceTimer.Elapsed += Tick; ServiceTimer.AutoReset = true; ServiceTimer.Start();
Log.Info("Сервис успешно запущен"); Log.Info($"Загружено сервисов: {ServiceUrl.Count}"); }
protected override void OnStop() { ServiceTimer.Stop(); ServiceTimer.Dispose(); ServiceTimer = null;
Log.Info("Сервис остановлен"); }
private void Tick(object sender, ElapsedEventArgs e) { try { foreach (Uri url in ServiceUrl) { ServicePointManager.ServerCertificateValidationCallback = (o, a, b, c) => true;
WebRequest request = WebRequest.Create(url); request.Proxy = null; request.Method = "GET"; request.Timeout = 360000; request.ContentType = "application/x-www-form-urlencoded";
try { using (WebResponse response = request.GetResponse()) { using (Stream requestStream = response.GetResponseStream()) { if (requestStream == null) { Log.Error($"Нет ответа от {url}"); } } } } catch (Exception ex) { Log.Error($"Ошибка ({ex.Message}) при запросе к сервису {url}"); } } } catch (Exception ex) { Log.Error(ex.Message); } } }
UPD: отжирает примерно по 2 мб в час
UPD 2: обновил код в вопросе, за 15 минут стабильно жрет ~350 кб...
Может дело в Program.cs?


Ответ

В общем мои опасения оказались напрасны, оставил службу работать всю ночь, сейчас работает и использует всего 5 мб памяти
Но остается непонятным почему при запуске службы первое время она потребляет около 11 мб

Json array + object mapper

Имеем json
{ "cities": [ { "name": "Pyongyang", "id": "1871859", "country": "North Korea", "countryId": "1873107" }, { "name": "Pune", "id": "1259229", "country": "India", "countryId": "1269750" }, { "name": "Paris", "id": "2988507", "country": "France", "countryId": "3017382" } ] }
С помощью retrofit
private RetrofitClient() { retrofit = new Retrofit.Builder() .baseUrl(Configuration.SERVER_API_URL) .client(getOkHttpClient()) .addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io())) .addConverterFactory(JacksonConverterFactory.create(getObjectMapper())) .build(); }
private ObjectMapper getObjectMapper() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true); objectMapper.setVisibilityChecker(objectMapper .getSerializationConfig() .getDefaultVisibilityChecker() .withFieldVisibility(JsonAutoDetect.Visibility.ANY) .withGetterVisibility(JsonAutoDetect.Visibility.NONE) .withSetterVisibility(JsonAutoDetect.Visibility.DEFAULT) .withIsGetterVisibility(JsonAutoDetect.Visibility.NONE) .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); return objectMapper; }
Сам класс City
@JsonRootName(value = "cities") @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder({ "name", "id", "country", "countryId" }) public class City implements Parcelable{
@JsonProperty("name") private String name; @JsonProperty("id") private String id; @JsonProperty("country") private String country; @JsonProperty("countryId") private String countryId; @JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnore private Map additionalProperties = new HashMap(); public City() { }
@JsonProperty("name") public String getName() { return name; }
@JsonProperty("name") public void setName(String name) { this.name = name; }
@JsonProperty("id") public String getId() { return id; }
@JsonProperty("id") public void setId(String id) { this.id = id; }
@JsonProperty("country") public String getCountry() { return country; }
@JsonProperty("country") public void setCountry(String country) { this.country = country; }
@JsonProperty("countryId") public String getCountryId() { return countryId; }
@JsonProperty("countryId") public void setCountryId(String countryId) { this.countryId = countryId; }
@JsonAnyGetter public Map getAdditionalProperties() { return this.additionalProperties; }
@JsonAnySetter public void setAdditionalProperty(String name, Object value) { this.additionalProperties.put(name, value); }
Как мне с помощью object mapper правильно парсить json, так как он выводит все значения в "не понимаемые"? ////////////////////////////////////////////////////////////////////////////
Скажите, а с таким json можете подсказать, почему не работает?
{"path":"http://*.com/uploads/world/europe/france/cities/paris/inst/","logo":"logo_sm.png","list":[{"id":"757","name":"AAA","slug":"apprendre-approfondir-accomplir"},{"id":"1474","name":"ACCORD","slug":"accord-french-language-school"},{"id":"749","name":"Alliance Fran\u00e7aise","slug":"alliance-francaise"},{"id":"1672","name":"CCFS","slug":"ccfs-cours-de-civilisation-francaise-de-la-sorbonne-fle-"},{"id":"1472","name":"Ecole Suisse Internationale","slug":"ecole-suisse-internationale"},{"id":"1538","name":"EF","slug":"ef-international-language-school"},{"id":"1674","name":"EFI","slug":"ecole-privee-de-francais-pour-linternational"},{"id":"1546","name":"ELFE","slug":"elfe-ecole-de-langue-francaise-pour-etrangers-"},{"id":"1566","name":"Eurocentres language school","slug":"eurocentres-language-school"},{"id":"1653","name":"France Langue Paris Notre-Dame","slug":"france-langue-paris-notre-dame"},{"id":"981","name":"France Langue Paris Op\u00e9ra","slug":"france-langue-paris-opera"},{"id":"1654","name":"France Langue Paris Victor Hugo","slug":"france-langue-paris-victor-hugo"},{"id":"1537","name":"L'Etoile","slug":"letoile"},{"id":"1514","name":"LSI","slug":"lsi-6"},{"id":"752","name":"Lutece Langue","slug":"lutece-langue"},{"id":"1466","name":"L\u2019Atelier 9","slug":"latelier-9"},{"id":"1561","name":"OISE","slug":"oise"},{"id":"1671","name":"Paris Langues (Member CEI)","slug":"paris-langues-member-cei-"},{"id":"121","name":"Sprachcaffe Paris","slug":"sprachcaffe-languages-plus-paris"},{"id":"755","name":"Verlaine Langue","slug":"verlaine-langue"},{"id":"756","name":"Vis-\u0430-Vis","slug":"vis_a_vis"}],"empty":"I'm just a tourist"}
retrofit для всех одинаковый
Вот 2 класса (по Вашей подсказке, сделал аналогично и тут)
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder({ "path", "logo", "list", "empty" }) public class School {
@JsonProperty("path") private String path; @JsonProperty("logo") private String logo; @JsonProperty("list") private List list = new ArrayList<>(); @JsonProperty("empty") private String empty; @JsonIgnore private Map additionalProperties = new HashMap();
/** * No args constructor for use in serialization * */ public School() { }
/** * * @param logo * @param empty * @param path * @param list */ public School(String path, String logo, List list, String empty) { this.path = path; this.logo = logo; this.list = list; this.empty = empty; }
/** * * @return * The path */ @JsonProperty("path") public String getPath() { return path; }
/** * * @param path * The path */ @JsonProperty("path") public void setPath(String path) { this.path = path; }
/** * * @return * The logo */ @JsonProperty("logo") public String getLogo() { return logo; }
/** * * @param logo * The logo */ @JsonProperty("logo") public void setLogo(String logo) { this.logo = logo; }
/** * * @return * The list */ @JsonProperty("list") public List getList() { return list; }
/** * * @param list * The list */ @JsonProperty("list") public void setList(List list) { this.list = list; }
/** * * @return * The empty */ @JsonProperty("empty") public String getEmpty() { return empty; }
/** * * @param empty * The empty */ @JsonProperty("empty") public void setEmpty(String empty) { this.empty = empty; }
@JsonAnyGetter public Map getAdditionalProperties() { return this.additionalProperties; }
@JsonAnySetter public void setAdditionalProperty(String name, Object value) { this.additionalProperties.put(name, value); }
}


@JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder({ "id", "name", "slug" }) public class Schools {
@JsonProperty("id") private String id; @JsonProperty("name") private String name; @JsonProperty("slug") private String slug; @JsonIgnore private Map additionalProperties = new HashMap();
/** * No args constructor for use in serialization * */ public Schools() { }
/** * * @param id * @param name * @param slug */ public Schools(String id, String name, String slug) { this.id = id; this.name = name; this.slug = slug; }
/** * * @return * The id */ @JsonProperty("id") public String getId() { return id; }
/** * * @param id * The id */ @JsonProperty("id") public void setId(String id) { this.id = id; }
/** * * @return * The name */ @JsonProperty("name") public String getName() { return name; }
/** * * @param name * The name */ @JsonProperty("name") public void setName(String name) { this.name = name; }
/** * * @return * The slug */ @JsonProperty("slug") public String getSlug() { return slug; }
/** * * @param slug * The slug */ @JsonProperty("slug") public void setSlug(String slug) { this.slug = slug; }
@JsonAnyGetter public Map getAdditionalProperties() { return this.additionalProperties; }
@JsonAnySetter public void setAdditionalProperty(String name, Object value) { this.additionalProperties.put(name, value); }
//region ==================== toString() ====================
@Override public String toString() { return name; }
//endregion
}
Запрос выглядит так
@GET("/schools/city/{id}") Observable getSchoolList(@Path("id") String id);


Ответ

Если ретрофиту отдать этот класс будет парсить.
public class Cities {
@JsonProperty("cities") private ArrayList cities;
public ArrayList getCities() { return cities; }
public void setCities(ArrayList cities) { this.cities = cities; } }

Обработка русских символов с клавиатуры wpf

Написал код, при котором обрабатываются нажатия кнопок на клавиатуре, но если переключить раскладку на русскую, символы все равно записываются латинскими буквами, как сделать чтобы русские символы так же считывало при переключении раскладки
DataTable dt = new DataTable();
public MainWindow() { InitializeComponent(); dt.Columns.Add("Key_Code", typeof(string)); dt.Columns.Add("Key_Value", typeof(string)); dt.Columns.Add("Key_State", typeof(string)); dt.Columns.Add("Key_Char", typeof(string)); dt.Columns.Add("System_Key", typeof(string)); dt.Columns.Add("Key_Down", typeof(string)); dt.Columns.Add("Key_Up", typeof(string)); }
private void KeyEvents(object sender, KeyEventArgs e) {
if (e.IsRepeat) return; string s = "" + e.Key; // key code string x = "" + e.SystemKey; // system key string z = "" + e.KeyStates; // key state string q = "" + e.IsUp; // key up string d = "" + e.IsDown; // key down string val = "" + (int)e.Key; // key value string ch = "" + (char)e.Key;// key char
dt.Rows.Add(new string[] { s, val, z, ch, x, d, q });
dg1.ItemsSource = dt.DefaultView; }


Ответ

Если брать другое событие например TextInput, то можно перехватить русский символ, но у этого события нет свойств таких, какие есть у keydown и keyup

Как сделать чтобы загрузка файлов не отправлялась сразу на сервер?

После добавления файлов, они сразу грузятся на сервер. Как исправить
document.querySelector('input[name="file"]').addEventListener('change', function(e) { var file = this.files[0]; var filename = file.name; var file_id = Math.random().toString().substr(2,6); var file_ext = file.name.split('.')[file.name.split('.').length-1]; var fd = new FormData(); fd.append("file", file); var xhr = new XMLHttpRequest(); xhr.open('POST', '#', true); var li = '

  • .'+file_ext+'
    '+filename+'
  • '; $('.form-upload-list').append(li); xhr.upload.onprogress = function(e) { if (e.lengthComputable) { var percentComplete = (e.loaded / e.total) * 100; $('#file-'+file_id+' ul.progress > li:first-child > div > div').css('width',percentComplete+'%'); if (percentComplete==100) $('#file-'+file_id+' .btns').html(''); } } xhr.upload.onerror = function() { $('#file-'+file_id).addClass('error'); $('#file-'+file_id).find('.btns').remove(); $('#file-'+file_id).find('.file-icon').html(''); } xhr.send(fd); }, false); function remove_file(id){ $('#file-'+id).remove(); }


    Ответ

    На сколько я понял вам необходим предпросмотр фотографий перед их загрузкой.
    "use strict"; var buttonSubmit = document.querySelector(".buttonSubmit"); buttonSubmit.addEventListener("click", loadOnServer, false); var arrFiles = []; // массив файлов var photoArea = document.querySelector(".photoArea"); var inputFile = document.querySelector(".inputFile"); inputFile.addEventListener("change", setNewImage, false); /** * обрабатываем изменения в input * @param e */ function setNewImage(e) { var file = e.target.files[0]; arrFiles.push(file); // добавляем в массив файлов var reader = new FileReader(); reader.onload = function (e) { var image = new Image(); image.src = e.target.result; return image.onload = function () { var img = document.createElement("img"); img.src = this.src; // добавляем превью в div photoArea.appendChild(img); // вешаем функцию удаления при клике на картинку img.addEventListener("click", delImage.bind(img, file), false); return true; }; }; return reader.readAsDataURL(file); } /** * Делаем запрос с данными на сервер * @returns {boolean} */ function loadOnServer() { if (arrFiles.length > 0) { var formData = new FormData(); for (var i = 0; i < arrFiles.length; i += 1) { formData.append("file[]", arrFiles[i]); } var xhr = new XMLHttpRequest(); xhr.open('POST', '#', true); // Ваши функции обработки запроса xhr.upload.onprogress = function (e) {}; xhr.upload.onerror = function () {}; xhr.send(formData); } return false; } /** * Удаляем картинку */ function delImage(file) { this.parentNode.removeChild(this); this.removeEventListener("click", delImage.bind(this), false); for (var i = 0; i < arrFiles.length; i += 1) { if (file === arrFiles[i]) { delete arrFiles[i]; break; } } } .photoArea { margin-top: 20px; } .photoArea img { max-width: 250px; }


    Как наложить цвет на png картинку не используя прозрачную область?

    Здравствуйте. Собственно интересует, как наложить цвет на картинку не затрагивая при этом прозрачную область. Сразу скажу, что требуется наложить градиент с жестким переходом. На одном из сайтов увидел, что там добавляются div поверх картинки с цветом фона, но как это работает - я не понял.
    В общем должно выглядеть как-то так:
    Начальная картинка:
    Как должно быть:
    Должна быть возможность двигать:
    Заранее спасибо за ответы! :)


    Ответ




    .base { width: 300px; height: 650px; overflow: hidden; position: relative; }
    .test { width: 300px; height: 200px; background-image: url(http://des1re.tk/img/Katarina_noBG_darkblue.png); background-size: 100%; position: absolute; }
    .t1 { top: 0px; background-position: 0px 0px; filter: sepia(100%) saturate(200) hue-rotate(40deg); } .t2 { top: 200px; background-position: 0px -200px; filter: sepia(100%) saturate(200) hue-rotate(130deg); } .t3 { top: 400px; background-position: 0px -400px; filter: sepia(100%) saturate(200) hue-rotate(220deg); } .t4 { top: 600px; background-position: 0px -600px; filter: sepia(100%) saturate(200) hue-rotate(310deg); }
    https://jsfiddle.net/z0erLxh2/

    Как при загрузке linux выполнить произвольную команду?

    Вопрос по факту о подобии автозагрузки в linux.
    Работает на сервере php-скрипт в фоновом режиме. В ДЦ отключали сервер ночью. Как сделать так что бы после включения и загрузки ОС она опять сама запустила бы этот скрипт? Вероятно нужна команда на bash, её надо сохранить в файл, а файл либо положить в какую-то папку либо запускать при старте. Система Debian 8


    Ответ

    Создай файл /etc/systemd/system/php-script-4-autostart.service с таким содержимым:
    [Unit] # Чисто камент для человека. Description=Autostart my php script # Запускать скрипт после того как поднимется сеть After=network.target
    [Service] # Хз что это, но оно пашет Type=oneshot # Не помню, но нужно для предыдущей строки. RemainAfterExit=yes
    # Собсно путь до скрипта. ExecStart=/path/to/php-script.php # Под каким пользователем и группой он будет выполняться. Секурность, вся фигня. User=www-data Group=www-data
    [Install] # Аналог Runlevel WantedBy=multi-user.target
    А потом разреши запускаться при старте системы:
    systemctl enable php-script-4-autostart.service

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

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


    Ответ

    Существует несколько основных типов нейронный сетей которые используются для решения некоторых типов задач. Очень и очень кратко
    FFNN Сеть прямого распространения - самая простая и в основном используется для анализа данных в которых можно выявить повторяющийся паттерн.
    RNN Рекурентная нейронная сеть - сеть которая делает вывод основываясь не только на настоящих данных но и на прошедших. Используется там где важно учитивать влияние нескольких факторов.
    LSTM Сеть с длинной и короткой памятью - подвид рекурентных сетей, но в отличии от обычной рекурентной сети может запоминать данные на долгий период иными словами понимать контекст.
    CNN Сверточная нейронная сеть - НС которая обрабатывает данные с помощью фильтров и сети прямого распространения.
    Отвечая на Ваш вопрос:
    1 и 2 - LSTM. Все что связанно с обработкой речи и анализом текста нуждается в контексте, также по умолчанию предложение это последовательная расстановка слов которые связанны друг с другом по смыслу.
    3 - FFNN. Не совсем понял суть но если логика заключается в том чтобы в заисимости от набора факторов выставлять температуру то сеть прямого распространения подойдет лучше всего.
    4 - Либо FFNN либо RNN в зависимости от сложности и "предсказуемости" графика.
    5 - CNN. Все что связанно с распознавание обьектов и анализом фото или видео, всегда используется сверточная нейронная сеть.

    Использование не PoD типов данных в shared memory c++

    Как изменять не PoD поля в случае использования shared memory? Я так понимаю, что для PoD типов подобный подход "в лоб" работает и на выделенной в mmap памяти поле класса изменяется. Однако поле типа string в данном случае останется неизменным. Каким образом его можно изменить? P.s. Вопрос чисто учебный, так что если вы подведете под ответ некоторую теоретическую базу - будет здорово.
    UPD: не PoD поле остается неизменным в parent-процессе. В child-процессе оно-таки меняется, но это порождает еще больше вопросов :)
    #include #include #include #include #include #include #include #include
    using namespace std;
    class human { public: string name; int age; human() { name = '\0'; age = 0; } ~human() {} void set() { cout << "Enter name" << endl; cin >> name; cout << "Enter age" << endl; cin >> age; } void print() { cout << name << " " << age << endl; } };
    main(int argc, char * argv[]) { pid_t cpid; char buf; human* shared; human non; shared = (human*)mmap(NULL, sizeof(*shared), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); *shared = non; cpid = fork(); // duplicate the current process if (cpid == 0) // if I am the child then { shared->set(); exit(EXIT_SUCCESS); } else // if I am the parent then { wait(NULL); // wait for the child process to exit before I do the same cout << "Human:" << endl; shared->print(); exit(EXIT_SUCCESS); } return 0; }


    Ответ

    Нельзя так делать. Сериализуйте данные в разделяемую память, а потом десериализуйте на выходе.
    std::string может содержать указатель на внешнюю память, поэтому то, что Вы выделили память под сам объект строки в общей памяти ничего не значит — данные лежат совсем в другом месте.
    Конечно, может так совпасть, что оставив код неизменным и изменив строку в одном процессе, это изменение будет видно и в другом, но это частный случай. Вызван он тем, что почти(?) все популярные реализации std::string используют т.н. SSO(small string optimization), при которой вся строка хранится в самом объекте, при её малом размере. Но если записать в строку больше, чем внутренний буфер позволяет, вся строка обязательно будет перемещена в кучу процесса.
    После этого, достучаться до этой строки уже не получится так просто. И, попытавшись прочитать или записать что-либо в строку во втором процессе, Вы получите UB, т.к. адрес строки, содержащийся в std::string указывает на область памяти выделенной в первом процессе. В общем случае, во втором процессе этот адрес никем не будет занят, либо будет занят, но совсем другим объектом — в любой из этих ситуаций, обращение к этому адресу как к std::string будет UB(если не совпадёт, конечно, что там окажется другая строка, по точно такому же адресу и такого же размера, но подобные «чудеса» я в рассмотрение не беру.

    Если же абстрагироваться от примера, то есть простое правило: если хочешь обменяться данными с любой внешней сущностью(будь то процесс или ещё что-то), сначала сохрани это в каком-то общем для обеих сущностей формате, чтобы принимающая сторона могла безошибочно определить, что ей пришло. Использовать простые объекты C++ языка в такой взаимодействии нельзя, т.к. слишком много мест, где можно «поскользнуться».

    VkApiLink приходит к своим и другим статьям

    здраствуйте! VkApiLink приходит к своим и другим статьям.. Кароче когда она отображается в какой либо статье, то она потом на другие начинает напрыгивать, через 1-5 статей... как исправить неподскажите?
    public class PostAdapter extends RecyclerView.Adapter {
    private LayoutInflater mInflater; private int mShowStyle; private int musicShowStyle; VKPostArray obj; VKApiPhoto vkPhoto; ArrayList imgUrls1; VKApiUser mainUser; Context ctx;
    public PostAdapter(Context context, VKPostArray posts, VKApiUser user) { super(); this.obj = posts; this.mainUser = user; this.mInflater = LayoutInflater.from(context); ctx = context; }
    @Override public void onBindViewHolder(final PostViewHolder holder, final int position) {
    final VKApiPost p = obj.get(position);
    VKAttachments att = new VKAttachments(); att = p.attachments;
    for (VKAttachments.VKApiAttachment attachment : p.attachments) { Log.d("TAG", "attachment getType " + attachment.getType()); switch (attachment.getType()){ case AUDIO: if (attachment.getType().equals(AUDIO)){ VKApiAudio audio = (VKApiAudio) att.get(0); Log.d("TAG", "audio title: " + audio.title); if (audio != null){ holder.layone4.setVisibility(View.VISIBLE); holder.as1.setText(audio.artist); holder.as2.setText(audio.title); //Picasso.with(ctx).load(link.image_src).into(holder.i1); } else { holder.layone4.setVisibility(View.GONE); holder.as1.setText(null); holder.as2.setText(null); //holder.i1.setImageDrawable(null); }} break; case VIDEO: if (attachment.getType().equals(VIDEO)){ VKApiVideo video = (VKApiVideo) att.get(0); Log.d("TAG", "video title: " + video.title); if (video != null){ holder.layone3.setVisibility(View.VISIBLE); holder.vs1.setText(video.title); holder.vs2.setText(video.description); //Picasso.with(ctx).load(link.image_src).into(holder.i1); } else { holder.layone3.setVisibility(View.GONE); holder.vs1.setText(null); holder.vs2.setText(null); //holder.i1.setImageDrawable(null); }} break; case DOCUMENTS: if (attachment.getType().equals(DOCUMENTS)){ VKApiDocument document = (VKApiDocument) att.get(0); Log.d("TAG", "document title: " + document.title); if (document != null){ holder.layone5.setVisibility(View.VISIBLE); holder.ds1.setText(document.title); holder.ds2.setText(document.size + " мб"); //Picasso.with(ctx).load(link.image_src).into(holder.i1); } else { holder.layone5.setVisibility(View.GONE); holder.ds1.setText(null); holder.ds2.setText(null); //holder.i1.setImageDrawable(null); }} break; case LINK: if (attachment.getType().equals(LINK)){ VKApiLink link = (VKApiLink) att.get(0); Log.d("TAG", "link description: " + link.description); if (att.get(0).getType().equals(LINK)){ holder.layone.setVisibility(View.VISIBLE); holder.s1.setText(link.title); holder.s2.setText(link.url); Picasso.with(ctx).load(link.image_src).into(holder.i1); } else { holder.layone.setVisibility(View.GONE); holder.s1.setText(null); holder.s2.setText(null); holder.i1.setImageDrawable(null); Log.d("TAG", "link description gone: " + link.description); }}else {
    } break; case POOL: if (attachment.getType().equals(POOL)){ VKApiPoll poll = (VKApiPoll) att.get(0); Log.d("TAG", "pool question: " + poll.question); if (poll != null){ holder.layone2.setVisibility(View.VISIBLE); //holder.pps1.setText(poll.getType()); holder.pps2.setText(poll.question); } else { holder.layone2.setVisibility(View.GONE); //holder.pps1.setText(null); holder.pps2.setText(null); }} break; case ALBUM: if (attachment.getType().equals(ALBUM)){ VKApiPhotoAlbum photoAlbum = (VKApiPhotoAlbum) att.get(0); Log.d("TAG", "photoAlbum title: " + photoAlbum.title); if(photoAlbum != null) { holder.layone1.setVisibility(View.VISIBLE); holder.ps1.setText(photoAlbum.title); holder.ps2.setText("В альбоме " + photoAlbum.size + " фотографий"); } else { holder.layone1.setVisibility(View.GONE); holder.ps1.setText(null); holder.ps2.setText(null); }} break; default: break; } }
    holder.textPost.setText(p.text); Linkify.addLinks(holder.textPost, Linkify.WEB_URLS);
    int i; imgUrls1 = new ArrayList<>(att.size());
    try { for (i = 0; i <= att.size(); i++) { vkPhoto = (VKApiPhoto) att.get(i); imgUrls1.add(vkPhoto.photo_807); } } catch (Exception e) { holder.mNglContent.setImagesData(imgUrls1); } } @Override public int getItemCount() { return obj.size(); }
    @Override public int getItemViewType(int position) { return PHOTO; }
    @Override public PostViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType){ case PHOTO: if (mShowStyle == NineGridImageView.STYLE_FILL) { return new PostViewHolder(mInflater.inflate(R.layout.recycler_item_wall, parent, false)); } else { return new PostViewHolder(mInflater.inflate(R.layout.recycler_item_wall, parent, false)); } case MUSIC: if (musicShowStyle == audio.getType().length()) { return new PostViewHolder(mInflater.inflate(R.layout.musicitem, parent, false)); }} return null; }
    public class PostViewHolder extends RecyclerView.ViewHolder {
    CardView cv; TextView textPost, news_name, textDatePost, textrepostPost, textlikePost; ImageView like, repost,i1, ppi1, pi1; CircleImageView news_ava; CheckBox like1; NineGridImageView mNglContent;
    ImageView playMusic; TextView artistMusic, titleMusic, durationMusic, urlMusic;
    TextView s1, s2; TextView ps1, ps2, pps1, pps2, as1, as2, vs1, vs2, ds1, ds2; LinearLayout layone, layone1, layone2, layone3, layone4, layone5;
    private NineGridImageViewAdapter mAdapter = new NineGridImageViewAdapter() { @Override protected void onDisplayImage(Context context, ImageView imageView, String s) { if(imageView == null){ imageView.setImageResource(R.drawable.ic_ab_app); }else{ Picasso.with(context).load(s).into(imageView); }}
    @Override protected ImageView generateImageView(Context context) { return super.generateImageView(context); }
    @Override protected void onItemImageClick(Context context, int position, List list) {
    } };
    public PostViewHolder(View v) { super(v); cv = (CardView) v.findViewById(R.id.card_view_wall);
    news_name = (TextView) v.findViewById(R.id.news_name); news_ava = (CircleImageView) v.findViewById(R.id.news_ava); textDatePost = (TextView) v.findViewById(R.id.textDatePost);
    textPost = (TextView) v.findViewById(R.id.textPost);
    like = (ImageView) v.findViewById(R.id.iv_like_button); textlikePost = (TextView) v.findViewById(R.id.tv_likes_count);
    //like1 = (CheckBox) v.findViewById(R.id.iv_like_button); textrepostPost = (TextView) v.findViewById(R.id.tv_reposts_count); repost = (ImageView) v.findViewById(R.id.iv_repost);
    mNglContent = (NineGridImageView) v.findViewById(R.id.ngl_images); mNglContent.setAdapter(mAdapter);
    playMusic = (ImageView) v.findViewById(R.id.playMusic); artistMusic = (TextView) v.findViewById(R.id.artistMusic); titleMusic = (TextView) v.findViewById(R.id.albumMusic); durationMusic = (TextView) v.findViewById(R.id.durationMusic); //urlMusic = (TextView) itemView.findViewById(R.id.urlMusic);
    layone = (LinearLayout) v.findViewById(R.id.link); layone1 = (LinearLayout) v.findViewById(R.id.photoAlbum); layone2 = (LinearLayout) v.findViewById(R.id.pool); layone3 = (LinearLayout) v.findViewById(R.id.video); layone4 = (LinearLayout) v.findViewById(R.id.audio); layone5 = (LinearLayout) v.findViewById(R.id.document);
    as1 = (TextView) v.findViewById(R.id.as1); as2 = (TextView) v.findViewById(R.id.as2); //ai1 = (ImageView) v.findViewById(R.id.i1);
    vs1 = (TextView) v.findViewById(R.id.vs1); vs2 = (TextView) v.findViewById(R.id.vs2); //ai1 = (ImageView) v.findViewById(R.id.i1);
    ds1 = (TextView) v.findViewById(R.id.ds1); ds2 = (TextView) v.findViewById(R.id.ds2); //ai1 = (ImageView) v.findViewById(R.id.i1);
    s1 = (TextView) v.findViewById(R.id.s1); s2 = (TextView) v.findViewById(R.id.s2); i1 = (ImageView) v.findViewById(R.id.i1);
    pi1 = (ImageView) v.findViewById(R.id.pi1); ps1 = (TextView) v.findViewById(R.id.ps1); ps2 = (TextView) v.findViewById(R.id.ps2);
    ppi1 = (ImageView) v.findViewById(R.id.ppi1); pps1 = (TextView) v.findViewById(R.id.pps1); pps2 = (TextView) v.findViewById(R.id.pps2); }}


    Ответ

    У вас пустой else в котором вам надо отобразить состояние при отсутствии ссылки. Заполните его кодом убирающим картинку, тест и прочее примерно так:
    if(link != null) { holder.layone.setVisibility(View.VISIBLE); holder.s1.setText(link.title); holder.s2.setText(link.url); Picasso.with(ctx).load(link.image_src).into(holder.i1); }else{ holder.layone.setVisibility(View.GONE); holder.s1.setText(null); holder.s2.setText(null); holder.i1.setImageDrawable(null); }

    Карусель с центральным слайдом и другим css

    Привет! Учусь верстать, и на странице нужно сверстать карусель, да не простую, вот как она должна выглядеть:

    Суть в том, что на экране 5 слайдов, то что по центру должен выводить дополнительную информацию. Думаю как лучше решить эту задачу.
    Пока что решил сделать это с помощью jquery slick. Эта карусель в настройках имеет свойство centerMode: true, которое в том числе, добавляет класс центральному слайду .slick-center, и в css можно прописать стили что бы выводилась информация по центру и скрывалась круглая фото (или менялись ее размеры, позиция и border-radius).
    В результате, по сути выйдет, что в каждом слайде будет два блока div, один будет скрыт, а другой показан, в зависимости от того, центральный он или боковой.
    Коллеги в верном ли я направлении или, как обычно, изобретаю велосипед?


    Ответ

    Набросал вам небольшой шаблончик, остальное уже сами стилизуете:
    .owl-item.active.center img{ height: 260px !important; }


    Взаимодействие приложения на C++ и PHP-сервера

    Помогите пожалуйста выйти из творческого тупика:
    Приложение на C++ при старте сверяет свою версию с информацией о последней версии, которая хранится в базе данных на хостинге.
    Как на PHP вернуть информацию приложению (ведь это не браузер)? А так же какой должен быть минимальный набор параметров в заголовке POST-запроса при отправке на сервер (клиент отправляет номер версии и её описание)?


    Ответ

    Написал класс-обёртку https://github.com/sitev/cjWinHttp, чтобы обращаться из программы на С++ к сайтам, может и Вам пригодится =)

    Promises. Не работает последовательность

    Здравствуйте. Пишу код с использованием Обещаний для последовательного запуска функций. Только пару дней как разбираюсь с ними для улучшения кода (ибо раньше была ёлочка из коллбэков); Так вот. Есть функция анимации вывода текста на экран Animal():
    function Animal(string) { var a = ''; //variable which will be entered character by character string var i= 0;//Letter counter var p = document.createElement('p'); $('body').scrollTop($('body').append(p).height()); return new Promise(function (resolve) { Anima(); function Anima() {//Function of Animation a+=string[i]; i++; $('p').last().text(a); var timer = setTimeout(Anima, 100); if(i==string.length){ clearTimeout(timer); resolve(); }; }; }); };
    И функция AnimalPause() для изображения пауз(выводится на экран строка из точек и сразу же удаляется):
    function AnimalPause(string) { var a = ''; //variable which will be entered character by character string var i= 0;//Letter counter var p = document.createElement('p'); $('body').scrollTop($('body').append(p).height()); return promise = new Promise(function (resolve) { Anima(); function Anima() {//Function of Animation a+=string[i]; i++; $('p').last().text(a); var timer = setTimeout(Anima, 100); if(i==string.length){ clearTimeout(timer); $('p').last().remove(); resolve(); }; }; }); };
    Все сделал, вроде бы. И, если выводить последовательно строки через .then() - всё работает. И, если выводить последовательно строки с использованием цикла - тоже всё работает:
    Animal('..........') .then(() => Animal('---Hello! CONSOLE v 1.0.1 is working!---')) .then(() => Animal('To see all commands u can use type -help')) .then(() => Animal('DONE'))
    или так:
    var chain = Promise.resolve(); pause.forEach(function(txt){ chain = chain.then(() => AnimalPause(txt))});
    var pause = [ '...', '.....', '....', '.........' ];
    Но если через .then() Последовательно выводить текст, потом задержку, потом - текст, рушится: (Задержка выводится после того, как выведется текст):
    function Hello() { var chain = Animal('..........') .then(() => Animal('---Hello! CONSOLE v 1.0.1 is working!---')) .then(() => Animal('To see all commands u can use type -help')) .then(function() { return Pause(chain); // pause.forEach(function(txt){ // chain = chain.then(() => AnimalPause(txt))}) }) .then(() => Animal('DONE'))
    }; Hello();
    function Pause (chain) { return new Promise(function(resolve) { pause.forEach(function(txt){ chain = chain.then(() => AnimalPause(txt))}); resolve(); }) }
    Почему? Ну..и как исправить? :)
    По совету @Grundy в комментарии скидываю код для тестирования
    var pause = [ '...', '.....', '....', '.........' ]; function Animal(string) { var a = ''; //variable which will be entered character by character string var i = 0; //Letter counter var p = document.createElement('p'); $('body').scrollTop($('body').append(p).height()); return new Promise(function(resolve) { Anima(); function Anima() { //Function of Animation a += string[i]; i++; $('p').last().text(a); var timer = setTimeout(Anima, 100); if (i == string.length) { clearTimeout(timer); resolve(); }; }; }); }; function AnimalPause(string) { var a = ''; //variable which will be entered character by character string var i = 0; //Letter counter var p = document.createElement('p'); $('body').scrollTop($('body').append(p).height()); return promise = new Promise(function(resolve) { Anima(); function Anima() { //Function of Animation a += string[i]; i++; $('p').last().text(a); var timer = setTimeout(Anima, 100); if (i == string.length) { clearTimeout(timer); $('p').last().remove(); resolve(); }; }; }); }; function Pause(chain) { return new Promise(function(resolve) { pause.forEach(function(txt) { chain = chain.then(() => AnimalPause(txt)) }); resolve(); }) }; function Hello() { var chain = Animal('..........') .then(() => Animal('---Hello! CONSOLE v 1.0.1 is working!---')) .then(() => Animal('To see all commands u can use type -help')) .then(function() { return Pause(chain); //Вы заметите, что строка пауз выводится после вывода на экран строки "DONE". Должно быть наоборот }) .then(() => Animal('DONE')) }; Hello();


    Ответ

    Если пройтись по коду, то можно отметить, что функция Animal отличается от AnimalPause только тем, что в последней в итоге удаляется добавленный элемент.
    Исходя из этого можно передавать созданный p в resolve функции Animal и удалять его если надо. При этом AnimalPause выродится в следующее
    function AnimalPause(string) { return Animal(string).then(p => p.remove()); };
    Далее идет основная ошибка: функция Pause, которая добавляет продолжения для
    var chain = Animal(...)
    Но при этом не возвращает итоговый Promise, а просто переводит себя в состояние готово, именно поэтому выполнения вывода паузы откладывается до следующей цепочки.
    Вместо этого нужно вернуть Promise собранный на основе массива pause с помощью функции reduce
    function Pause(pause) { return pause.reduce((chain, txt) => chain.then(() => AnimalPause(txt)), Promise.resolve()); };
    В этом случае возвращенный Promise будет встроен в существующую цепочку и вызван в нужном порядке.

    Пример в сборе:
    var pause = [ '...', '.....', '....', '.........' ]; function Animal(string) { var a = ''; //variable which will be entered character by character string var i = 0; //Letter counter var p = document.createElement('p'); $('body').scrollTop($('body').append(p).height()); return new Promise(function(resolve) { Anima(); function Anima() { //Function of Animation a += string[i]; i++; p.textContent = a; var timer = setTimeout(Anima, 100); if (i == string.length) { clearTimeout(timer); resolve(p); }; }; }); }; function AnimalPause(string) { return Animal(string).then(p => p.remove()); }; function Pause(pause) { return pause.reduce((chain, txt) => chain.then(() => AnimalPause(txt)), Promise.resolve()); }; function Hello() { var chain = Animal('..........') .then(() => Animal('---Hello! CONSOLE v 1.0.1 is working!---')) .then(() => Animal('To see all commands u can use type -help')) .then(() => Pause(pause)) .then(() => Animal('DONE')) }; Hello();

    Принцип подстановки Лисков и предусловия

    Принцип подстановки Лисков прямо подразумевает, что предусловия не должны усиливаться в подклассах. Это логично (потому что переопределённый метод подкласса, для которого входные данные окажутся неприемлимыми, будет работать некорректно/выбросит эксепшн). Но как тогда спроектировать следующую архитектуру:
    Есть класс скажем Vehicle (можно его сделать абстрактным, не суть важно), у него есть виртуальный метод Weight (пусть этот метод делает какие-то заумные вычисления для каждого типа транспортного средства в зависимости от массы, не столь важно):
    public abstract class Vehicle { public virtual void Weight(int w) {
    } }
    Теперь у нас есть класс Motorcycle, который мы наследуем от Vehicle, но мы должны ограничить его макс массу скажем в 200 кг.
    public class Motorcycle : Vehicle { public override void Weight(int w) { if (w > 200) throw new WeightOverflowException(); } }
    вроде всё прекрасно, логичное наследование, с наследованием всех свойств и поведения, но нарушает же LSP:
    List list2 = new List(); list2.Add(new Motorcycle());
    foreach (var item in list2) { item.Weight(400); }
    полетит же эксепшн WeightOverflowException, о котором базовый класс не должен вообще ничего знать. Как правильно спроектировать такую задачу?


    Ответ

    В проектировании по контракту существует понятие "доступности предусловия". Это означает, что клиентский код должен иметь возможность узнать, а удовлетворяет ли он предусловия или нет.
    Тут можно сказать, что поскольку в предусловии участвует аргумент, который клиент и передает, то это правило соблюдается. Но само предусловие меняется в зависимости от типа и не является явным.
    В этом случае мы можем выделить предусловие в отдельный метод и сделать само предусловие полиморфным:
    public abstract class Vehicle { public virtual bool IsWeightValid(int w) {return true;} public virtual void Weight(int w) { Contract.Requires(IsWeightValid(w)); } }
    Теперь, мы говорим нашим клиентам: "прежде чем дергать метод Weight убедитесь самостоятельно, что аргумент валиден". Да, это может выглядеть перебором. И я бы прибегал к этому трюку в крайнем случае, чтобы не усложнять API. Но это довольно распространенный паттерн. Например, коллекции в BCL выставляют свойство IsReadOnly, которое (теоретически) должно быть проверено перед вызовом метода Add.
    Кто-то считает поведение из BCL нарушением LSP, но я так не думаю: метод имеет право выражать свои предусловия в более абстрактном виде, через свои собственные свойства или методы. Contract.Requires(ImInValidState) ничем не хуже (теоретически), чем Contract.Requires(methodArgument != null)

    BinaryReader есть ли timeout?

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


    Ответ

    Установить таймаут для самого BinaryReader'а нельзя, но можно установить таймаут для TcpClient'а, котоорый поставляет ему несущий поток.
    Для этого имеет смысл воспользоваться параметром TcpClient.ReceiveTimeout до запроса NetworkStream'а.
    Ответ честно украден отсюда

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

    Хочу создать псевдоним postmaster для виртуального домена (example.ua), почта для несуществующего виртуального пользователя postmaster@example.ua приходила в ящик существующего виртуального пользователя user@example.ua
    Некоторые строки из postconf
    alias_maps = hash:/etc/aliases compatibility_level = 2 local_recipient_maps = $alias_maps mydestination = localhost.$mydomain, localhost mydomain = $myhostname relay_domains = $mydestination, hash:/etc/postfix/relay setgid_group = maildrop smtpd_helo_required = yes smtpd_helo_restrictions = permit_sasl_authenticated, reject_unknown_hostname smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination, reject_unknown_client, reject_invalid_hostname, reject_non_fqdn_hostname, reject_unknown_hostname, reject_non_fqdn_sender, reject_unknown_sender_domain, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unverified_recipient smtpd_relay_restrictions = permit_sasl_authenticated, reject_unauth_destination, reject_unknown_client, reject_invalid_hostname, reject_non_fqdn_hostname, reject_unknown_hostname, reject_non_fqdn_sender, reject_unknown_sender_domain, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unverified_recipient smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = $myhostname smtpd_sasl_path = private/auth smtpd_sasl_type = dovecot smtpd_sender_restrictions = permit_sasl_authenticated, reject_unauth_destination, reject_unknown_client, reject_invalid_hostname, reject_non_fqdn_hostname, reject_unknown_hostname, reject_non_fqdn_sender, reject_unknown_sender_domain, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unverified_recipient strict_rfc821_envelopes = yes virtual_alias_domains = $myhostname virtual_alias_maps = hash:/etc/postfix/virtual virtual_gid_maps = static:303 virtual_mailbox_base = /srv/vmail virtual_mailbox_domains = $myhostname, subdom.$myhostname virtual_mailbox_lock = fcntl virtual_minimum_uid = 303 virtual_transport = lmtp:unix:private/dovecot-lmtp virtual_uid_maps = static:303
    /etc/postfix/virtual
    postmaster@example.ua user@example.ua
    sudo postmap /etc/postfix/virtual
    Но при отправке почты на postmaster@example.ua postfix отвергает её с сообщением, что такой пользователь не существует.
    NOQUEUE: reject: RCPT from forward7m.cmail.yandex.net[5.255.216.200]: 450 4.1.1 : Recipient address rejected: unverified address: host example.ua[private/dovecot-lmtp] said: 550 5.1.1 User doesn't exist: postmaster@example.ua (in reply to RCPT TO command); from= to= proto=ESMTP helo=
    Можно ли обойтись без создания пользователя и ящика в /etc/dovecot/users?


    Ответ

    Некоторые опции postconf -n в которых пустая опция virtual_alias__domains которая должна быть, в большинстве случаев пустой, если мы не хотим специально создавать домен, в котором будут исключительно виртуальные псевдонимы. А если мы хотим просто добавить псевдоним для доменов, в котором у нас уже есть виртуальные пользователи, нам нужно указать их только в virtual_mailbox_domains, и они не должны повторятся в mydestination и virtual_alias_domains.
    compatibility_level = 2 stress = yes biff = no disable_vrfy_command = yes strict_rfc821_envelopes = yes smtputf8_autodetect_classes = bounce
    myhostname = example.ua mydomain = $myhostname mydestination = localhost.$mydomain, localhost inet_interfaces = all inet_protocols = ipv4
    smtpd_recipient_restrictions = permit_inet_interfaces, permit_sasl_authenticated, reject_unauth_destination, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unknown_helo_hostname, reject_unknown_client_hostname, reject_rbl_client zen.spamhaus.org smtpd_relay_restrictions = permit_inet_interfaces, permit_sasl_authenticated, reject_unauth_destination smtpd_data_restrictions = reject_unauth_pipelining, reject_multi_recipient_bounce smtpd_etrn_restrictions = reject
    smtp_use_tls = yes smtp_enforce_tls = yes smtp_tls_security_level = encrypt smtp_helo_timeout = 10s smtp_rcpt_timeout = 10s smtp_tls_CAfile = /etc/ssl/ca-bundle.pem smtp_tls_CApath = /etc/ssl/certs smtp_tls_cert_file = /etc/apache2/ssl.crt/example.ua.crt smtp_tls_key_file = /etc/apache2/ssl.key/example.ua.key smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_scache smtp_tls_session_cache_timeout = 1d
    smtpd_use_tls = yes smtpd_enforce_tls = yes smtpd_helo_required = yes smtpd_tls_auth_only = yes smtpd_tls_security_level = encrypt smtpd_recipient_limit = 100 smtpd_reject_unlisted_recipient = yes smtpd_reject_unlisted_sender = yes smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = $myhostname smtpd_sasl_path = private/auth smtpd_sasl_type = dovecot smtpd_tls_CAfile = /etc/ssl/ca-bundle.pem smtpd_tls_CApath = /etc/ssl/certs smtpd_tls_cert_file = /etc/apache2/ssl.crt/example.ua.crt smtpd_tls_key_file = /etc/apache2/ssl.key/example.ua.key smtpd_tls_received_header = yes smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache smtpd_tls_session_cache_timeout = 1d
    virtual_alias_domains = virtual_alias_maps = hash:/etc/postfix/virtual virtual_mailbox_domains = $myhostname, subdomain.$myhostname
    virtual_mailbox_base = /srv/vmail virtual_mailbox_lock = fcntl virtual_minimum_uid = 303 virtual_uid_maps = static:303 virtual_gid_maps = static:303 virtual_transport = lmtp:unix:private/dovecot-lmtp
    /etc/postfix/virtual
    # example.ua postmaster@example.ua user@example.ua abuse@example.ua user@example.ua
    # subdomain.example.ua postmaster@subdomain.example.ua user@example.ua abuse@subdomain.example.ua user@example.ua
    sudo postmap hash:/etc/postfix/virtual
    И после этого почта отосланную на адреса postmaster@example.ua, abuse@example.ua, postmaster@subdomain.example.ua, abuse@subdomain.example.ua приходит виртуальному пользователю user@example.ua, как и задумывалось.

    URL роутинг на PHP

    Начал разбираться в MVC PHP, после множества прочитанных статей и просмотренных видео уроков накатал каркас своего приложения. (Сразу попрошу не советовать использовать готовые решение, я хочу изобрести собственный велосипед, так мне легче во всем разобраться). Схема стандартная все запросы идут на index.php, в роутере разбираю URL на controller, action, params. Ну с этим проблем нет. URL получаются такого вида: http://localhost/categories/sport, где categories - имя контроллера, а sport - action. Потом создаю второй контроллер к примеру articles, URL - http://localhost/articles/football ну и все по прежней схеме. Вопрос: как создать ссылку вида http://localhost/categories/sport/articles/football, или http://localhost/categories/sport/football Только так чтобы не писать все в одном контроллере.
    Вот класс роутера:
    class Router {
    protected $uri; protected $controller; protected $action; protected $params; protected $route; protected $method_prefix; protected $language;
    public function getUri() { return $this->uri; }
    public function getController() { return $this->controller; }
    public function getAction() { return $this->action; }
    public function getParams() { return $this->params; }
    public function getRoute() { return $this->route; }
    public function getMethodPrefix() { return $this->method_prefix; }
    public function getLanguage() { return $this->language; }
    public function __construct($uri) { $this->uri = urldecode(trim($uri, '/'));
    // Get defaults $routes = Config::get('routes'); $this->route = Config::get('default_route'); $this->method_prefix = isset($routes[$this->route]) ? $routes[$this->route] : ''; $this->language = Config::get('default_language'); $this->controller = Config::get('default_controller'); $this->action = Config::get('default_action');
    $uri_parts = explode('?', $this->uri);
    // Get path like /lng/controller/action/param1/param2/ $path = mb_substr($uri_parts[0], 14);
    $path_parts = explode('/', $path);
    if(count($path_parts)) {
    // Get route at first element if(in_array(strtolower(current($path_parts)), array_keys($routes))) { $this->route = strtolower(current($path_parts)); $this->method_prefix = isset($routes[$this->route]) ? $routes[$this->route] : ''; array_shift($path_parts);
    } elseif(in_array(strtolower(current($path_parts)), Config::get('languages'))) { $this->language = strtolower(current($path_parts)); array_shift($path_parts); }
    //Get controller - next element of array if(current($path_parts)) { $this->controller = strtolower(current($path_parts)); array_shift($path_parts); }
    //Get action if(current($path_parts)) { $this->action = strtolower(current($path_parts)); array_shift($path_parts); }
    //Get params - all the rest $this->params = $path_parts; } }
    public static function redirect($location) { header("Location: $location"); exit(); }
    public static function notFound() { header('HTTP/1.0 404 Not Found'); header('HTTP/1.1 404 Not Found'); header('Status: 404 Not Found');
    return true;
    } }


    Ответ

    Закрываю вопрос, после долгих поисков нашел, и решил использовать AltoRouter, рекомендую всем: http://altorouter.com/

    Конструктор динамических имён методов

    У меня есть несколько методов с однотипными префиксами.
    def get_foo # code end
    def get_bar # code end
    Я хочу научиться генерировать эти префиксы автоматически (по аналогии с тем, как это сделано в Rails: Model.find_by_smth).
    Т.е. я хочу создать некий scope get_, в который можно поместить метод foo и тот автоматически приобретёт префикс get_ и станет доступен как get_foo
    Как это можно реализовать?

    Пример желаемого синтаксиса.
    module Bar # некая обётка `get_` end
    class Foo include Bar
    <некая обёртка из Bar> do def foo puts 'У меня есть мысль, и я её думаю!' end
    def bar puts 'А можно я её тоже немножечко подумаю?' end end end
    foo = Foo.new
    foo.get_foo # => "У меня есть мысль, и я её думаю!" foo.get_bar # => "А можно я её тоже немножечко подумаю?"


    Ответ

    class Module def with_prefix(prefix, &block) m = Module.new m.instance_eval(&block) m.methods(false).each do |name| define_method "#{prefix}_#{name}", &m.method(name) module_function "#{prefix}_#{name}" unless self.is_a?(Class) end end end
    class Foo with_prefix :get do with_prefix :and do def foo puts "У меня есть мысль, и я её думаю!" end
    def bar puts "А можно я её тоже немножечко подумаю?" end end end end
    foo = Foo.new
    foo.get_and_foo # => "У меня есть мысль, и я её думаю!" foo.get_and_bar # => "А можно я её тоже немножечко подумаю?"
    Что делает этот код?
    Объявляет метод with_prefix в суперклассе всех классов Метод принимает имя префикса и блок кода Выполняет блок в контексте анонимной функции Это позволяет исполнять оператор def в анонимном модуле, а не в классе Перебирает все методы внутри модуля Создаёт методы с префиксами для каждого метода

    Как в Safari в input убрать иконку пользователя?

    В Safari в input при редактировании появляется иконка пользователя. Добавление параметра autocomplete="off" не помогло.

    Как можно решить данную проблему? Благодарю.


    Ответ

    Контактную кнопку в Safari можно убрать завязавшись на селектор ::-webkit-contacts-auto-fill-button
    ::-webkit-contacts-auto-fill-button { visibility: hidden; pointer-events: none; position: absolute; right: 0; }
    Можно сделать проще:
    ::-webkit-contacts-auto-fill-button { opacity: 0; }
    Но в таком случае кнопка остается в потоке поля и может мешать при вводе в него данных.

    Превью в виде картинки из файла MS Word

    Здравствуйте, понадобилось сделать превью вордовского файла в виде картинки, что б еще сохранялось форматирование текста.
    Например как тут:
    Такая задача встает впервые, посоветуйте с чего начать изучение данной задачи. Желательно, даже очень, что б это было средствами PHP. Может есть библиотеки какие, или статьи у кого нибудь в закладках.


    Ответ

    как сделать без сторонних утилит не знаю, но может быть подойдет такое решение.
    ставим libreoffice (или open - значения не имеет): sudo apt-get install libreoffice ставим imagemagick (либо расширением к пыху): sudo apt-get install imagemagick конвертим doc в pdf: lowriter --convert-to pdf test.doc конвертим 1ю страницу pdf в картинку: convert test.pdf[0] test.jpg
    из php ко всем этим командам можно обращаться через shell_exec. как-то так ^_^

    IDEA смена версии maven проектов из IDE

    Как средствами IDE сменить версию всех проектов, дочерних от корневого? Есть maven команда, которая это делает из консоли mvn -DnewVersion=1.2.3.4 -versions:set, но хотелось бы уметь делать это из UI.


    Ответ

    Специального инструмента для обновления версии maven-проект в IDEA нет.
    Однако вы можете:
    Создать Run Configuration для maven, которая будет запускать цели плагина maven-release-plugin или maven-versions-plugin. При этом в pom-файле нужно будет предварительно настроить плагин и вспомогательные инструменты для вычисления следующей версии. После этого можно будет выполнять цель по кнопке Run Запускать те же предварительно настроенные цели maven из боковой панели Maven Projects Написать shell-скрипт, выполняющий нужные действия, и запускать его из дерева проекта командой Run контекстного меню.

    PS. Для серьезных целей, вроде выпуска полноценных релизов, не стоит завязываться на функциональность конкретной IDE.

    Программное нажатие на кнопку из расширения обозревателя

    Делаю расширение для сайта. Согласно логике необходимо добавить ссылку, при нажатие (пользователем) на которую, мне необходимо инициировать (программно) нажатие ссылки на сайте.
    Конкретно, добавляю ссылку в панель инструментов. При клике на ссылку, необходимо открыть меню добавления комментария под вопросом за счет клика на ссылке «добавить комментарий».
    function processAddingAssociationLink() { $("#question .post-menu").append("" + associateHelpText + ""); $("#associate-link").click(function() { $(".question .js-add-link").trigger("click"); $(".question .comment-form textarea").text(associationTag + " "); $(".question .comment-form input").val(addAssociationHelpText); event.preventDefault(); }); }
    Вызов $(".question .js-add-link").trigger("click"); не создает нажатия, хотя если выполнять этот код в консоли Хрома, все работает, как надо. Подскажите, пожалуйста, как исправить?
    Если выполнить код ($(".question .js-add-link").trigger("click");) в консоли, а затем нажать на созданную мной кнопку, то необходимые поля обновляются (то есть часть обработчика отрабатывает).
    Обновление
    Решение может быть такое
    var event;
    if (document.createEvent) { event = document.createEvent("HTMLEvents"); event.initEvent("click", true, true); } else { event = document.createEventObject(); event.eventType = "click"; }
    event.eventName = "click";
    var element = $(".question .js-add-link")[0]; if (document.createEvent) { element.dispatchEvent(event); } else { element.fireEvent("on" + event.eventType, event); }
    Но не до конца понятно, почему оно работает, а стандартный вызов – нет.


    Ответ

    Тут есть две проблемы.
    Основная проблема заключается в том, что метод trigger в jquery выполняет только те обработчики, которые были назначены элементу в том же самом jquery. Ну еще иногда выполняет другие обработчики - но не всегда. А у вас в расширении загружен другой инстанс jquery.
    Вторая проблема, content script выполняется в изолированном окружении и в принципе не имеет доступа к объектам страницы, поэтому обычный ответ в таком случае "зачем вы добавили на страницу вторую jquery?" не применим.

    Для того, чтобы вызвать обработчик независимо от того кто его зарегистрировал - следует использовать dispatchEvent
    Альтернативный вариант - можно внедрить на страницу обычный скрипт через инъекцию тэга