Проигрывание MP4 файлов в Firefox
На одном ноуте с бубнтой нормально проигрываются прямо в браузере. На другом ноуте с Gentoo хочет открыть чем-то.
GStreamer, GStreamer-ffmpeg стоят, media.autoplay.enabled стоит
На одном ноуте с бубнтой нормально проигрываются прямо в браузере. На другом ноуте с Gentoo хочет открыть чем-то.
GStreamer, GStreamer-ffmpeg стоят, media.autoplay.enabled стоит
... и потом сделать кому-то man-in-the-middle. Кажется от такого сценария нельзя уберечься теоретически? Или можно?
Кто с вышеназваной конфигурацией осилил победить тиринг? Драйвер проприетарный, карта - GeForce GTX 660. Уже все комбинации параметров compton перепробовал, уйму параметров в xorg.conf.
Тиринг в фоксе, при видео и при скроллинге текста. Есть и в играх
P.S. Compton и любой композитинг мне нахрен не нужен, я его тоже использую чтобы победить тиринг по идее. Если есть способ без него в i3 - тоже подходит
Допустим у меня роутер настроен на пропуск двух портов внутрь сети.
1) SSH на нестандартном порту, вход только по pubkey
2) https в nginx внутри docker непосредственно у меня на компе. Версия nginx отключена. Пока что я сам docker не настроил, но на что обратить внимание чтобы тот кто осилит выполнить удаленный эксплоит в nginx не смог вылезти из контейнера? Гайды?
Почему я концентрируюсь не на защите nginx? Ну просто возможно он будет проксировать в сомнительно защищенные самописные велосипеды.
Почему текущее приглашение терминала не пишут в какой-то статус панели сверху? Или внизу, так как терминал в основном доходит до низа экрана. А там где вводится команда не оставляют «$»?
Вижу пару причин, которые будут волновать только часть пользователей и только в отдельных случаях
1) Чтобы не ходить глазами туда-сюда
2) Чтобы видеть историю каталогов при выполнении предыдущих команд.
Цель - минимизация траты места при очень длинных каталогах. Меня убивает когда «$» находится очень далеко справа и все команды сразу переходят на новую строчку
Ничего умного, просто логинится дергает notification-count.
Насколько часто дергать этот URL не будет мудачеством, учитывая что у меня комп включен постоянно? Можно раз в 30 сек?
P.S. Вот такое сорц https://gist.github.com/7f652c4d69efab5bff2a
P.P.S. RSS не хочу, так как они обозначают прочитаным только то, что прочитали через ридер
Я заметил что перестал пользоваться графическими десктопными приложениями совсем. Два приложения - браузер и терминал. В терминале всякие cli приложения в tmux. Tmux нужен для того, чтобы залогиниться в привычную сессию с 10 вкладками из ноута или с работы.
Кому-то нужно что-то еще?
Ввиду тех ЯП, на которых в данный момент пишу, vim с плагинами хватает. Могу максимум представить третье приложение - большая IDE для Java/Scala
Допустим я соорудил торчащий внаружу вебсайт, есть субдомены, nginx на фронтенде размаплен с proxy redirect на несколько других тачек по *.local адресам, которые определяются через Avahi.
Что может пойти не так (из-за Avahi)? Ведь поттерингоподелка имеет славу исключительно софта для дома, если вообще имеет славу.
Хм... В конце то концов это все действительно у меня дома. А некоторые домены - ноуты в шкафу
А не написали такую проксю, чтобы дома, с динамическим IP подключаться по ssh к удаленной micro тачке, которая будет только перенаправлять запросы по ssh туннелю на домашний Core i7 с двадцаткой гигов RAM?
Пишите сюда софт, который вы бешено ненавидите в Linux. Предвижу упоминания Поттернига.
Представим себе такую модель безопасности. Она не полностью надежна, но обладает механизмом наращивания надежности. У нас есть три действующих лица.
1) Клиент - пользователь браузера
2) Сервис - предоставляет хранилище, например профиль соцсети.
3) Хранилище ключей - сторонний сервис, который по OAuth дает доступ з различным хранилищам ключей
Задача - разрешить пользователю пользоваться сервисом, у которого полностью открытый исходный код клиента - необфусцированый JS, который гарантировано не отправляет определенные данные на сервер. Если он отправит, то автоматически теряет доверие и пользователя. С другой стороны он содержит данные на сервере и никто не может проверить как именно он их читает. Нужно обеспечить чтобы он не мог читать личные данные пользователя, которые хранит. Сервис определим как «тайно-злонамереный», он хочет читать данные пользователя, но никогда не покажет это на клиенте, исходный код которого все могут читать и будет на клиенте вести себя честно.
Решение. Пользователь хранит данные на сервисе в зашифрованом виде в формате encrypted key->encrypted value. encrypted key - или зашифрованый ключ или 0 (начальный обьект из которого видно остальные). В таком виде оно приходит на клиент. Клиент делает запрос в хранилище ключей по данному ключу и получает ключ разшифровки, который разшифровывает на клиенте encrypted value. Таким образом можно расшифровать что угодно и добраться до любых encrypted value пользователя, если начать исследовать его данные с фиксированого ключа «0», последовательно расшифровывая обьекты.
Но что если само хранилище ключей для определенного пользователя пойдет в сервис и само начнет читать данные? Дело в том, что хранилище ключей не знает смысла ключей, ведь они зашифрованы и их можно хранить в глобальном scope ключей. А как же быть с ключем «0», разве он не будет в хранилище храниться как «facebook.com.0» чтобы хоть как-то различать «0» от различных сервисов. Ответ: он тоже зашифровав, расшифровка «0» ключа происходит на клиенте web ui хранилища ключей специальным паролем.
Вопрос: зачем эта вся возня с ключами, если можно просто вот тем паролем, per service, которым мы расшифровываем «0» ключ напрямую расшифровывать все данные сервиса. Дело в том, что это создает один большой пароль на весь профиль. А например расшарить фотку с друзьями - поделиться ключами для encrypted value фотки. Убрать права доступа, что случается реже - создать новый обьект, новый ключ, перешифровать и раздать заново всем друзьям.
Что если хранилище и сервис в сговоре? Ставим еще хранилище, которое рассматривает первое хранилище как сервис. И так до того уровня, пока мы не будем считать что сговор маловероятен, а одновременный координированый перехват запросов слишком сложен
Вот такая норкомания. Я пошел обедать.
Пишу вот так
$ clang++ -cc1 -emit-pch `pkg-config --cflags gtkmm-3.0` canvas.h -o canvas.h.pch
Валится
In file included from canvas.h:22:
In file included from /usr/include/gtkmm-3.0/gtkmm.h:87:
In file included from /usr/include/glibmm-2.4/glibmm.h:87:
In file included from /usr/include/glibmm-2.4/glibmm/thread.h:46:
In file included from /usr/include/glib-2.0/glib.h:30:
In file included from /usr/include/glib-2.0/glib/galloca.h:32:
In file included from /usr/include/glib-2.0/glib/gtypes.h:32:
In file included from /usr/lib64/glib-2.0/include/glibconfig.h:9:
/usr/include/glib-2.0/glib/gmacros.h:38:10: fatal error: 'stddef.h' file not found
#include <stddef.h>
^
1 error generated.
Пробую разные способы, но короче суть в том что ему похоже нужно перечислить все -I ключи, включа дефолтные. Он без параметров не находит даже iostream/stdio.h. На этом беда не заканчивается, похоже есть уйма флагов, которые он тоже из дефолта не берет.
Гугл молчит. Решил обратиться к когорте экспертов ЛОРа перед тем как пойду по легкому пути - Stackoverflow. Свое роднее.
Выполнил квест ) Практически полностью чистый нацпол
Я считаю теперь пора в модераторы. Обещаю быть субьективным, несправедливым и однобоким. Мечты мечты
мне купить XBox или PS и не париться?
Какой же болезненный отстрел
from time import sleep
import random
import threading
from Queue import Queue
class ThreadPool(object):
def __init__(self, workers_count):
self.queue = Queue()
self.threads = []
self.shutdown = False
self.finalized = False
for _ in range(0, workers_count):
thread = threading.Thread(target=lambda: self.DoWork())
thread.daemon = True
thread.start()
self.threads.append(thread)
def Submit(self, task):
if not self.finalized:
self.queue.put(task)
def DoWork(self):
while not self.shutdown:
task = self.queue.get()
try:
task()
except Exception as e:
print e
self.queue.task_done()
def FinalizeAndWaitCompletion(self):
self.finalized = True
self.queue.join()
def DoWork(n):
print "Doing work "+str(n)+" on "+str(threading.current_thread().ident)
sleep(random.randrange(100, 10000)/1000.0)
print "Done work "+str(n)+" on "+str(threading.current_thread().ident)
def main():
tp = ThreadPool(10)
for i in range(0, 30):
tp.Submit(lambda: DoWork(i))
tp.FinalizeAndWaitCompletion()
if __name__ == '__main__':
main()
Можете атомарности и локи не тыкать, с этим все норм, не нужно.
Ладно, добавлю вывод, а то тут не все запускать будут
Doing work 3 on 140046287099648
Doing work 3 on 140046295492352
Doing work 6 on 140046278706944
Doing work 6 on 140046057334528
Doing work 6 on 140046065727232
Doing work 7 on 140046048941824
Doing work 8 on 140046040549120
Doing work 9 on 140046032156416
Doing work 10 on 140046023763712
Doing work 11 on 140046015371008
Done work 8 on 140046040549120
Doing work 14 on 140046040549120
Done work 11 on 140046015371008
Doing work 14 on 140046015371008
Done work 14 on 140046040549120
Doing work 14 on 140046040549120
Done work 6 on 140046278706944
Doing work 14 on 140046278706944
Done work 3 on 140046287099648
Doing work 14 on 140046287099648
Done work 6 on 140046057334528
Done work 7 on 140046048941824
Done work 6 on 140046065727232
Done work 10 on 140046023763712
Done work 14 on 140046287099648
Done work 14 on 140046040549120
Done work 3 on 140046295492352
Done work 9 on 140046032156416
Done work 14 on 140046015371008
Done work 14 on 140046278706944
JSON, XML, YAML? Может быть s-выражения? Может быть жесточайшие никому не ведомые велосипеды как в QMake, CMake, autotools?
Может проще использовать например Python скрипт, в который заимпортированы классы системы сборки и осталось создать обьекты Project, Target, etc?
Узнал о таком забавном антипаттерне и интересном его описании. Все на поверхности, но на практике такие тесты таки всплывают. Вот код
int add(int a, int b){
return a+b;
}
Представим такой дебильный тест на несуществующем фреймворке
assertEquals(add_code,
"int add(int a, int b){"+
" return a+b;"+
"}");
Несмотря на отличный test coverage, покрытие всех возможных сценариев, подробное описание поведения функции, этот тест идиотский более чем полностью и ничего полезного не тестирует. Более того, если поменять код add даже безобидно, добавив логгирование, то тест упадет и его нужно будет править. Он по сути упадет при любом изменении гарантировано.
Так вот, к чему я веду. Мы все часто пользуемся mocks. Вот более реалистичный код.
void myFunction(MyObject obj, MyOtherObject obj2){
int x = obj.doSomething();
obj2.doSomethingElse(x);
}
И тест
MyObject o = mock(MyObject.class);
MyOtherObject o2 = mock(MyOtherObject.class);
validate(o.doSomething()).return(2);
validate(o2.doSomethingElse(2));
myFunction(o, o2);
А если посмотреть правде в глаза - ни верхний дебильный тест и этот по сути ничем не отличаются.
Такие дела. Мораль истории - не пишите такие тесты если не уверены на точно что в данном случае так и надо. Нужно пытаться проверять только точно желаемые вызовы и избегать влезания в реализацию в тесте
Всем спасибо, я все сказал.
Интересуют atomics, CAS, memory barriers, false sharing detection and prevention, lock-free структуры данных, разные примеры happens before и т.д.
Самый лучший совет - книга advanced уровня. Спеку тоже нужно читать, но ведь я уже знаю о ее существовании, потому советовать нечего.
Статьи тоже сойдут, хотя я уже их начитался.
#include <iostream>
#include <memory>
#include <vector>
#include <thread>
using namespace std;
class MyClass{
public:
MyClass(){
cout << "Created " << this << " at " << std::this_thread::get_id() << endl;
}
void SayHi(){
cout << "Say hi from thread " << std::this_thread::get_id() << endl;
}
virtual ~MyClass(){
cout << "Destroyed " << this << " at " << std::this_thread::get_id() << endl;
}
};
void Use(std::unique_ptr<MyClass> m){
m->SayHi();
}
int main(){
auto m = std::unique_ptr<MyClass>(new MyClass());
cout << std::boolalpha;
// Prints true
cout << "is null " << static_cast<bool>(m) << endl;
m->SayHi();
std::thread t1(Use, std::move(m));
// Prints false
cout << "is null " << static_cast<bool>(m) << endl;
// WTF? this works?!?!?
m->SayHi();
// Thank you C++ designers that I at least check...
if(m)
m->SayHi();
}
t1.join();
}
Почему unique_ptr остается юзабельным после std::move? Это считается хорошим дизайном? Кому нужен такой сценарий?
Я бы вот хотел чтобы в том вызове оно или не скомпилировалось или упало в рантайме чтобы рано найти ошибку. А так при передаче указателя в другой поток никакой речи о thread safety быть не может. Можно возразить что unique_ptr не должен решать эту проблему. Но это еще вопрос, а почему это не должен?
← назад | следующие → |