Страницы

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

четверг, 15 ноября 2018 г.

Заменить слово в файле

Нужно открыть файл, найти и заменить в нем одно слово (оно встречается в файле 1 раз) и сохранить под другим названием.
На баше эта задача решается вот так:
cat /tmp/test/file | sed "s/TEST_OLD/TEST_OLD/"> /tmp/test/file_new
C Питоном не очень, представляю что проблема решается как-то примерно так:
import re output_file = open("/tmp/test/file").readlines() string = "TEST_OLD" string.replace(string,"TEST_NEW") open("/tmp/test/file_new", "w")


Ответ

Ну в целом верно, только модуль re не нужен, также стоит либо использовать with, либо закрывать файлы file.close() после использования. Как то так в конечном итоге:
with open('test1') as file_in: text = file_in.read()
text = text.replace("TEST_OLD", "TEST_NEW")
with open("test2", "w") as file_out: file_out.write(text)
Да и readlines() возвращает список строк и это не совсем то что нам здесь нужно.
Update 0:

Для замены лучше использовать регулярные выражения, чтобы избежать проблем при включении слова в другие и т.д. Спасибо @ReinRaus за замечание.
Обрати внимание на ответ @andy.37 Если файл объемный, то read() плохая идея, поскольку так мы загрузим все содержимое файла в память. Правильный выбор в этом случае - построчное чтение/запись.

Visual Studio: сравнить два текстовых файла

Как в Visual Studio сравнить два текстовых файла, чтобы получить подсветку отличий: когда удаленные фрагменты подсвечиваются красным цветом, а добавленные фрагменты выделяются зеленым цветом?


Ответ

В Visual Studio (начиная с 12ой версии) вы можете это сделать посредством ввода в CommandWindow ("View\Other Windows\Command Window", либо через Ctrl+W, A) команды Tools.DiffFiles после которой через пробел указать полное (ну или относительное) имя к каждому из сравниваемых файлов.
Например, должно получиться что-то в духе:
Tools.DiffFiles D:\...\leftFile.cpp D:\...
ightFile.cpp
Либо вы это можете сделать посредством расширений для студии, таких как: VSCommands и CompareFiles, которые к тому же имеют графический интерфейс непосредственно для таких действий.

А вообще, вот нашел схожее на английском SO

Выезжающий View


Есть приложение с нижним тулбаром. Нужно сделать окно камеры, которое выезжает снизу по нажатию на левую кнопку. Окно должно выезжать на 1/3 экрана, тулбар должен быть над ним. Сделал камеру в SurfaceView. Как сделать выезжание?











Ответ

Camera_Activity.class
public class Camera_Activity extends AppCompatActivity {
ImageButton btn_camera; ImageButton btn_mic; SurfaceView sv; LinearLayout show_video;
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.anim_footer);
show_video = (LinearLayout) findViewById(R.id.show_video); btn_camera = (ImageButton) findViewById(R.id.btn_camera); btn_mic = (ImageButton) findViewById(R.id.btn_mic); sv = (SurfaceView) findViewById(R.id.camera_view);
btn_camera.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (sv.getVisibility() == View.GONE) { sv.setVisibility(View.VISIBLE); final Animation show = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.show_video); show_video.startAnimation(show); } } });
btn_mic.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (sv.getVisibility() == View.VISIBLE) { final Animation hide = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.hide_video); hide.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) {
}
@Override public void onAnimationEnd(Animation animation) { sv.setVisibility(View.GONE); }
@Override public void onAnimationRepeat(Animation animation) {
} }); show_video.startAnimation(hide); } } }); } }
anim_footer.xml









Две анимации:
show_video.xml

hide_video.xml

Результат:
Я старался по мин. задеть Вашу разметку, получается что добавился только LinerLayout, как контейнер для всего этого дела внизу. Иконки стандартные. В целом в коде особого нет ничего, но один момент я думаю стоит объяснить. Анимация translate: так как панелька у нас всегда видна, поэтому требуется выдвигать панель меньше на этот размер, но его подсчитать не будет сложности, даже если динамически будет меняться, просто придется анимацию переписывать программно. Да и в одной из анимации 1% больше, это фича, чтоб старт казался плавней, можете поставить на 85% поймете почему. Остальное вроде все по стандарту.

Как удалить линию в редакторе Webstorm

Народ подскажите пожалуйста как можно удалить эту линию? Ее вообще можно удалить?


Ответ

Setting → Editor → General → Appearance, снять галочку "Show right margin".

c# TimeSpan преобразование

Уважаемые товарищи знатоки, в каком виде лучше работать со временем в программах? DateTime или TimeSpan? Раньше в php использовал timestamp с преобразованием в дату время, а тут как то сложновато с этим, поэтому возникли сомнения, может не стоит timestamp лишних усилий? Если стоит, то как легче всего конвертировать его в дату-время?


Ответ

Timestamp в PHP - это UNIX формат времени, насколько я помню PHP. Этот формат очень удобен в каких то моментах.
Для .NET ниже, чем 4.6 - только вручную:
// Конвертация в UNIX время var unixTime = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
// Конвертация в TimeSpan var timeSpan = TimeSpan.FromSeconds(unixTime);
// Конвертация в DateTime var dateTime = (new DateTime(1970, 1, 1, 0, 0, 0, 0)).AddSeconds(unixTime);
Для .NET 4.6 уже добавили готовый вариант:
// Конвертация в UNIX время var unixTime = DateTimeOffset.Now.ToUnixTimeSeconds();
// Конвертация в DateTime var dateTime = DateTimeOffset.FromUnixTimeSeconds(unixTime).DateTime;

Документация:
DateTime
TimeSpan
DateTimeOffset
DateTimeOffset.ToUnixTimeSeconds
DateTimeOffset.FromUnixTimeSeconds

Как наиболее корректно реализовать mutex со счетчиком?

Пусть, например, задача - ограничить количество одновременно работающих потоков. Т.е. хочется иметь мьютекс, который бы могли захватывать одновременно N потоков, а остальные бы ждали, пока один из потоков не освободит такой мьютекс.
Вижу несколько вариантов организации такой функциональности, например, с использованием переменной для подсчета и обычных мьютексов, но что-то мне кажется, что я изобретаю велосипед.
Как наиболее корректно реализовать такой семафор со счетчиком средствами стандартного C++11? (Или там это уже есть, и я просто плохо читал литературу?..)


Ответ

В стандартной библиотеке готового семафора нет, по этому его надо писать самому, делая ожидание на condition_variable
В простейшем варианте это
class Semaphore { public: explicit Semaphore(int max_count) : max_count_(max_count) {}
void acquire() { std::unique_lock lock(mut_); while (count_ == max_count_) cv_.wait(lock); ++count_; }
void release() { std::lock_guard lock(mut_); assert(count_ > 0); --count_; cv_.notify_one(); }
private: int max_count_; int count_ = 0; std::mutex mut_; std::condition_variable cv_; };
Вызов notify в release() можно вынести из под мьютекса. Но на некоторых реализациях это не нужно
Вместо мьютекса в release() можно использовать атомарную переменную count_, но это потребует CAS в acquire(). Код усложнится, а выигрыш в производительности надо еще доказать.

Взять значения из текста

Имеется такой текст :
Date: Fri, 01 Apr 2016 03:21:49 GMT Server: nginx Content-Type: application/x-rar-compressed Cache-Control: no-cache, private Connection: keep-alive Accept-Ranges: bytes Keep-Alive: timeout=15 Content-Length: 63000000
или он может быть еще примерно таким:
Date: Fri, 01 Apr 2016 03:17:30 GMT Last-Modified: Sat, 13 Dec 2014 08:28:52 GMT Server: nginx ETag: W/"548bf8c4-28496" Vary: Accept-Encoding Content-Type: image/jpeg Connection: keep-alive Content-Encoding: gzip
В общем, нужно спарсить (если нету текста со значением то пропуск,как например в первом примере есть Content-Lenth: ... , а во втором нету) следующее : Content-Type: ..... (может быть только что то типа application/exe , image/png и т.д) Content-Length: ..... (могут быть любые цифры) как это можно сделать? учитывая что один или оба значения могут отсутствовать


Ответ

Можно поступить следующим образом
var text = 'Date: Fri, 01 Apr 2016 03:21:49 GMT \ Server: nginx \ Content-Type: application/x-rar-compressed \ Cache-Control: no-cache, private \ Connection: keep-alive \ Accept-Ranges: bytes \ Keep-Alive: timeout=15 \ Content-Length: 63000000';
var result = false; if( result = text.match( /Content-Length:\s*(\d+)/ )) { console.log(result[1]); } if( result = text.match( /Content-Type:\s*([^\s]+)/ )) { console.log(result[1]); }

IMEI код на планшетах без 3G

Здравствуйте. Есть программа, где мне нужно получить IMEI код устройства. Проверял на многих девайсах, но сегодня обнаружил, что его нельзя получить на устройствах без 3G (и соответственно без dialer'а). Получал его таким способом.
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String l1 = tm.getDeviceId();
На таких устройствах ничего не выдает. Сталкивался ли кто-нибудь с такой проблемой и как ее можно обойти?
P.S. честно говоря, я даже в настройках устройства не нашел его.


Ответ

Сталкивался ли кто-нибудь с такой проблемой
Да, для самого однажды это было неожиданно.
P.S. честно говоря, я даже в настройках устройства не нашел его.
Все верно, Устройства не имеющие слота под сим-карту, не имеют радиомодуля, следовательно не имеют и IMEI
как ее можно обойти?
Использовать в этом случае вместоIMEI, какой либо другой псевдо-уникальный идентификатор. Например:
String id = Secure.getString(getContentResolver(), Secure.ANDROID_ID);

Медленно выполняется запрос Oracle

Есть запрос:
SELECT zxp.rulon.ukey, n, nz, bz, zxp.rulon.ms, tz, ts, round(hz,2) HZ, hdm, hdp, zxp.rulon.h1, l, round(pf,2) PF, pt, pu, pdm, pdp, pbm, pbp, pe, zxp.mc.ukey, naim, LDM, LDP, LBM, LBP, H0, tr, tv, DOP, zxp.graph.irez as Broken, K_Z as Brigade FROM zxp.rulon, zxp.mc, zxp.graph WHERE ts BETWEEN to_date('02.01.2016 7:00:00', 'dd.mm.yyyy hh24:mi:ss') AND to_date('02.01.2016 15:00:00', 'dd.mm.yyyy hh24:mi:ss') AND zxp.rulon.ms = zxp.mc.ukey AND zxp.rulon.ukey = zxp.graph.u_rul AND k = ( SELECT min(k) FROM zxp.Graph WHERE zxp.rulon.ukey = zxp.graph.u_rul ) ORDER BY ts
Но его выполнение занимает от 4 секунд и выше. Можно ли его оптимизировать?
zxp.Rulon:
UKEY NUMBER N NUMBER ADR NUMBER NZ NUMBER MS NUMBER TR DATE TZ DATE TV DATE TS DATE TM NUMBER SK NUMBER DOP NUMBER BZ NUMBER HZ NUMBER HZZ NUMBER HDM NUMBER HDP NUMBER H0 NUMBER H1 NUMBER L NUMBER LDM NUMBER LDP NUMBER LBM NUMBER LBP NUMBER PF NUMBER PT NUMBER PDM NUMBER PDP NUMBER PBM NUMBER PBP NUMBER PU NUMBER PE NUMBER L_1 NUMBER L_2 NUMBER L_3 NUMBER L_4 NUMBER H1S NUMBER H2S NUMBER H3S NUMBER H4SI NUMBER H1SI NUMBER T1S NUMBER T2S NUMBER T3S NUMBER T4S NUMBER D1 NUMBER D2 NUMBER D3 NUMBER D4 NUMBER GH4N NUMBER GH4Z NUMBER GH4S NUMBER GH1Z NUMBER GH1S NUMBER L4 NUMBER D_RR NUMBER D_RV NUMBER K_T NUMBER K_Z NUMBER F_REZ1 NUMBER F_REZ2 NUMBER F_REZ3 NUMBER F_REZ4 NUMBER I_REZ1 NUMBER I_REZ2 NUMBER I_REZ3 NUMBER I_REZ4 NUMBER
Graph:
T2 NUMBER T3 NUMBER T4 NUMBER DL NUMBER IREZ NUMBER FREZ NUMBER LOGBITS NUMBER UKEY NUMBER U_RUL NUMBER K NUMBER T DATE H4 NUMBER H1 NUMBER V1 NUMBER V2 NUMBER V3 NUMBER V4 NUMBER
Это то что вы просили ? структура таблицы ?
Plan hash value: 515981838
-------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1653 | 663K| | 332 (2)| 00:00:04 | | 1 | SORT ORDER BY | | 1653 | 663K| 1672K| 332 (2)| 00:00:04 | |* 2 | VIEW | VW_WIF_1 | 1653 | 663K| | 184 (2)| 00:00:03 | | 3 | WINDOW SORT | | 1653 | 384K| 872K| 184 (2)| 00:00:03 | |* 4 | FILTER | | | | | | | | 5 | TABLE ACCESS BY INDEX ROWID | GRAPH | 3320 | 110K| | 88 (2)| 00:00:02 | | 6 | NESTED LOOPS | | 1653 | 384K| | 94 (2)| 00:00:02 | |* 7 | HASH JOIN | | 1 | 204 | | 7 (15)| 00:00:01 | | 8 | TABLE ACCESS BY INDEX ROWID| RULON | 1 | 195 | | 3 (0)| 00:00:01 | |* 9 | INDEX RANGE SCAN | I_RUL | 1 | | | 2 (0)| 00:00:01 | | 10 | TABLE ACCESS FULL | MC | 45 | 405 | | 3 (0)| 00:00:01 | |* 11 | INDEX RANGE SCAN | GRAPH_RUL | 3391 | | | 12 (0)| 00:00:01 | --------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id): ---------------------------------------------------
2 - filter("VW_COL_33" IS NOT NULL) 4 - filter(TO_DATE('02.01.2016 15:00:00','dd.mm.yy hh24:mi:ss')>=TO_DATE('2016-01-02 07:00:00', 'yyyy-mm-dd hh24:mi:ss')) 7 - access("RULON"."MS"="MC"."UKEY") 9 - access("TS">=TO_DATE('2016-01-02 07:00:00', 'yyyy-mm-dd hh24:mi:ss') AND "TS"<=TO_DATE('02.01.2016 15:00:00','dd.mm.yy hh24:mi:ss')) 11 - access("RULON"."UKEY"="GRAPH"."U_RUL")
Индекс таблиц RULON:
Таблица Индекс Тип Колонки RULON RUL_UN UNIQUE UKEY RULON I_RUL NONUNIQUE TS
GRAPH:
GRAPH GRAPH_RUL NONUNIQUE U_RUL


Ответ

Оптимизатор оракла походу построил максимально эффективный план для данного запроса. Он по GRAPH идет всего один раз, строя оконную функцию и выбирая по ней запись с минимальным K. Но для поиска этого минимума ему приходится пройти много записей графа и просто изменением запроса это не лечится.
Как решения вижу:
Хранить минимальный K к рулону (и вести его триггерами), что бы исключить необходимость поиска минимума в графе. Как минус - собственно необходимость создания триггера, который при добавлении/модификации записей в GRAPH должен будет сверять K с хранимым в рулоне и менять его там, при необходимости. Построить на GRAPH составной индекс по колонкам (U_RUL, K), тогда оракл должен сходу находить записи с минимальным K, не заглядывая в данные. Как минус - индекс на 373кк записей займет много места и несколько замедлит создание новых записей в таблице GRAPH

Асинхронный код (Task.WaitAll) вешает программу [дубликат]

На данный вопрос уже ответили: Зависает оператор `await` в оконном приложении / программа висит при вызове Task.Result или Wait 1 ответ Есть некоторое недопонимание с работой асинхронного кода, в связи с чем прошу помощи. Следующая функция вешает программу:
private List GetContractsDetail(contracts) { List contractsList = new List(); // Сюда буду ложить ответы Task[] requests = new Task[contracts.Length]; // Создаю массив для моих тасков
Uri Uri = new Uri(Settings.CONTRACT_DETAIL_URI);
for (int i = 0; i < contracts.Length; i++) // По каждому контракту { HttpRequest ContractRequest = new HttpRequest(); //Это мой класс для работы с HttpClient
Dictionary data = new Dictionary() { ["access_token"] = token, ["contract_id"] = contracts[i] }; // Данные для GET запроса requests[i] = ContractRequest.Get(Uri, data); // Моя обертка над HttpClient.GetAsync }
Task.WaitAll(requests); // Тут зависает программа // Тут еще код, который я не дописал
return contractsList; }
По информации в интернете не до конца понимаю:
работает ли WaitAll как await? И если да, то почему виснет программа? стартуют ли вообще мои Таски? в каком месте кода я не прав? =)


Ответ

Нет. Task.Wait, Task.WaitAll - это совсем не await! await - это асинхронное продолжение, Wait же является синхронным ожиданием.
У вас взаимоблокировка. Вы работаете в потоке UI - а потому все ваши задачи свои продолжения ставят в очередь событий. Пока эта очередь не "провернется" - задача не будет выполнена. Но саму очередь вы при этом заблокировали синхронным ожиданием!
Правильный способ избавиться от взаимоблокировки - использовать асинхронный код на всех уровнях. Да, для этого саму функцию GetContractsDetail нужно тоже сделать асинхронной:
await Task.WhenAll(requests);
Костыльный, но более простой способ - вынести задачи в пул потоков:
requests[i] = Task.Run(() => ContractRequest.Get(Uri, data));
Еще один костыльный и простой способ - проставить .ConfigureAwait(false) на первом операторе await в методе ContractRequest.Get

Инересный слайдер книгой

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


Ответ

Если использовать slick slider
$('.slider').slick({ slidesToShow: 3, slidesToScroll: 1, arrows: true, dots: false, centerMode: true, variableWidth: true, infinite: true, focusOnSelect: true, cssEase: 'linear', touchMove: true, prevArrow:'', nextArrow:'', // responsive: [ // { // breakpoint: 576, // settings: { // centerMode: false, // variableWidth: false, // } // }, // ] }); var imgs = $('.slider img'); imgs.each(function(){ var item = $(this).closest('.item'); item.css({ 'background-image': 'url(' + $(this).attr('src') + ')', 'background-position': 'center', '-webkit-background-size': 'cover', 'background-size': 'cover', }); $(this).hide(); }); * { box-sizing: border-box; } img { max-width: 100%; width: 100%; } body { margin: 0; padding: 0; width: 100%; height: 100%; } .wrap { position: relative; z-index: 100; width: 100%; height: 100%; padding: 0 60px; background: url(https://images.unsplash.com/photo-1485069203392-8e1aeb1ebf02?auto=format&fit=crop&w=1054&q=80&ixid=dW5zcGxhc2guY29tOzs7Ozs%3D) center no-repeat; -webkit-background-size: cover; background-size: cover; overflow: hidden; } .wrap:after { content:''; position: absolute; z-index: 2; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,.5); } .slider { position: relative; z-index: 200; padding: 0 0px; margin: 5rem auto; max-width: 800px; width: 100%; } .slick-arrow { position: absolute; top: 50%; width: 40px; height: 50px; line-height: 50px; margin-top: -25px; border: none; background: transparent; color: #fff; font-family: monospace; font-size: 5rem; z-index: 300; outline: none; } .slick-prev { left: -50px; text-align: left; } .slick-next { right: -50px; text-align: right; } .item.slick-slide { width: 400px; height: 400px !important; transition: transform .4s; position: relative; } .slick-slide:after { content:''; position: absolute; z-index: 2; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,.5); transition: transform .4s; } .item.slick-slide { transform: scale(0.7) translate(640px); } .item.slick-slide.slick-center + .slick-slide { transform: scale(0.8) translate(-250px); z-index: 10; } .item.slick-slide.slick-center + .slick-slide + .item.slick-slide { transform: scale(0.7) translate(-640px); z-index: 5; } .item.slick-slide.slick-active { transform: scale(0.8) translate(250px); } .item.slick-slide.slick-center { /* margin: 0 -10%; */ transform: scale(1); z-index: 30; } .slick-center:after { opacity: 0; }


Развернуть на весь экран.
CodePen
Но, думаю, лучше самописный слайдер.

Как можно проследить последовательность вызовов методов в Android приложении

Как можно развернуть во времени событийную последовательность вызова процедур указанных классов приложения? На примере Activity lifecycle, в onCreate, onResume, onPause и т.д. - в каждый метод можно вручную вставлять вызов Log.d. В LogCat после чего становится понятна последовательность вызовов. Подобное хотелось бы осуществлять в других классах исходных примеров, в которых может быть намного больше методов. Имеется ли автоматизация Log.d или аналогичный инструментарий? Методом trace получается много излишней информации над которой требуются дополнительные манипуляции при изучении. Или trace все же единственный подходящий способ?!


Ответ

Можно воспользоваться Аспектно - Ориентированным Программированием.
Добавить зависимости:
build.gradle
dependencies { ... classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.14' }
app/build.gradle
apply plugin: "android-aspectj" ... dependencies { ... compile 'org.aspectj:aspectjrt:1.8.9' }
Написать аспект:
LogAspect.java
@Aspect public class LogAspect { private static final String TAG = "aspect";
@Before("execution(* *(..)) ") public void doBeforeAyMethod(JoinPoint joinPoint) { if(joinPoint.getTarget() != null) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); Log.i(TAG, joinPoint.getTarget().getClass().getSimpleName() + " : " + method.getName()); } } }
Теперь все методы классов вашего приложения пропишутся в лог. Стоит помнить, что это сработает с методами непосредственно находящимися в классе, методы суперкласса не упадут в лог, только если они будут переопределены.
А если написать свою аннотацию, например:
MethodLog.java
@Target(ElementType.TYPE) public @interface MethodLog { }
Проаннотировать ею нужные классами, и добавить в аспект:
@Before("execution(* *(..)) && @within(MethodLog)")
В лог упадут методы только выбранных классов.

Парсинг всего сайта с помощью Jsoup

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


Ответ

Задачу можно разбить на несколько этапов:
Получаем содержимое страницы и выполняем нужный анализ.
Document doc = Jsoup.connect("http://www.site.com/").get(); processDoc(doc); Находим на текущей странице все ссылки с этим же доменом и добавляем их в очередь, предварительно отфильтровав те ссылки, которые уже были посещены.
Elements links = doc.select("a[href]"); for (Element link : links) { String absLink = link.attr("abs:href"); if (absLink.contains("site.com") && notYetVisited(absLink)) addToQueue(absLink); } Пока очередь еще не пуста, извлекаем очередную ссылку и переходим шагу 1.
Если сайт большой, то необходимо предусмотреть хранение очереди ссылок и списка посещенных ссылок в базе данных. Вот подробный пример с решением похожей задачи.

Проблема с подписью apk файла

Пытаюсь сделать подписанный apk с помощью Build->Generate Signed APK... Но не получается. Причиной тому сия ошибка:

Причем ругается в манифесте, который генерируется при самом билде, то есть не в основном.
В основном манифесте же, конечно всё прописано, и прекрасно работает

Не совсем понятна причина ошибки. Сталкивался кто?


Ответ

Скорее всего @string/google_maps_key" сылается на каталог который в релиз не попадает, к примеру в каталоге debug... Добавьте ссылку на ресурс в каталог проекта main или release

Как правильно задать переменные окружения в Ubuntu? [дубликат]

На данный вопрос уже ответили: Не сохраняются переменные XUBUNTU 3 ответа Здравствуйте,я недавно стал осваивать данную ОС. Если в Windows было понятно, куда прописывать переменные окружения(для java, gradle и ant) то в Ubuntu у меня возникли трудности. В документации анта написано,что надо воспользоваться командой export, однако потом после завершения сеанса, эта переменная слетает. Я так понял, что дабы переменную прописать в env "насовсем" надо ее указать в неком bash. Но я толком не нашел пошаговой инструкции в сети(хотя может неправильно спрашивал гуггл) о том, какую команду написать, чтобы зайти в bash и прописать нужные переменные. Объясните пожалуйста как это сделать?


Ответ

ls ~
Там увидишь либо .bashrc либо .bash_profile Открыть для изменения
nano ~/.bashrc
В конце файла вписать необходимое, например
export DEMO_ENV=success
Нажать ctrl+x затем y и enter После выполнить
source ~/.bashrc

Как грамотно писать программы на JavaFX?

Все началось со Swing. Там вроде все понятно: создаешь классы, делаешь их взаимодействие, вешаешь слушателей на кнопки... Потом я решил быстро переписать программу на JavaFX.
Первом делом прочел 3 главы о JavaFX в книге Шилда "Java 8. Полной руководство". После этого начал читать "introducing javafx 8 programming" того же автора. Показалось, что управлять JavaFX примерно так же, как и Swing. НО... В процессе разработки возникает огромное множество вопросов, которых не было в Swing.
Например, почему в IntelliJ Idea есть пункт создания JavaFX-проекта, если можно любой класс унаследовать от Application ? Как создавать приложения с использованием FXML ? Как связан fxml-файл с моими классами ? Чем собираются JavaFX - приложения ? Стоит ли использовать SceneBuilder ? Как пользоваться MVC моделью ? Что вообще происходит ?
В общем, не смотря на поэму выше, вопрос простой - как правильно начать JavaFX проект и как его строить в дальнейшем, чтобы было минимум проблем ? Есть ли какие-нибудь источники, которые смогут ответить на мои вопросы ?


Ответ

Ну чтож. Я тебе мозги запудрил, я тебе и объясню.
В идее как и во всех нормальных IDE есть заготовки приложений. Да ты можешь наследовать любой класс от Application. Если в заготовке идеи это сделано с основным класом, это еще не запрещает тебе делать по другому. Что из себя представляет приложение с FXML. Его можно сравнить с вебсайтом:
FXML это файл разметки. Там описаны элементы интерфейса: их имена, расположение, первичные настройки, а также имена методов, которые будут вызываться при том или ином действии. Также он привязывается к контроллеру. Это такое связуещее звено между логикой твоего приложения и интерфейсом. Там объявлены объекты элементов интерфейса, с которыми тебе нужно взаимодействовать, а также методы, срабатывающие при работе с твоим интерфейсом (этакие eventHandlerы для кнопок и прочего). При этом тебе не нужно самому инициализировать и настраивать элементы интерфейса в нем. Экземпляр этого класса со всеми привязками и активным наполнением создается при загрузке fxml. Приложения JavaFX собираются так же как и обычные. Внешних костылей не используется, все написано на родном коде и встроено в JDK (начиная с 8) SceneBuilder - визуальный редактор верстки интерфейса. Там ты наглядно видишь, что из себя будет представлять интерфейс приложения. И не надо будет по сотню раз перезапускать приложение, сверяясь, правильно ли ты отверстал таблицу.

Select таблицы с внешним ключем, который может иметь значение NULL

Создаю две таблицы:
CREATE TABLE public.reader_speciality ( speciality_id SMALLSERIAL, value text, CONSTRAINT reader_speciality_pkey PRIMARY KEY (speciality_id) ) WITH ( OIDS=FALSE ); ALTER TABLE public.reader_speciality OWNER TO ""{userID}"";
CREATE TABLE public.readers( reader_id SERIAL NOT NULL, fio text NOT NULL, speciality_id smallint, CONSTRAINT readers_speciality_id_fkey FOREIGN KEY(speciality_id) REFERENCES public.reader_speciality(speciality_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION ) WITH(OIDS= FALSE); ALTER TABLE public.readers OWNER TO ""{userID}"";
readers имеет внешний ключ speciality_id. Добавляю записи:
INSERT INTO reader_speciality (value) VALUES ('Физика'); INSERT INTO reader_speciality (value) VALUES ('Химия'); INSERT INTO readers (fio, speciality_id) VALUES ('Иванов Иван Иванович', 1); INSERT INTO readers (fio) VALUES ('Игорев Игорь Игоревич');
Смотрим (индексы другие, но это не суть):
SELECT * FROM reader_speciality;

SELECT * FROM readers;

Теперь пробую выдать вместо индекса значение внешнего ключа и что-то идёт не так:
SELECT readers.reader_id, readers.fio, reader_speciality.value FROM readers, reader_speciality WHERE (readers.speciality_id = reader_speciality.speciality_id OR readers.speciality_id IS NULL);

Как правильно составить запрос в такой ситуации?


Ответ

SQL всегда пытается для каждой записи из первой таблицы подобрать все записи из второй таблицы. Обычно мы удерживаем его от этого желания задав условие связи двух таблиц. А вот когда срабатывает OR readers.speciality_id IS NULL получается, что условие истинно для любых записей из второй таблицы.
Для таких случаев в SQL служит LEFT JOIN, который подбирает записи если они есть и возвращает запись из первой таблицы даже если во второй ничего нет.
SELECT readers.reader_id, readers.fio, reader_speciality.value FROM readers LEFT JOIN reader_speciality ON readers.speciality_id = reader_speciality.speciality_id

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

Сделал форк, клонировал репозиторий, создал ветку, теперь когда делаю git push на гитХабе, ветка не появляется.
Но после того как сделал git push --all появилась.
Так и должно быть?


Ответ

создавать ветки можно и разными командами и с разными опциями, передаваемыми командам (ещё и нектороые конфигурационные опции влияют на этот процесс. см. man git-config).
если вы создавали ветку командой branch
$ git branch новая-ветка
то вы не переключились на эту ветку, текущей веткой осталась та, что и была до выполнения этой команды. соответственно, командой push (без дополнительных опций/аргументов) вы пытались отправить изменения из текущей ветки, которая, скорее всего, уже имеется в удалённом репозитории. если вы создавали ветку командой checkout с опцией -b
$ git checkout -b новая-ветка
то переключение на новую ветку должно было произойти. но в этом случае команда push (без доп. опций/аргументов) должна была вернуть ошибку вида:
$ git push fatal: The current branch новая-ветка has no upstream branch. To push the current branch and set the remote as upstream, use
git push --set-upstream origin новая-ветка
т.е., потребовалась бы указание дополнительной опции (подсказана прямо в сообщении об ошибке) для привязки новой ветки к одноимённой ветке в удалённом репозитории.
когда же вы выполнили команду push с опцией --all, то, независимо от того, какая ветка была в этот момент текущей, программа git попыталась создать все недостающие в удалённом репозитории ветки и отправить в них локальные изменения. но недостающие привязки (см. пункт 2 выше) в этом случае программа git не создаст: их надо создавать вручную, чтобы впоследстии можно было из новой ветки выполнять команду push без дополнительных опций/аргументов.

Как красиво запустить программу на Python: как убрать окно командной строки?

Всем привет! Не знаю как по другому сформулировать вопрос. Я пишу программку. И тут я решил попробовать запустить ее на других компьютерах. И при запуске (двойной клик по главному файлу) Открывается программа и все хорошо, Но на фоне остается окно командной строки + хотелось бы как нибудь вставить иконку программы на панели пуск. Главное подскажите как убрать окно командной строки. Мне нужен запуск по двойному клику, не обязательно по .exe Неужели обязательно упаковывать cx_freeze?


Ответ

Для винды достаточно поменять расширение файла .py на .pyw — такие файлы запускаются без окна командной строки.

Как связаны между собой сборки и пространства имен?

Как связаны между собой сборки и пространства имен?


Ответ

Сборка Цитата с MSDN (полный текст):
Сборки являются структурными элементами приложений .NET Framework; они составляют основную единицу развертывания, управления версиями, повторного использования, областей действия активации и разрешений безопасности. Сборка представляет собой коллекцию типов и ресурсов, собранных для совместной работы и образующих логическую функциональную единицу. Сборка предоставляет общеязыковой исполняющей среде сведения, необходимые для распознавания реализаций типов. Для среды выполнения тип не существует вне контекста сборки.
Никакого упоминания пространств имен, только типы (классы, структуры и т.д.).
Пространство имен Цитата с MSDN (полный текст):
В программировании на C# пространства имен используются с полной нагрузкой по двум направлениям. Во-первых, платформа .NET Framework использует пространства имен для организации множества классов. Во-вторых, объявление собственного пространства имен поможет в управлении областью действия имен классов и методов в крупных программных проектах.
Опять же никакого упоминания сборок.
тогда я не знаю, такой вопрос в лабораторной
Скорее всего от вас хотят услышать, что перед использованием using SomeNameSpace;, вы должны указать в проекте ссылку на сборку, в которой объявлены типы данного пространства имен. Но это не ни как не влияет на то, что сборки и пространства имен не имеют жесткой связи на уровне языка и платформы. Пространства имен - всего лишь агрегатная приставка к имени типа для явного указания принадлежности типа к определенной группе логически связанных типов, не более того. А вот типы, в отличие от пространств имен, имеют жесткую связь со сборкой в которой находятся, об этом можно подробнее почитать в первой ссылке.

Как задать кодировку при подключении к бд MySQL?

Добрый день, подключаюсь к БД таким образом:
private static final String url = "jdbc:mysql://172.0.0.1/klon";
private static final String user = "root";
private static final String password = "root";
Возник вопрос как можно задать кодировку UTF-8 сразу при подключении то есть сказать MySQL что данные будут поступать на русском?


Ответ

Кодировка задается в URL: jdbc:mysql://172.0.0.1/klon?characterEncoding=utf8

Зачем разработчики придумали фазу всплытия и фазу захвата для событий?

Привет.
Не понимаю насчет того, зачем придумали фазу всплытия и фазу захвата для событий. ранняя модель событий DOM 0 была понятной: щелкнул мышкой на объекте-узле и выполнился какой-то кусок кода (который запихали в функцию). и все. а с этими всплытиями и перехватами мне не понятно, зачем их вообще придумали. какой смысл затрагивать НЕСКОЛЬКО кусков кода (функций-обработчиков) при ОДНОМ событии? какие есть самые простые и хорошо иллюстрирующие примеры применения этого?


Ответ

Самый простой и часто используемый пример - это делегирование событий. Вы устанавливаете один обработчик событий на родительский элемент, а внутри проверяете реальный целевой элемент события и реагируете соответствующим образом.
Это позволяет не только экономить память (один обработчик вместо многих), но и обрабатывать события на динамически создаваемых элементах, не назначая для них обработчик руками.
А вот простой пример использования нескольких обработчиков одного и того же события:
Всплытие – это удобно. Не прекращайте его без явной нужды, очевидной и архитектурно прозрачной. Зачастую прекращение всплытия создаёт свои подводные камни, которые потом приходится обходить. Например: Мы делаем меню. Оно обрабатывает клики на своих элементах и делает для них stopPropagation. Вроде бы, всё работает. Позже мы решили отслеживать все клики в окне, для какой-то своей функциональности, к примеру, для статистики – где вообще у нас кликают люди. Например, Яндекс.Метрика так делает, если включить соответствующую опцию. Над областью, где клики убиваются stopPropagation, статистика работать не будет! Получилась «мёртвая зона». Проблема в том, что stopPropagation убивает всякую возможность отследить событие сверху, а это бывает нужно для реализации чего-нибудь «эдакого», что к меню отношения совсем не имеет.
Источник

Зачем создавать собственные аннотации?

Для чего в java возможно использовать собственную аннотацию? Какое практическое применение возможно для класса, который зааннотирован созданной аннотацией?
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Question { String data(); int data2(); }
@Question(data = "What Next?", data2 = 1) public class MyObj {
private String name; private Integer id;
public MyObj(String name, Integer id) { this.name = name; this.id = id; }
public String getName() { return name; }
@Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof MyObj)) return false;
MyObj myObj = (MyObj) o;
return id.equals(myObj.id);
}
@Override public int hashCode() { return id.hashCode(); } }
Получается, что через рефлексию возможно получение значений, занесенных в аннотацию для конкретного класса.
И какое практическое применение этой информации возможно?


Ответ

На самом деле, применение ограничено только вашей фантазией: в аннотациях можно писать тесты, описывать правила кеширования, валидации или другие параметры объектов, управлять их поведением...
Только нужно понимать, что поскольку вы сами придумываете эти аннотации, инструменты для их обработки тоже нужно будет писать вам.

Правильная реализация экспорта класса из DLL на C++

Пишу на VC++ 2010. Планирую реализовать плагины в виде Dll, в которых будет класс, перегружающий виртуальные методы базового класса. Хочется написать библиотеку с классом, использование которой не будет зависеть от версии компилятора. Погуглил, понял что просто так экспортировать класс не получится. В связи с этим возникли несколько вопросов:
Как правильно реализовать экспорт класса из Dll, чтобы в дальнейшем можно было использовать эту библиотеку с другим компилятором (например в Delphi, ну или хотя бы в другой версии Visual Studio)? Какие ограничения будут для такого класса? Можно ли будет связывать такую dll неявно (на одном из сайтов прочитал, что dll экспортирующие классы невозможно загрузить явно с помощью LoadLibrary)? Имеет ли смысл такая реализации плагина, или же лучше писать простые dll с экспортом функций?
Если не сложно, прошу показать какой-нибудь примитивный пример экспорта следующего класса:
class Sample { private: int field; public: Sample(const int number) { field = number; }
~Sample() {}
virtual int GetField() { return field; } }


Ответ

Под форточкой экспорт класса - это COM API, Он же ActiveX. Жутко монструозная вещь, но она действительно позволит в дальнейшем использовать ваш класс во всех языках с поддержкой COM. Главное ограничение - С++ не имеет стабильного ABI. Отсюда следует, например, что если в DLL выделяется память, освобождать ее нужно в той же самой DLL, иначе - рантаймы подерутся и будут жуткие глюки. Просовывание исключений между DLL - отдельный интересный процесс. DLL "с классами" можно связывать с другим бинарником только явно. Тогда вся забота о связывании ложится на компилятор. При этом, и DLL, и то, куда ее привязывают, должны быть собраны одной и той же версией компилятора с одинаковыми настройками - иначе - возможны глюки. (Например, если программу собрали с динамическим включением рантайма, а DLL - со статическим). Пишите экспорт функций или возьмите технологию плагинов, которую уже кто-то сделал - Qt или COM, например. В противном случае, придется вам зубрить MSDN.

Запрет доступа файлам одного пакета к файлам другого пакета

Здравствуйте, в ходе разработки приложения под андроид возникла следующая проблема:
имеются java файлы которые предназначены для реализации логики для подключения к устройству типа1 они лежат в package Device1 (внутри этого пакета находятся также подпакеты), другие java файлы лежат в package Device2
В каждом пакете (Device1, Device2) имеются java файлы с одинаковым названием например Func. Пакеты Device1, Device2 должны работать не зависимо друг от друга. Т.е. файлы пакета Device1 не могут ссылаться на Func из пакета Device2 и наоборот.
Также есть еще пакет CommonConnection, который реализует первоначальное подключение к пакетам Device1, Device2. В этом случае пакет CommonConnection должен иметь доступ ко все остальным пакетам и Device1 и Device2.
Можно ли как-то запретить файлам из пакета Device1 ссылаться на файлы из пакета Device2 и наоборот, чтобы по ошибке при вводе автодополнения не ввести файл из чужого пакета, при этом чтобы общий пакет CommonConnection имел доступ и к файлам пакета Device1 и к файлам Device2 ?
Заранее благодарю всех за ответы.

Создал модули Device1, Device2, CommonConnection. В build.gradle для CommonConnection ввел зависимости для Device1, Device2 в итоге получил ошибку.


Резюмирую здесь решение моей задачи, возможно кому-то пригодиться в будущем:
1) Создаем 3 моудля CommonConnection, Device1, Device2. Нам необходимо, чтобы файлы в CommonConnection имели доступ в Device1, Device2. А Device1, Device2 были изолированы друг от друга, т.е. файл из Device1 не мог иметь доступ в Device2. 2) После создания модулей необходимо зайти в gradle для Device1 и внести следующие изменения:
**apply plugin: 'com.android.application'**
изменить на apply plugin: 'com.android.library'
И в defaultConfig убрать строку applicationId "com.bignerdranch.android.Device1"

3) Для Device2 нужно сделать тоже самое. 4) В gradle файле для CommonConnection нужно добавить строку compile project(':Device1')

5) Далее нужно явно указать что нужно запускать первоначально именно активити модуля CommonConnection. Нажимаем на Select Run/Debug Configuration и выбираем модуль CommonConnection. Далее еще раз нажимаем на Select Run/Debug Configuration -> EditConfigurations.. ** в меню **Launch Options в строке Activity жмем на ... и выбираем активити для CommonConnection в частности MainActivityCommonConnection

6) Теперь можно запустить проект и проверить.


Ответ

Ну просто не делайте эти классы public и они будут видны только в рамках пакета. А лучше вынесите эти пакеты в разные модули проекта.

Как быстро склеить зависимые записи в одну строку

Допустим, есть 2 таблицы:
1)Должность
2)Персонал, которая ссылается на Должность.
На одну запись Должность могут приходится несколько записей из Персонал.
Задача обновить [Весь персонал] в Должность склеенными в одну строчку зависимыми записями из Персонал.
Допустим приходится на 1 запись приходится 2 строчки ФИО из Персонал, мы их склеиваем и записываем в родительскую запись Должность.
Как это сделать быстро? Используется БД Access.
Сейчас я использую Interop, открываю RecordSet из Должность, и иду сверху вниз, и на каждую запись я открываю второй RecordSet из запроса 'Select PID,FIO From [Персонал] where PID='rst.fields[ID].value и иду сверху вниз и склеиваю значения, а потом возвращаю и обновляю их в первом RecordSet и мне кажется, что слишком это тормознуто и можно как то быстрее сделать это.
Наверное, через ADO.NET было бы быстрее, но мне кажется, что если БД Access будет здоровой, то слишком жирно все в память грузить разом...
UPD: Если все таки загрузить все в память и работать через ADO.NET, я получу значительный выигрыш в скорости?


Ответ

Можно написать VB функцию, которая будет склеивать строку. Подробно можно прочитать тут:
http://hiprog.com/index.php?option=com_content&task=view&id=334&Itemid=35
Тело функции:
Public Function UnionStr1(ID, Fam) Static IDOld, FamUnion If IDOld <> ID Then IDOld = ID FamUnion = Null End If
FamUnion = (FamUnion + ", ") & Fam UnionStr1 = FamUnion End Function
Пример запроса:
Select ID, Last(UnionStr1(ID,Fam)) AS FamUnion FROM Tab1 GROUP BY ID;
В той же статье есть интересный способ. Только средствами ms-access sql, с промежуточной таблицей. Хотя возможно в вашем случае её роль сыграет таблица Person(должностей). Выглядит примерно так:
Метод 3. Заполнение таблицы при помощи запросов (по Митину). http://c85.cemi.rssi.ru/Access/AnsPointDetail.idc?QID=14147
Оригинальный и неочевидный метод. Выполняется с помощью двух запросов. 1. Запись в Tab2 уникальных ID без фамилий. Текст запроса WriteID: INSERT INTO Tab2 (ID) Select DISTINCT ID FROM Tab1;
2. Запись списков фамилий. Текст запроса TabUnion5: UPDATE Tab2 INNER JOIN Tab1 On Tab2.ID = Tab1.ID Set Tab2.FamUnion = ([Tab2].[FamUnion]+", ") & [Tab1].[Fam];
Оценка скорости: по-видимому, работает быстрее метода 1 за счет отсутствия вызова специальных функций. Недостаток: "Однако в T-SQL это непрокатывает" (Митин).
Надо побаловаться, выглядит интересно.
UPD: Смысл в том, что из-за "глупости" ms-access SET будет выполнятся столько раз, сколько записей в присоединённой таблице(не той, которая апдейтится). Из-за "умности" T-SQL, в T-SQL этот способ работать не будет.
К минусам этого способа я бы ещё добавил потребность в сопровождении при переходе на новую версию access. Если MS решат приблизить хоть чуть-чуть ms-access к стандарту ANSI-SQL, этот метод может перестать работать.
С другой стороны, может они и для конкатенации строк что-нибудь сделают:) Хотя в этом вопросе даже MS SQL Server обделён вниманием до сих пор. MySQL, PostgreSQL, Oracle это давно умеют.

SQL команда выборки [дубликат]

На данный вопрос уже ответили: Как выбрать пропущеные ID? 7 ответов Представим, что есть некая таблица Users, в которой есть идентификатор (primary key) с именем id. Но по какой-то причине id были вырваны строки. И получилась такая вот таблица:
id 1,2,3,5,6,7,8,10,12
Вопрос, как получить с использованием только одного select набор, который включает только остутствующие числа. То есть какой сделать sql запрос ?
Задали вопрос на собеседовании, стало очень интересно.


Ответ

Если это не диапозон (как в вашем случае), то задача решается очень тривиально и просто. Достаточно сделать подзапрос в WHERE, где нет следующего значения:
SELECT (`numbers`.`number`+1) AS `not_exists_number` FROM `numbers` WHERE (SELECT 1 FROM `numbers` AS `add_table` WHERE `add_table`.`number` = (`numbers`.`number` + 1)) IS NULL ORDER BY `numbers`.`number`;
Если действительно нужен один SELECT, то данное решение перепишем на JOIN
SELECT l.number + 1 AS missing FROM numbers AS l LEFT JOIN numbers AS r ON l.number + 1 = r.number WHERE r.number IS NULL;
Правда тут проблема в двух решениях, что последнее значение будет всегда больше последнего в таблице на 1, но его можно отсечь. Если у Вас было последнее 26, то он еще 27 выведет, но за-то очень просто :)

Разница между присваиванием this.state.x = 4 и this.setState({x: 4})

Я не понимаю в чем разница между вот этими присваиваниями в React:
this.state.x = 4;
this.setState({ x: 4 })
Так же я не понимаю, почему, когда я присваиваю значение первым способом, то если запустить alert сразу после присваивания, я увижу то значение, которое я только что присвоил. Если же я присвоил значение вторым способом, по alert выведет предыдущее значение этой переменной. Из-за этого была проблема с программой. Я присваивал вторым способом, думал, что в этой же функции уже будет новое значение, а оказалось - нет


Ответ

Первый способ - варварски изменить состояние напрямую, не используя внутренние механизмы оптимизации реакта. Документация большими буквами говорит что так делать не надо и стоит считать стейт иммутабельным.
Второй способ - правильный и делать надо так. Другое дело, что реакт изменяет стейт не сразу, а когда посчитает нужным согласно логике приложения. Если это конфликтует с логикой вашего приложения - значит вы уже чего-то там неправильно сделали, не согласуясь с принципами заложенными в реакт.
Если вам надо что-то делать когда state уже изменился, то setState вторым параметром принимает колбек.

cron и несколько одновременных заданий

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


Ответ

Если задачи описаны в crontab в разных строках то они будут выполнятся независимо друг от друга, в том числе и параллельно, при совпадении времени.
Если надо, что бы две задачи выполнились строго друг за другом то можно написать их в одну строку, разделив точкой с запятой:
01 12 * * * mike task1 parameters; task2 parameters; ...
Кроме того, если к времени своего следующего старта предыдущий экземпляр задачи еще не завершился, крон не будет ничего проверять и запустит вторую копию. Отслеживание параллельного запуска и препятствование этому остается на совести самой выполняемой задачи.

В чем разница между QPushButton и QPushButtonPrivate?

Есть целая серия классов в Qt с постфиксом Private.
В чем разница между ними и обычными классами?


Ответ

Это классы для реализации идиомы PIMPL. Pimpl — Pointer to private implementation. Основная идея этого паттерна — это вынести все приватные члены класса и, в не которых случаях, функционал в приватный класс. Зачем это нужно, можете почитать здесь и здесь

Эмуляция джойстика в linux

Имеется: arduino uno с двумя джойстиками (нативные ардуиновские), которая шлёт данные по usb/serial на мой компьютер с linux, программа, которая читает данные. Эта программа должна эмулировать джойстик. Данные успешно читаются, но как эмуировать джойстик - непонятно.
Какие существуют для этих целей библиотеки/утилиты в linux?


Ответ

Зачем использовать USB/serial? Почему не взять https://github.com/MHeironimus/ArduinoJoystickLibrary и превратить ваш Arduino в полноценное USB HID устройство? В этом случае вам не понадобятся никакие дополнительные программы на вашем linux PC.
Если вы все-таки хотите заниматься извращениями эмуляцией - проще всего это сделать с помощью libsuinput

Размер массива структур

Вот такой код в CodeBlock работает без ошибок
typedef struct exmpl{ int index; char name[50]; int count; } result;
int size; scanf("%d", &size);
result data[size];
Но в Visual Studio выдает ошибки
error C2057: expected constant expression error C2466: cannot allocate an array of constant size 0 error C2133: 'data' : unknown size
Как я понимаю проблема не в IDE а в стандартах С или компиляторах ?


Ответ

Где именно вы объявляете ваш массив?
Если ваш массив объявлен локально, то вы пытаетесь использовать Variable Length Arrays (VLA) - свойство языка С начиная с версии С99. Компилятор MSVC не поддерживает VLA, даже несмотря на то, что в современном MSVC поддержка С99 реализована [почти] полностью. Стандарт С11 сделал VLA опциональным свойством языка, так что возможно мы никогда и не увидим их поддержки в MSVC.
В нелокальных же областях VLA объявляться не может.

Null object reference при перевороте экрана с открытым SearchView

Собственно, суть описана в заголовке: если при открытом SearchView в toolbar'е сменить положение экрана, то приложение крашится с ошибкой:
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.view.MenuItem.collapseActionView()' on a null object reference
Сам метод MenuItemCompat.collapseActionView(searchMenu); написан в
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override public void onPageSelected(int position) { MenuItemCompat.collapseActionView(searchMenu);
... }
});
При этом приложение крашится не всегда, а только если выбрана не дефолтная страница ViewPager'а. Я так понимаю, что это происходит из-за того, что при перевороте экрана срабатывает заново метод onCreate, но onCreateOptionsMenu вызывается позже. Если способы решения проблемы?


Ответ

Да, это происходит из-за того, что вы пытаетесь манипулировать меню до его создания.
Вот вам вариант обхода.
В onPrepareOptionsMenu проверяйте флаг (boolean переменную shouldCollapseActionView класса активити, коей назначайте нужное значение в нужных местах. В вашем случае - вместо MenuItemCompat.collapseActionView(searchMenu); в слушателе смены страницы ViewPager.)
В зависимости от значения флага в onPrepareOptionsMenu раскрывайте/закрывайте searchView
Сразу после изменения значения этой переменной вызовите supportInvalidateOptionsMenu() - это заставит перерисоваться меню, вызвав метод onPrepareOptionsMenu
Так у вас всегда в нужном состоянии будет меню и вы сможете его безопасно менять

Сборщик мусора и метод finalize в Java

Из одной статьи
Сборщик очистит финализированный объект за два шага: в первый выполниться finalize, а во второй соберется.
И так вопросы
Когда сборщик встречает финализированный объект он сначало отправляет его на очередь. И код в методе finalize выполняется уже в очереди. Когда метод выполнится он станет доступен сборщику и уничтожится при следующей сборке. Я правильно понял? Stop the world действует на поток Finalizer?


Ответ

Да, вы правы - после выполнения метода finalize() объект должен быть повторно собран сборщиком мусора (и это считается серьезной проблемой метода finalize() - он мешает сборщику мусора освобождать память).
К слову, не обязательно объект будет доступен для сборки сразу же - метод finalize() может сохранить куда-нибудь ссылку на объект. Подобная ситуация называется "возрождением" объекта и, вообще говоря, считается антипаттерном. Главная проблема такого трюка - в том, что "возродить" объект можно только 1 раз.

Stop the world безусловно действует на поток Finalizer, поскольку это такой же поток как и все остальные.

Шейдеры в unity3d

Рискуя нахватать по шапке, я все таки задам этот вопрос.
Встала необходимость написать шейдер для Unity3d, казалось бы простейший, радиально проявляющееся изображение (как на gif ниже), но с эффектами блюра и градиентной прозрачности. То есть кусок сегмента (например градусов 30), который заполняет изображение - не резко видимый, а с плавным переходом прозрачности (пример на рисунке ниже).
При этом изображение при нулевой прозрачности имеет максимальную заблюренность (хоть на прозрачном и не видно, да и на этом примере не очень понятно, но т.к. при использовании шейдер будет применяться на переходах между фото, то там будет все четко видно) и по мере того, как прозрачность отдельно взятых пикселей уменьшается, уменьшается и степень блюра на них. Таким образом там, где прозрачность 100 (непрозрачный), там блюр = 0.


Прочитав несколько статей все же никак не могу разложить по полочкам это все в голове. Прочитал как именно реализуется размытие по гауссу (усреднение значение rgb ближайших пикселей на спрайте по каждому столбцу/линии), понимаю что к этому необходимо прицепить прозрачность и менять одно в зависимости от другого, но, например, как это все сделать, непосредственно в коде, прицепив еще и анимацию сюда, абсолютно не понимаю (хотя и понимаю что есть св-во _TransVal есть параметр #pragma alpha, который за прозрачность отвечает).
Т.к. писать шейдеры не приходилось ранее и, если честно, те статьи, что нашел в инете, не сильно внесли ясности - именно в вопрос реализации. Cамо понимание что такое шейдер, какие они бывают и зачем - у меня присутствует.
Буду благодарен, если кто-нибудь возьмется поэтапно расписать на примере моей задачи процесс реализации с пояснениями: мол нам нужно это для этого, а это для этого, вот так мы будем изменять блюр, вот так прозрачность, а вот так анимацию присобачим.
UPDATE Чего я смог добиться: Регулируя значения sigma и cutoff собранного мною в бреду непонимания (в силу отсутствия опыта в написании шейдеров) происходит все то что мне необходимо кроме одного НО, спрайт позади всего этого откуда он и как от него избавиться я так и не смог понять.

http://g.recordit.co/rUaGYdynQ3.gif (картинка в большем разрешении).
Данный материал (с шейдером) применен на image. image и canvas в котором они находятся вынесены на слой transparentfx который рендерит отдельная камера (на основной отключен этот слой). Осталось понять как отключить (или убрать из рендера) этот спрайт позади и в минимальном виде задача будет решена (прозрачность на краю заполнения уже не суть важно хотя бы с блюром разобраться).
UPDATE 2 задача решается если выставить на самом Image type filled и крутить ручку fill amount. Но остается непонятным, как по-человечески отключить рендер image'a, оставив рендер только того, что есть.
Результат работы шейдера:

UPDATE от 29 декабря Поняв что с написанием по человечески у меня все не очень, я попробовал использовать Shader Forge и в нем вроде бы добился необходимого эффекта (одного из необходимых). Но получилось очень странно, в том смысле что в окне инспектора в юнити эффект отображался как надо а в сцене гейм он вел себя "упрощенно" так сказать. Смотри гиф ниже для лучшего понимания. Гиф1, окно инспектора. Гиф2, окно игры


Ответ

А стоит все это через единый шейдер городить? Делал бы так:
Чтобы использовать разблуреное изображение вам понадобиться еще одна камера которая через постэффект BLUR будет писать в RenderTexture экран без накладываемого изображения(поместите его в отдельный Layer и в этой камере этот слой выключите). Далее делаем анимацию проявления любой формы которая вас интересует. Cделайте форму с анимированием маски по альфе. А дальше уже все просто, для анимированной формы используем простейший материал который в зависимости от прозрачности текстуры на материале рисует через смешение либо с основной текстуры либо с размытой в RenderTexture.

Узнать из метода, какой поток в него заходит

Допустим есть некоторый метод класса. Можно ли прямо из кода этого метода узнать, какой поток в него заходит?
Интересуют именно программные средства, а не отладочный threaddump среды разработки.


Ответ

Да, можно.
Для того чтобы получить текущий поток, достаточно вызвать статический метод currentThread() класса Thread. Например, код:
Thread currentThread = Thread.currentThread(); System.out.println(currentThread.getName()); System.out.println(currentThread.getPriority());
Выведет на консоль название текущего потока и его приоритет.

Как лучше привести к типу float?

Что лучше: -float(x) или float(-x), где x имеет тип unsigned short?


Ответ

Для unsigned short не имеет значения(при sizeof(short) < sizeof(int)), т.к. Ваше выражение float(-x) сначала приведёт x к int, сделает его отрицательным, а потом приведёт к float — никаких проблем.
Проблемы начнутся, если у вас тип unsigned int и «выше» — в этом случае вариант с float(-x) даст не то, что Вы ожидаете, т.к. сначала будет посчитан новый x исходя из формулы 2^n - x, а потом это будет преобразовано во float; где n это разрядность исходного типа(в нашем случае int).
Поэтому, во избежание проблем, лучше всегда придерживаться первого варианта(-float(x)), как наиболее безопасного и лучше отражающего намерение.

Получить уже написанный текст в консоль c#

Добрый день. Имеется такая проблема: Пишу консольный чат. Однако есть один неприятный баг: если пользователь пишет сообщение и в этот момент придет сообщение - то уже введенные данные затрутся. Клиент ожидает ввод функцией Console.ReadLine. Вопрос такой: с помощью чего можно получить уже введенные данные и как их вернуть обратно? P.S. Сообщения приходят из одного потока, а функция ввода работает в другом потоке


Ответ

Если использовать обычный построчный ввод/вывод в консоли, то никак.
Но решение есть. Вам придётся самостоятельно управлять положением курсора и позициями для ввода и вывода.
Самый простой вариант - выводить сообщения в верхних строках видимой части буфера консоли, а ввод текста - в нижней.

Как обещал, дополняю подробностями реализации.
Для управления положением курсора в консоли понадобится метод Console.SetCursorPosition(x,y). По умолчанию отображаемый размер экрана консоли 80х25 символов. Но это можно настроить. Правда есть один нюанс: увеличить размер можно на ходу, в любой момент работы программы, а уменьшить только системными настройками консоли перед запуском программы; при этом изменения сделанные по ходу выполнения программы не запоминаются после ее завершения. Система координат стандартная - левый верхний угол имеет координаты (0,0).
Также придется отказаться от Console.Read/Readline в пользу Console.ReadKey(true) для отключения эхо-вывода введенных символов.
Теперь нужно организовать два буфера вывода, один для входящих сообщений, другой для набираемых пользователем, да, вывод того что ввел пользователь делаем тоже руками. Размеры буферов вычисляем так, чтобы при выводе в консоль стандартным Console.Write/WriteLine выведенные строки в окне консоли не перемешались. Буфер создаем на основе StringBuilder с явным указанием размера. Если выводимый текст меньше буфера - дополняем пробелами, чтобы при выводе затереть предыдущий вывод.
Получение сообщений выполняем в отдельный буфер из которого и заполняем буфер вывода последними принятыми сообщениями.
Дальше все достаточно просто, когда поступает новое сообщение ставим курсор в положение (0,0) и выводим полученные сообщения, если пользователь начал набирать сообщение - выводим его текст по мере набора в нижней части экрана, например в положение (0,20). Основной цикл программы сводится к двум действиям - вывод полученных сообщений, если таковые были, и вывод введенного пользователем символа, если пользователь его ввел. В случае много-поточного решения, можно ограничиться проверкой флагов о необходимости вывода и выводу.
В принципе, при определенной доле упорства, можно организовать и сколлинг полученных сообщений, мы же руками обрабатываем нажатые клавиши, так что все в ваших руках.
В целом этой концепции вполне достаточно для реализации в коде, примеры отдельных действий несложно найти в MSDN в описании класса Console

Анимация “конверт”

Как сделать подобное на jQuery/JavaScript/CSS
Есть ромб, разделенный условно на четыре части и при наведении на него мышкой эти четыре части раскрываются в квадрат, т.е весь ромб превращается в квадрат, т.е типо как открытие конверта, только с четырех сторон. Внутри которого скрытый текст


Ответ

Вот пример реализации на css
Сейчас конверт открывается при наведении, но с помощью JavaScript (и минимум изменений в css) можно навесить обработчик, который будет открывать конверт при клике.
body { margin: 70px; background: #f7f7f7; } .envelope { position: relative; background: #082cde; width: 80px; height: 80px; text-align: center; line-height: 80px; } .envelope:hover .part1, .envelope:hover .part3 { -webkit-transform: rotateX(-180deg); transform: rotateX(-180deg); } .envelope:hover .part2, .envelope:hover .part4 { -webkit-transform: rotateY(-180deg); transform: rotateY(-180deg); } .envelope:hover .part1 { border-bottom-color: #082cde; } .envelope:hover .part2 { border-left-color: #082cde; } .envelope:hover .part3 { border-top-color: #082cde; } .envelope:hover .part4 { border-right-color: #082cde; } .envelope:hover .envelope__cover { display: inline-block; } .envelope .envelope__cover { -webkit-transition: all 0.5s linear; transition: all 0.5s linear; color: white; vertical-align: middle; line-height: normal; display: none; } .envelope .envelope__part { width: 0; height: 0; border: 40px solid transparent; -webkit-transition: all 0.5s ease; transition: all 0.5s ease; position: absolute; } .envelope .part1 { border-bottom-color: #1d40ef; -webkit-transform-origin: bottom; -ms-transform-origin: bottom; transform-origin: bottom; } .envelope .part2 { border-left-color: #1d40ef; -webkit-transform-origin: left; -ms-transform-origin: left; transform-origin: left; } .envelope .part3 { border-top-color: #1d40ef; -webkit-transform-origin: top; -ms-transform-origin: top; transform-origin: top; } .envelope .part4 { border-right-color: #1d40ef; -webkit-transform-origin: right; -ms-transform-origin: right; transform-origin: right; }

Inner content

Из интересного: каждая из четырех частей (которые открываются) являются простыми div, у который высота и ширина равны 0, но задан border c соответствующим цветом границы (например, для нижней грани - border-bottom-color), который позволяет отображать блок в виде треугольника.

Для поворота на 180 градусов использовал transform: rotateX() и `transform: rotateY(), а чтобы поворот был относительно нужной грани (например, для нижнего треугольника, относительно его нижней стороны) - transform-origin

Исходники SCSS
$outerColor: #1d40ef; $innerColor: #082cde; $envelopeSizePx: 80;
body { margin: 70px; }
.envelope { position: relative; background: $innerColor; width: $envelopeSizePx+px; height: $envelopeSizePx+px; text-align: center; line-height: $envelopeSizePx+px;
&:hover { .part1, .part3 { transform: rotateX(-180deg); } .part2, .part4 { transform: rotateY(-180deg); } .part1 { border-bottom-color: $innerColor; } .part2 { border-left-color: $innerColor; } .part3 { border-top-color: $innerColor; } .part4 { border-right-color: $innerColor; } .envelope__cover { display: inline-block; } } .envelope__cover { color: white; vertical-align: middle; line-height: normal; display: none; } .envelope__part { width: 0; height: 0; border: $envelopeSizePx/2+px solid transparent; transition: all 0.5s ease; position: absolute; } .part1 { border-bottom-color: $outerColor; transform-origin: bottom; } .part2 { border-left-color: $outerColor; transform-origin: left; } .part3 { border-top-color: $outerColor; transform-origin: top; } .part4 { border-right-color: $outerColor; transform-origin: right; } }

Как наложить на вариардик ограничение по принимаемым типам?

Пусть есть такая конструкция:
template class SomeClass { template SomeClass(Args& ...args) {} };
Каким образом можно "уговорить" компилятор принимать в пакет только одинаковые типы, и как указать конкретный тип (пусть, например, double)?


Ответ

Вопрос решен
Помогло чтение "Язык программирования С++. Лекции и упражнения. 6-е издание, 2012 год, Сивен Пратта".
Методика, как оказалось, незатейлива - рекурсивная распаковка и чек каждого аргумента пака. Получилось два варианта, но со static_assert'ом, имхо, лучше - более осмысленный вывод. В качестве эксперимента проверяем агрументы на соответствие std::size_t.
Вариант 1 (static_assert):
#include #include #include
//////////////////////////////////////////////////////////////////// // Пример проверки передачи беззнаковых аргументов в конструктор // Вариант 1 (используем static_assert) ////////////////////////////////////////////////////////////////////
template class SomeClass { public: template SomeClass(const Args& ...args) { UnPack(args... ); } private: template void UnPack(const First& F, const Last&... L) { UnPack(F); UnPack(L...); } template void UnPack(const First& Value) { static_assert(std::is_same::value,"Type mismatch!"); std::cout << Value << ":"; } };
int main() {
// норм - передаётся нужный тип std::size_t i=1,j=2,k=3; SomeClass S1(i,j,k);
// норм - передаются беззнаковые константы SomeClass S2(1u,2u,3u);
// фэйл - знаковые типы не проходят // int a=1,b=2,c=3; // SomeClass S3(a,b,c);
return 0; }
Вариант 2 (std::enable_if):
#include #include #include
//////////////////////////////////////////////////////////////////// // Пример проверки передачи беззнаковых аргументов в конструктор // Вариант 2 (используем std::enable_if) ////////////////////////////////////////////////////////////////////
template class SomeClass { public: template SomeClass(const Args& ...args) { UnPack(args... ); } private: template void UnPack(const First& F, const Last&... L) { UnPack(F); UnPack(L...); } template void UnPack(const First& Value, typename std::enable_if::value>::type* = 0) { std::cout << Value << ":"; } };
int main() {
// норм - передаётся нужный тип std::size_t i=1,j=2,k=3; SomeClass S1(i,j,k);
// норм - передаются беззнаковые константы SomeClass S2(1u,2u,3u);
// фэйл - знаковые типы не проходят // int a=1,b=2,c=3; // SomeClass S3(a,b,c);
return 0; }
В принципе, вопрос решен. Однако, если будут более изящные варианты - вэлкомъ! :)

Пример по многопоточности

Поясните, пожалуйста, где я могу быть не прав.
1. Главный поток main запускает два потока: t1, t2.
2. Поток main останавливается и ждет завершения потоков t1 и t2 так как вызваны методы t1.join и t2.join
3. Первый поток t1 несколько раз засыпает при выполнении, но второй не может начать выполнения метода writing, так как он synchronized. В результате после работы первого потока в файле имеем запись: First0->0 First1->1 First2->2 First3->3 First4->4
4. После окончания первого потока, второй делает тоже самое.
5. Два потока завершены, поток main завершает выполнение.
В результате в файле мы можем иметь только запись вида: First0->0 First1->1 First2->2 First3->3 First4->4 Second0->0 Second1->1 Second2->2 Second3->3 Second4->4 Но в учебнике приводиться другой результат. Как такое возможно?
import java.io.FileWriter; import java.io.IOException;
/** * Created by IP44 on 25.11.2016. */ class Synchro { private FileWriter fileWriter;
public Synchro(String file) throws IOException { fileWriter = new FileWriter(file, true); } public void close() { try { fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } } public synchronized void writing(String str, int i) { try { System.out.print(str + i); fileWriter.append(str + i); Thread.sleep((long)(Math.random() * 50)); System.out.print("->" + i + " "); fileWriter.append("->" + i + " "); } catch (Exception e) { System.err.print("Error of stream"); e.printStackTrace(); } } }
class MyThread extends Thread { private Synchro s;
public MyThread(String str, Synchro s) { super(str); this.s = s; } public void run() { for (int i = 0; i < 5; i++) { s.writing(getName(), i); } } }
public class SynchroThreads { public static void main(String[] args) { try { Synchro s = new Synchro("C:\\Users\\IP44\\Downloads\\data.txt");
MyThread t1 = new MyThread("First", s); MyThread t2 = new MyThread("Second", s); t1.start(); t2.start(); t1.join(); t2.join(); s.close();
} catch (Exception ex) { ex.printStackTrace(); } } }


Ответ

Только метод write помечен как synchronized, но не метод run, в котором находится цикл. Так что порядок выводв может быть любой. Это можно явно увидеть, если добавить немного ожидания в сам run - если бы порядок был задан блокировками, он бы не поменялся.
http://ideone.com/joXG0N
public void run() { try { for (int i = 0; i < 5; i++) { s.writing(getName(), i); Thread.sleep((long)(Math.random() * 50)); } } catch (Exception ex) { ex.printStackTrace(); } }

First0->0 Second0->0 First1->1 Second1->1 First2->2 Second2->2 First3->3 Second3->3 First4->4 Second4->4
Но в учебнике приводиться другой результат.
Там не об этом. Там о том, что
System.out.print(str + i); fileWriter.append(str + i); Thread.sleep((long)(Math.random() * 50)); // <-- В этом месте System.out.print("->" + i + " "); fileWriter.append("->" + i + " ");
даже несмотря на sleep переключения на другой write не будет. Т. е. мы никогда не увидим такого:
First->Second->0->0

Конструирование без инициализации

Вопрос к гуру по стандартам C++ - что нынешний стандарт говорит о таком коде, вполне компилируемом и VC++, и GCC
#include #include
using namespace std;
class Test { public: Test() { cout << "Test()" << endl; } Test(int x):val_(x){ cout << "Test(" << x << ")" << endl; } Test(const Test& t):val_(t.val_) { cout << "Test(const Test& " << t.val_ << ")" << endl; } Test& operator = (const Test& t) { cout << "Test& operator = (const Test& " << t.val_ <<")" << endl; val_ = t.val_; return *this;} ~Test() { cout << "~Test()" << endl; } int val() const { return val_; } private: int val_ = 0; };
int main(int argc, const char * argv[]) { Test t = t; cout << t.val() << endl; }
Получается, что мы по сути создаем объект без инициализации полей, выполняя только копирование объекта в самого себя, т.е. мусора на свое же место?


Ответ

Такое объявление имеет неопределенное поведение.
Рассмотрите программу
struct A { A() : n(0), p(nullptr) {}
A(const A &a) : n(a.n), p(new int[n]) { for (size_t i = 0; i < n; i++) this->p[i] = a.p[i]; // std::copy(a.p, a.p + n, this->p); }
~A() { delete[] p; }
size_t n; int *p; };
int main() { A a = a; }
Так ни значение n , ни значение p не были инициализированы, а при этом вызывается конструктор копирования, копирующий объект в сам себя, то будет иметь место попытка выделения динамически памяти для массива неопределенного размера и обращение по адресу, который имеет неопределенное значение.
В стандарте C++ написано (12.7 Construction and destruction)
1 For an object with a non-trivial constructor, referring to any non-static member or base class of the object before the constructor begins execution results in undefined behavior.
В стандарте C, который является нормативным документом также для стандарта C++ также упоминается, что (6.2.6 Representations of types)
5 Certain object representations need not represent a value of the object type. If the stored value of an object has such a representation and is read by an lvalue expression that does ot have character type, the behavior is undefined. If such a representation is produced by a side effect that modifies all or any part of the object by an lvalue expression that does not have character type, the behavior is undefined.50) Such a representation is called a trap representation.
В приведенном примере выше, члены класса используются до вызова конструктора, так как они не были инициализированы конструктором, когда идет обращение к ним в конструкторе копирования, чтобы их значения использовать для инициализации создаваемых членов класса нового объекта. Кроме того эти члены класса могут иметь так-называемые trap-представления.

Корректировка sql запроса

Получил на собеседовании задание по sql:
Получить имя и количество раз, сколько оно повторялось, но вывести только те имена, которые повторялись больше 2-х раз - сортировка по количеству повторений, от большего до меньшего.
Моим решением было:
select name, count(name) from table group by name having count(name) > 2 order by count(name) desc;
фидбек интервьюера был таким: запрос "почти" правильный
Может кто-то подсказать, как его надо поменять или улучшить?


Ответ

ORDER BY выполняется после SELECT, поэтому count(name) в нем ИМХО лишний:
select name, count(name) AS num from table group by name having count(name) > 2 order by num desc;
Кроме того безымянное поле count(name) выглядит не очень красиво. Может быть еще и поэтому "почти" правильно?

Замена exe файла при работающем приложении (Автообновление)

Доброго времени суток.
Есть работающее приложение myapp.exe которое качает с сервера новую версию и кладет рядом с myapp.exe под именем. myapp.update .
Каким способом можно подменить myapp.exe на новый myapp.exe?
Попытался сделать дополнительный проект.
В конце главный проект выполняет
Updater.MainWindow update = new Updater.MainWindow(); update.Show(); System.Diagnostics.Process.GetCurrentProcess().Kill();
Но окно главного проекта остается открытым но во фризе.
Проект в котором прописан Update не появляться вплоть до последнего действия и тут же закрывается
public MainWindow() { InitializeComponent(); Thread.Sleep(5000); UpdateNow(); }
public void UpdateNow() { bool oldapp = false; bool newapp = false; Changes.Content = "Идет проверка целостности файлов...";
string path = System.IO.Directory.GetCurrentDirectory();
string[] allFoundFiles = Directory.GetFiles(path, "myapp.exe"); foreach (string file in allFoundFiles) { oldapp = true; }
string[] allFoundFiles1 = Directory.GetFiles(path, "myapp.update"); foreach (string file in allFoundFiles) { newapp = true; }
if (oldapp == true && newapp == true) { Changes.Content = "Все файлы на месте. Идет применение настроек..."; Thread.Sleep(5000); try { FileInfo fi1 = new FileInfo(path + @"\myapp.exe"); fi1.Delete(); } catch (Exception ex) { Changes.Content = ex.ToString(); } try { System.IO.File.Move(path + @"\myapp.update", path + @"\myapp.exe"); Changes.Content = "Все готово к работе :)"; System.Diagnostics.Process.Start(path + @"/myapp.exe"); } catch (Exception ex) { Changes.Content = ex.ToString(); }
} else { Changes.Content = "Что - то не так"; } } }
Мало того что Update не дает признаков жизни. Появляется ошибка "Отказано в доступе " при удалении старого myapp.exe . И почему то закрывается само по себе.


Ответ

Например, вы можете написать маленькое приложение, которое скопирует myapp.update в myapp, и запустить его перед выходом из основного приложения. Вспомогательное приложение пускай дождётся, пока основное завершит работу, и потом уже переносит.

Как правильно остановить Thread?

Язык C#, Visual Studio 2013. Скажите пожалуйста, как в консольном приложении обработать нажатия клавиши, чтобы остановить работающий Thread? Не могу найти класса с соответствующим событием, именно, для консольного приложения.


Ответ

Никак. Thread должен сотрудничать, и сам останавливаться, когда его попросят.
Например, при помощи разделяемой переменной (но не забудьте о синхронизации при помощи lock):
object mutex = new object(); bool stop = false;
var t = new Thread(() => { int i = 0; while (true) { Thread.Sleep(500); // тут сделать что-то полезное, например: Console.WriteLine(i++); // проверка на выход lock (mutex) { if (stop) break; } } }); t.Start();
Console.ReadKey(); lock (mutex) stop = true; t.Join();

Вот вам более современный метод, без Thread и Sleep, через Task и CancellationToken
static void Main(string[] args) { CancellationTokenSource cts = new CancellationTokenSource();
var task = Task.Run(() => Work(cts.Token));
Console.ReadKey(); cts.Cancel(); task.Wait(); // для асинхронной функции тут лучше await task }
static async Task Work(CancellationToken ct) { try { int i = 0; while (!ct.IsCancellationRequested) { await Task.Delay(500, ct); Console.WriteLine(i++); // после длинных операций внутри цикла имеет смысл вставлять //if (ct.IsCancellationRequested) // return; } } catch (OperationCanceledException ex) { // нас останавливают, выходим } }
CancellationToken — это правильный метод передавать сообщения о завершении, используйте его по возможности.

Спасибо @rdorn и @Pavel Mayorov за подсказки в комментариях, которые помогли значительно улучшить ответ.

Можно ли определить переменную не указывая её тип, даже auto?

Можно ли в C++ определить переменную, не указывая явно её тип (даже auto)?


Ответ

Такая возможность есть, по-крайней мере, в области захвата лямбда-функции (c++14). Отсутствие типа в данном контексте воспринимается так же как если бы переменная была объявлена с типом auto в локальном контексте. Пример:
#include #include
int main() {
int x = 42; const std::string s = "now";
auto f = [&r = x, c = "text", s = s]() mutable { r = 100500; s[0] = 'w'; std::cout << s << "
"; };
std::cout << x << "
"; f();
std::cout << x << "
"; std::cout << s << "
"; }
Здесь r имеет тип int&, c - const char*, s (внутри тела лямбды) - std::string.
Вывод:
42 wow 100500 now

Как выделить содержимое div и скопировать содержимое в буфер обмена?

Как с помощью jQuery по клику выделить содержимое div?
И второй вопрос: как при этом скопировать содержимое в буфер обмена?


Ответ

Код взят отсюда
function selectText(elementId) { var doc = document, text = doc.getElementById(elementId), range, selection; if (doc.body.createTextRange) { range = document.body.createTextRange(); range.moveToElementText(text); range.select(); } else if (window.getSelection) { selection = window.getSelection(); range = document.createRange(); range.selectNodeContents(text); selection.removeAllRanges(); selection.addRange(range); } } $("#text").click(function() { selectText(this.id); document.execCommand("copy"); });

This is text this is another text