{"id":322073,"date":"2021-04-25T21:00:57","date_gmt":"2021-04-25T21:00:57","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=322073"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=322073","title":{"rendered":"\u0411\u043b\u043e\u043a\u043d\u043e\u0442 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Vala"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Vala.  \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 GNOME Builder \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 Glade. <\/p>\n<h2>\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434<\/h2>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d6c\/9d0\/c8b\/d6c9d0c8b821fc0214b882c37555e7e6.png\" width=\"600\" height=\"347\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u043b\u0435\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0437\u0430\u043c\u0435\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0435. \u0418\u043c\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434 \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f. \u041d\u0430\u0436\u0430\u0432 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0445\u0438\u0434\u0435\u0440\u0431\u0430\u0440\u0435, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u043c\u044f. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f <a href=\"https:\/\/github.com\/alexkdeveloper\/notepad\">\u0437\u0434\u0435\u0441\u044c<\/a>. <\/p>\n<p>\u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 Glade:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/09c\/19d\/584\/09c19d58432f82acf85dcf5d3cba9145.png\" width=\"1027\" height=\"576\"><figcaption><\/figcaption><\/figure>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/h2>\n<p>\u041d\u0430\u0436\u0430\u0432 \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043a\u0443 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0417\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"vala\">private void on_add_clicked(){         GLib.File file = GLib.File.new_for_path(directory_path+\"\/\"+date_time());         try {             FileUtils.set_contents (file.get_path(), \"\");\/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0444\u0430\u0439\u043b         } catch (Error e) {             stderr.printf (\"Error: %s\\n\", e.message);         }         if(!is_empty(text_view.buffer.text)){               text_view.buffer.text = \"\";         }          show_notes();\/\/\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043c\u0435\u0442\u043e\u043a       }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>date_time<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u0435\u0442 \u0438\u043c\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0435:<\/p>\n<pre><code class=\"vala\">private string date_time(){          var now = new DateTime.now_local ();          return now.format(\"%d\")+\".\"+now.format(\"%m\")+\".\"+now.format(\"%Y\")+\"  \"+now.format(\"%H\")+\":\"+now.format(\"%M\")+\":\"+now.format(\"%S\");     }<\/code><\/pre>\n<p>\u0418\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0430 \u0441\u043f\u0438\u0441\u043a\u0430:<\/p>\n<pre><code class=\"vala\">private void show_notes () {            list_store.clear();            list = new GLib.List&lt;string&gt; ();             try {             Dir dir = Dir.open (directory_path, 0);             string? file_name = null;             while ((file_name = dir.read_name ()) != null) {                 list.append(file_name);             }         } catch (FileError err) {             stderr.printf (err.message);         }          Gtk.TreeIter iter;            foreach (string item in list) {                list_store.append(out iter);                list_store.set(iter, Columns.TEXT, item);            }        }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a.<\/p>\n<h2>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/h2>\n<p>\u0417\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"vala\">private void on_delete_clicked(){          var selection = tree_view.get_selection();            selection.set_mode(Gtk.SelectionMode.SINGLE);            Gtk.TreeModel model;            Gtk.TreeIter iter;            if (!selection.get_selected(out model, out iter)) {                alert(\"Choose a note\");                return;            }            GLib.File file = GLib.File.new_for_path(directory_path+\"\/\"+item);          var dialog_delete_file = new Gtk.MessageDialog(this, Gtk.DialogFlags.MODAL,Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL, \"Delete note \"+file.get_basename()+\" ?\");          dialog_delete_file.set_title(\"Question\");          Gtk.ResponseType result = (Gtk.ResponseType)dialog_delete_file.run ();          dialog_delete_file.destroy();          if(result==Gtk.ResponseType.OK){          FileUtils.remove (directory_path+\"\/\"+item);\/\/\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0444\u0430\u0439\u043b          if(file.query_exists()){             alert(\"Delete failed\");\/\/\u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c          }else{              show_notes();              text_view.buffer.text = \"\";\/\/\u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c          }       }    }<\/code><\/pre>\n<p>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c.<\/p>\n<h2>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043e\u043a<\/h2>\n<p>\u0414\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"vala\">private void on_save_clicked(){          var selection = tree_view.get_selection();            selection.set_mode(Gtk.SelectionMode.SINGLE);            Gtk.TreeModel model;            Gtk.TreeIter iter;            if (!selection.get_selected(out model, out iter)) {                alert(\"Choose a note\");                return;            }          if(is_empty(text_view.buffer.text)){              alert(\"Nothing to save\");              return;          }          GLib.File file = GLib.File.new_for_path(directory_path+\"\/\"+item);         var dialog_save_file = new Gtk.MessageDialog(this, Gtk.DialogFlags.MODAL,Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL, \"Save note \"+file.get_basename()+\" ?\");          dialog_save_file.set_title(\"Question\");          Gtk.ResponseType result = (Gtk.ResponseType)dialog_save_file.run ();          if(result==Gtk.ResponseType.OK){          try {             FileUtils.set_contents (file.get_path(), text_view.buffer.text);\/\/\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0444\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438         } catch (Error e) {             stderr.printf (\"Error: %s\\n\", e.message);         }           show_notes();       }       dialog_save_file.destroy();       }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c, \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0430 \u0435\u0441\u0442\u044c \u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435, \u0447\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435.<\/p>\n<h2>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c<\/h2>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u043c\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"vala\">private void on_save_as_clicked(){         var selection = tree_view.get_selection();            selection.set_mode(Gtk.SelectionMode.SINGLE);            Gtk.TreeModel model;            Gtk.TreeIter iter;            if (!selection.get_selected(out model, out iter)) {                alert(\"Choose a note\");\/\/\u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0443 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430                return;            }         if(is_empty(text_view.buffer.text)){              alert(\"Nothing to save\");\/\/\u043d\u0435\u0447\u0435\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c              return;          }         var dialog_save_note = new Gtk.Dialog.with_buttons (\"Save note\", this, Gtk.DialogFlags.MODAL); \t\tvar content_area = dialog_save_note.get_content_area ();         entry_name = new Gtk.Entry();         var label_name = new Gtk.Label.with_mnemonic (\"_Name:\");         var hbox = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 20);         hbox.set_border_width(15);         hbox.pack_start (label_name, false, true, 0);         hbox.pack_start (entry_name, true, true, 0); \t\tcontent_area.add (hbox); \t\tdialog_save_note.add_button (\"OK\", Gtk.ResponseType.OK); \t\tdialog_save_note.add_button (\"CLOSE\", Gtk.ResponseType.CLOSE); \t\tdialog_save_note.response.connect (on_save_response); \t\tdialog_save_note.show_all ();       }<\/code><\/pre>\n<p>\u0412 \u0432\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u043e\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u0437\u0430\u043c\u0435\u0442\u043a\u0438:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/23e\/936\/b4f\/23e936b4fe91e73e0db11b037f95e2db.png\" width=\"266\" height=\"139\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0439 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 OK \u0438 CLOSE \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>on_save_response<\/code>:<\/p>\n<pre><code class=\"vala\">private void on_save_response (Gtk.Dialog dialog, int response_id) {         switch (response_id) { \t\tcase Gtk.ResponseType.OK: \t\tif(is_empty(entry_name.get_text())){ \t\t    alert(\"Enter the name\");\/\/\u043d\u0443\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0438\u043c\u044f         entry_name.grab_focus();         return; \t\t} \t\tGLib.File select_file = GLib.File.new_for_path(directory_path+\"\/\"+item); \t\tGLib.File edit_file = GLib.File.new_for_path(directory_path+\"\/\"+entry_name.get_text().strip()); \t\tif (select_file.get_basename() != edit_file.get_basename() &amp;&amp; !edit_file.query_exists()){                 FileUtils.rename(select_file.get_path(), edit_file.get_path());\/\/\u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b                 if(!edit_file.query_exists()){                     alert(\"Rename failed\");\/\/\u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c                     return;                 }                 try {                  FileUtils.set_contents (edit_file.get_path(), text_view.buffer.text);               } catch (Error e) {                      stderr.printf (\"Error: %s\\n\", e.message);             }             }else{                 if (select_file.get_basename() != edit_file.get_basename()) {                     alert(\"A note with the same name already exists\");\/\/\u0442\u0430\u043a\u043e\u0435 \u0438\u043c\u044f \u0443\u0436\u0435 \u0435\u0441\u0442\u044c                     entry_name.grab_focus();                     return;                 }                 try {                  FileUtils.set_contents (edit_file.get_path(), text_view.buffer.text);               } catch (Error e) {                      stderr.printf (\"Error: %s\\n\", e.message);              }             }             show_notes();         dialog.destroy(); \t\tbreak; \tcase Gtk.ResponseType.CLOSE: \t        dialog.destroy(); \t        break; \tcase Gtk.ResponseType.DELETE_EVENT: \t\tdialog.destroy(); \t\tbreak; \t\t} }<\/code><\/pre>\n<p>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u043a\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0438\u043c\u0435\u043d\u0435\u043c \u0438 \u0435\u0441\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432\u0432\u0435\u0441\u0442\u0438 \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u043c\u044f.<\/p>\n<h2>\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/h2>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"vala\">private void on_select_item () {            var selection = tree_view.get_selection();            selection.set_mode(Gtk.SelectionMode.SINGLE);            Gtk.TreeModel model;            Gtk.TreeIter iter;            if (!selection.get_selected(out model, out iter)) {                return;            }            Gtk.TreePath path = model.get_path(iter);            var index = int.parse(path.to_string());            if (index &gt;= 0) {                item = list.nth_data(index);            }           string text;             try {                 FileUtils.get_contents (directory_path+\"\/\"+item, out text);             } catch (Error e) {                stderr.printf (\"Error: %s\\n\", e.message);             }             text_view.buffer.text = text;\/\/\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043c\u0435\u0442\u043a\u0438        }<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435! \u0414\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445!<\/p>\n<hr>\n<p>\u0414\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440 ITSOFT \u2014 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438 \u0430\u0440\u0435\u043d\u0434\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u0441\u0442\u043e\u0435\u043a \u0432 \u0434\u0432\u0443\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430\u0445 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435. \u0417\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0433\u043e\u0434\u044b UPTIME 100%. \u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 GPU-\u0444\u0435\u0440\u043c \u0438 ASIC-\u043c\u0430\u0439\u043d\u0435\u0440\u043e\u0432, \u0430\u0440\u0435\u043d\u0434\u0430 GPU-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0441\u0432\u044f\u0437\u0438, SSL-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0430\u0439\u0442\u043e\u0432.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/itsoft\/blog\/553488\/\"> https:\/\/habr.com\/ru\/company\/itsoft\/blog\/553488\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Vala.  \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0440\u0435\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 GNOME Builder \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 Glade. <\/p>\n<h2>\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434<\/h2>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u043b\u0435\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0437\u0430\u043c\u0435\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0435. \u0418\u043c\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0439 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434 \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f. \u041d\u0430\u0436\u0430\u0432 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0445\u0438\u0434\u0435\u0440\u0431\u0430\u0440\u0435, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u043c\u044f. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f <a href=\"https:\/\/github.com\/alexkdeveloper\/notepad\">\u0437\u0434\u0435\u0441\u044c<\/a>. <\/p>\n<p>\u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 Glade:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/h2>\n<p>\u041d\u0430\u0436\u0430\u0432 \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043a\u0443 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0417\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"vala\">private void on_add_clicked(){         GLib.File file = GLib.File.new_for_path(directory_path+\"\/\"+date_time());         try {             FileUtils.set_contents (file.get_path(), \"\");\/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u0444\u0430\u0439\u043b         } catch (Error e) {             stderr.printf (\"Error: %s\\n\", e.message);         }         if(!is_empty(text_view.buffer.text)){               text_view.buffer.text = \"\";         }          show_notes();\/\/\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043c\u0435\u0442\u043e\u043a       }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <code>date_time<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u0435\u0442 \u0438\u043c\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0435:<\/p>\n<pre><code class=\"vala\">private string date_time(){          var now = new DateTime.now_local ();          return now.format(\"%d\")+\".\"+now.format(\"%m\")+\".\"+now.format(\"%Y\")+\"  \"+now.format(\"%H\")+\":\"+now.format(\"%M\")+\":\"+now.format(\"%S\");     }<\/code><\/pre>\n<p>\u0418\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u041c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0430 \u0441\u043f\u0438\u0441\u043a\u0430:<\/p>\n<pre><code class=\"vala\">private void show_notes () {            list_store.clear();            list = new GLib.List&lt;string&gt; ();             try {             Dir dir = Dir.open (directory_path, 0);             string? file_name = null;             while ((file_name = dir.read_name ()) != null) {                 list.append(file_name);             }         } catch (FileError err) {             stderr.printf (err.message);         }          Gtk.TreeIter iter;            foreach (string item in list) {                list_store.append(out iter);                list_store.set(iter, Columns.TEXT, item);            }        }<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a.<\/p>\n<h2>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/h2>\n<p>\u0417\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"vala\">private void on_delete_clicked(){          var selection = tree_view.get_selection();            selection.set_mode(Gtk.SelectionMode.SINGLE);            Gtk.TreeModel model;            Gtk.TreeIter iter;            if (!selection.get_selected(out model, out iter)) {                alert(\"Choose a note\");                return;            }            GLib.File file = GLib.File.new_for_path(directory_path+\"\/\"+item);          var dialog_delete_file = new Gtk.MessageDialog(this, Gtk.DialogFlags.MODAL,Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL, \"Delete note \"+file.get_basename()+\" ?\");          dialog_delete_file.set_title(\"Question\");          Gtk.ResponseType result = (Gtk.ResponseType)dialog_delete_file.run ();          dialog_delete_file.destroy();          if(result==Gtk.ResponseType.OK){          FileUtils.remove (directory_path+\"\/\"+item);\/\/\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0444\u0430\u0439\u043b          if(file.query_exists()){             alert(\"Delete failed\");\/\/\u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0443\u0434\u0430\u043b\u0438\u0442\u044c          }else{              show_notes();              text_view.buffer.text = \"\";\/\/\u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c          }       }    }<\/code><\/pre>\n<p>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c.<\/p>\n<h2>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043e\u043a<\/h2>\n<p>\u0414\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"vala\">private void on_save_clicked(){          var selection = tree_view.get_selection();            selection.set_mode(Gtk.SelectionMode.SINGLE);            Gtk.TreeModel model;            Gtk.TreeIter iter;            if (!selection.get_selected(out model, out iter)) {                alert(\"Choose a note\");                return;            }          if(is_empty(text_view.buffer.text)){              alert(\"Nothing to save\");              return;          }          GLib.File file = GLib.File.new_for_path(directory_path+\"\/\"+item);         var dialog_save_file = new Gtk.MessageDialog(this, Gtk.DialogFlags.MODAL,Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL, \"Save note \"+file.get_basename()+\" ?\");          dialog_save_file.set_title(\"Question\");          Gtk.ResponseType result = (Gtk.ResponseType)dialog_save_file.run ();          if(result==Gtk.ResponseType.OK){          try {             FileUtils.set_contents (file.get_path(), text_view.buffer.text);\/\/\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u0444\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438         } catch (Error e) {             stderr.printf (\"Error: %s\\n\", e.message);         }           show_notes();       }       dialog_save_file.destroy();       }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c, \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0430 \u0435\u0441\u0442\u044c \u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435, \u0447\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435.<\/p>\n<h2>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043e\u043a \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c<\/h2>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u043c\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"vala\">private void on_save_as_clicked(){         var selection = tree_view.get_selection();            selection.set_mode(Gtk.SelectionMode.SINGLE);            Gtk.TreeModel model;            Gtk.TreeIter iter;            if (!selection.get_selected(out model, out iter)) {                alert(\"Choose a note\");\/\/\u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043a\u0443 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430                return;            }         if(is_empty(text_view.buffer.text)){              alert(\"Nothing to save\");\/\/\u043d\u0435\u0447\u0435\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c              return;          }         var dialog_save_note = new Gtk.Dialog.with_buttons (\"Save note\", this, Gtk.DialogFlags.MODAL); \t\tvar content_area = dialog_save_note.get_content_area ();         entry_name = new Gtk.Entry();         var label_name = new Gtk.Label.with_mnemonic (\"_Name:\");         var hbox = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 20);         hbox.set_border_width(15);         hbox.pack_start (label_name, false, true, 0);         hbox.pack_start (entry_name, true, true, 0); \t\tcontent_area.add (hbox); \t\tdialog_save_note.add_button (\"OK\", Gtk.ResponseType.OK); \t\tdialog_save_note.add_button (\"CLOSE\", Gtk.ResponseType.CLOSE); \t\tdialog_save_note.response.connect (on_save_response); \t\tdialog_save_note.show_all ();       }<\/code><\/pre>\n<p>\u0412 \u0432\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u043e\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u0437\u0430\u043c\u0435\u0442\u043a\u0438:<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0439 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 OK \u0438 CLOSE \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>on_save_response<\/code>:<\/p>\n<pre><code class=\"vala\">private void on_save_response (Gtk.Dialog dialog, int response_id) {         switch (response_id) { \t\tcase Gtk.ResponseType.OK: \t\tif(is_empty(entry_name.get_text())){ \t\t    alert(\"Enter the name\");\/\/\u043d\u0443\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0438\u043c\u044f         entry_name.grab_focus();         return; \t\t} \t\tGLib.File select_file = GLib.File.new_for_path(directory_path+\"\/\"+item); \t\tGLib.File edit_file = GLib.File.new_for_path(directory_path+\"\/\"+entry_name.get_text().strip()); \t\tif (select_file.get_basename() != edit_file.get_basename() &amp;&amp; !edit_file.query_exists()){                 FileUtils.rename(select_file.get_path(), edit_file.get_path());\/\/\u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b                 if(!edit_file.query_exists()){                     alert(\"Rename failed\");\/\/\u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c                     return;                 }                 try {                  FileUtils.set_contents (edit_file.get_path(), text_view.buffer.text);               } catch (Error e) {                      stderr.printf (\"Error: %s\\n\", e.message);             }             }else{                 if (select_file.get_basename() != edit_file.get_basename()) {                     alert(\"A note with the same name already exists\");\/\/\u0442\u0430\u043a\u043e\u0435 \u0438\u043c\u044f \u0443\u0436\u0435 \u0435\u0441\u0442\u044c                     entry_name.grab_focus();                     return;                 }                 try {                  FileUtils.set_contents (edit_file.get_path(), text_view.buffer.text);               } catch (Error e) {                      stderr.printf (\"Error: %s\\n\", e.message);              }             }             show_notes();         dialog.destroy(); \t\tbreak; \tcase Gtk.ResponseType.CLOSE: \t        dialog.destroy(); \t        break; \tcase Gtk.ResponseType.DELETE_EVENT: \t\tdialog.destroy(); \t\tbreak; \t\t} }<\/code><\/pre>\n<p>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u043a\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0438\u043c\u0435\u043d\u0435\u043c \u0438 \u0435\u0441\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432\u0432\u0435\u0441\u0442\u0438 \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u043c\u044f.<\/p>\n<h2>\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0437\u0430\u043c\u0435\u0442\u043a\u0438<\/h2>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"vala\">private void on_select_item () {            var selection = tree_view.get_selection();            selection.set_mode(Gtk.SelectionMode.SINGLE);            Gtk.TreeModel model;            Gtk.TreeIter iter;            if (!selection.get_selected(out model, out iter)) {                return;            }            Gtk.TreePath path = model.get_path(iter);            var index = int.parse(path.to_string());            if (index &gt;= 0) {                item = list.nth_data(index);            }           string text;             try {                 FileUtils.get_contents (directory_path+\"\/\"+item, out text);             } catch (Error e) {                stderr.printf (\"Error: %s\\n\", e.message);             }             text_view.buffer.text = text;\/\/\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043c\u0435\u0442\u043a\u0438        }<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435! \u0414\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445!<\/p>\n<hr>\n<p>\u0414\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440 ITSOFT \u2014 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438 \u0430\u0440\u0435\u043d\u0434\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u0441\u0442\u043e\u0435\u043a \u0432 \u0434\u0432\u0443\u0445 \u0434\u0430\u0442\u0430-\u0446\u0435\u043d\u0442\u0440\u0430\u0445 \u0432 \u041c\u043e\u0441\u043a\u0432\u0435. \u0417\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0433\u043e\u0434\u044b UPTIME 100%. \u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 GPU-\u0444\u0435\u0440\u043c \u0438 ASIC-\u043c\u0430\u0439\u043d\u0435\u0440\u043e\u0432, \u0430\u0440\u0435\u043d\u0434\u0430 GPU-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0441\u0432\u044f\u0437\u0438, SSL-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0430\u0439\u0442\u043e\u0432.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/itsoft\/blog\/553488\/\"> https:\/\/habr.com\/ru\/company\/itsoft\/blog\/553488\/<\/a><br \/><\/br><\/br><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-322073","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/322073","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=322073"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/322073\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=322073"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=322073"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=322073"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}