?

Log in

Andy La Rubin [entries|archive|friends|userinfo]
Andy La Rubin

[ website | B5 RFC ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Как поставить переменную окружения в OS X [июл. 30, 2015|11:18 pm]
Andy La Rubin
[Tags|]

Запишу себе на память, чтобы не забыть

Как все понимают, ~/.profile ~/.bash_profile хороши только для bash-скриптов. Если нужно чтобы работало для всех программ, нужно иначе.

Испокон веков работало создание специального plist-а под названием ~/.MacOSX/environment.plist. Но с 10.7 оно отвалилось

После этого работал файлик /etc/launch.conf вида
setenv FOO 1
setenv BAR 2


Но с 10.10 и это отвалилось. Сейчас надо делать так - в ~/Library/LaunchAgents делать plist вида

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.startup</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>
    launchctl setenv FOO 1
    launchctl setenv BAR 2
    </string>

  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>


После этого сразу можно сделать launchctl load этот.plist и переменные загрузятся
Ссылка1 комментарий|Оставить комментарий

Указатель на темпоральный объект [июл. 15, 2014|11:23 am]
Andy La Rubin
[Tags|]

Появился тут кодец, который, если упростить его до безобразия, выглядит так:

struct X
{
};

class A
{
public:
   A(const X* x) {}
};

class B : public A
{
public:
   B() : A(&X()) {}
};


Ну то есть есть класс A, который конструктором принимает некоторую структуру для целей собственной инициализации (параметры инициализации там лежат, чтобы не рисовать большой-пребольшой конструктор), а есть класс B, который хочет проинициализировать свою базу A такой структурой, а при этом своих клиентов он грузить подробностями не хочет. Соответственно классу B нужно успеть создать такую структуру в узкий промежуток между вызовом B::B и передачей управления A::A, а узкий промежуток заключается только в вычислении параметров A::A, соответственно придумать что-то умнее, как создать темпоралку X и передать ее в A, сложно.

Проблема же в том, что A принимает не константную ссылку на X, а константный указатель, и если визуальнику на это пофиг, то остальным компилятором нет, и они справедливо указывают на пункт стандарта, который утверждает, что операндом & должно быть lvalue (а темпоралка им не является). Вопрос -- как быть? Если можно поменять A, то задачки нет, а предположим A поменять нельзя. Какие есть варианты?

1) Если бы можно было бы где-то написать хотя бы стейтмент, то можно было бы написать так

const X& x = X();
A(&x)


но это не наш кейс

2) Если можно было бы изменить X, то можно было бы приписать ей функцию

const X* ptr() const { return this; }


и, соответственно, вызов заменить на

B(): A(X().ptr()) {}


3) Можно не меняя X пронаследовать его, а в наследнике сделать такую функцию

struct Y : X
{
    const X* ptr() const { return this; }
};


и, соответственно, вызов заменить на

B() : A(Y().ptr()) {}


4) Можно написать шаблончик, который возьмет const X&, и вернет указатель

template <typename T> const T* ptr(const T& t) { return &t; }


и, соответственно, вызов заменить на

B() : A(ptr(X())) {}


5) И, наконец, мой фаворит. Написать лямбду, которая делает то же самое

B() : A([](const X& x){ return &x; }(X())) {}


И все.
Ссылка6 комментариев|Оставить комментарий

Указатели на члены базовых классов в шаблонных параметрах. А если еще и с хитрым доступом? [июн. 30, 2014|10:56 pm]
Andy La Rubin
[Tags|]

Совсем я уже забросил уютненькую, когда вдруг пришел ко мне recoder и задал вопрос про С++, про который у меня был целый псто, и я, конечно, не мог его туда не послать :) Но в процессе разбирательств выяснились настолько милые подробности, что потребовали написать целый follow-up.

Итак, проблематика прошлого поста -- нельзя в шаблонный аргумент "указатель на член класса" передавать указатель на член базы, только текущего переданного класса:

struct A { int x; };
struct B : A {}

template<typename V, class C, V C::* M>
struct T{   
    T(C& c, V v) { c.*M = v; }
};

void a()
{
   A a;
   T<int, A, &A::x>(a, 0); // OK
   B b;
   T<int, B, &B::x>(b, 0); // Ошибка
}


Проблема, как мы выяснили, решается примерно так:

template<typename V, class C1, class C2, V C2::* M>
struct T{   
    T(C1& c, V v) { c.*M = v; }
};

void a()
{
   A a;
   T<int, A, A, &A::x>(a, 0); // OK
   B b;
   T<int, B, A, &A::x>(b, 0); // OK
}


Но теперь условие задачи усложним:
class A { protected: int x; };


То есть x будет теперь protected членом. А шаблонную функцию запихнем в наследника, и соответственно у него по идее есть доступ к защищенному члену базы:

class B : public A 
{
   template<typename V, class C, V C::* M>
   struct T{   
       T(C& c, V v) { c.*M = v; }
   };

   void a()
   {
      T<int, B, A, &A::x>(*this, 0); // Ошибка
   }
}


И внезапно получаем ошибку — 'x' is a protected member of 'A'
Ну да, но мы ж должны иметь доступ к x, так как мы в контексте класса B?

А вот оказывается нет. Даже если ты - наследник класса с защищенным членом, то к этому члену ты имеешь доступ только через свой класс, а через класс базы — нет. То есть из B::a() к x есть доступ при обращении просто по имени, по B::x, но не по A::x.

И как же быть в нашем случае? Мы же специально писали A::x, чтобы избежать проблемы с доступом к члену по базовому классу, так как это не лызет в шаблон. И что, все, приплыли, взаимоисключающие параграфы детектед?

Но нет, из каждой безвыходной ситуации есть по крайней мере два выхода. Вот один из них:

   void a()
   {
      T<int, B, A, &B:x>(*this, 0); // OK
   }


Внезапно, так работает. Доступ есть — мы обращаемся к x в контексте именно B, а к нему у нас есть доступ, а указатель на член прокатывает, поскольку шаблон раскрывается с указателем на int A::* (исходя из явных первого и третьего параметров), а B::x приводится к int A::*.

Итого, мы нашли наш идеальный вариант решения предыдущего поста.
СсылкаОставить комментарий

Сегодня я узнал, что... [авг. 1, 2013|07:12 pm]
Andy La Rubin
...начало The Frayed Ends of Sanity Металлики цитирует марш из "Волшебника из страны Оз". Наверное потому, что я никогда не смотрел Волшебника из страны Оз )
Ссылка1 комментарий|Оставить комментарий

Внезапно прокрался в ЖЖшечку к Касперу [июл. 30, 2013|03:44 pm]
Andy La Rubin
[Tags|]

http://e-kaspersky.livejournal.com/150147.html


Ссылка2 комментария|Оставить комментарий

Full Throttle: тайная минигейм [апр. 6, 2013|03:04 pm]
Andy La Rubin
Фигассе. Дождался когда LucasArts всё, и только после этого узнал, что оказыватеся в Full Throttle была минигейм с ножичком...
СсылкаОставить комментарий

Delenn Transformed [мар. 30, 2013|12:45 am]
Andy La Rubin
[Tags|]

Все мы знаем как Деленн визуально трансформировалась в течении 5 сезонов сериала. Но интересно также понаблюдать за ее (его) визуальными транформациями еще до начала сериала.

Все началось с концептов, с которыми Стражыныч ходил по студиям, пытаясь продать товар. В это время Деленн был минбарским мужиком, не суровым, но суровым spiritual и mystic, и выглядил так:



( Трансформация )
Ссылка

Телеканал "Новости Вавилона 5" [мар. 29, 2013|01:24 pm]
Andy La Rubin
[Tags|]

А вы знаете, что на Вавилоне 5 в 2257-м работал свой новостной канал, и ведущим новостей там был ипша?

А вот вам неопровержимые доказательства сего факта:

1) Посол Г'Кар перед встречей с Литой Александрой смотрит выпуск новостей (обратие внимание на логотип в углу - NEWS на фоне характерной цифры 5):



Дальше - большеСвернуть )
Ссылка6 комментариев|Оставить комментарий

Apple отдает добро [фев. 15, 2013|05:06 pm]
Andy La Rubin
[Tags|, ]

Во время недавней поездки на Западный Берег (но не реки Иордан, а Тихоокеанское побережье США) мне, как обычно, пришлось имплементить мегазаказ на эппловскую технику от лица ее все более и более многочисленных поклонников:



Внимательные читатели могут разглядеть среди заказанного стаффа две коробки из-под MBP 13.3/2.5/8GB/256GB FLASH и MBAIR 13.3/1.8/256Flash. Техника была закуплена, привезена, растоможенна (как - отдельная история), выдана ее новым владельцам, деньги получены, кредит погашен, аэрофлот-бонусы начислены. Казалось бы, конец истории?

Но вдруг Apple внезапно (как, собственно и всегда) снижает цены на MBP и MBA, причем именно на те, которые с 256GB флеша. И если на MBAIR цена снижается на $100, то на MBP - аж на целых $400. Конечно, заказавшим технику должен быть крайне обиден данный расклад, и из доброты душевной я им решил помочь. Поиск в интернете подобных случаев дает повод для оптимизма - чуваки утверждают, что такое уже случалось, и они приходили в магазин и получали свой refund разницы в цене, так как это такая эппловая полиси. Проблема в том, что я в магазин уже зайти не могу, но могу в него написать. На всякий случай я отправил им письмо (прямо на адрес магазина, который прислал мне в свое время recepit), в котором описал ситуацию. Дальше сел изучать ситуацию более подробно. Поиск по сайту эппла довольно быстро привел меня на страницу, где подтверждалось, что да, такая policy у них есть - если price drop произошел в пределах 14 дней от момента покупки, то да, деньги они возвращают (дата покупки у меня была - 31 января, а цены они дропнули аккурат 13 февраля, то есть точно 14 дней :). И там же было указано, что если вам нужен рефанд, то либо приходите к нам в магазин, либо позвоните по телефону 1-800.

Ну а чего ж не позвонить? Звоню! Отвечает робот, выслушав проблему и задав пару наводящих вопросов, переключает меня на живого оператора с американским акцентом (счастье!). Дальше начинаются сложности. Оператор спрашивает меня серийные номеры девайсов. В чеке они конечно есть, но вот их надо продиктовать! Линия Москва-неизвестный коллцентр на территории США недостаточно хороша, чтобы оператор слышал разницу в моем произношении букв Ти, Ди и даже Джи, в результате мы переходим на фонетический алфавит НАТО - тот, который Альфа Браво Чарли (если наши телефонные линии прослушиваются ФСБ, то, я думаю, я поднял все красные флаги у них там). В конце концов серийные номера на ту сторону переданы и перепроверены. Но тетка спрашивает - а ты девайсы-то покупал в сторе или в онлайне? В сторе, говорю. Увы, говорит тетка, вернуть мы деньги можем если бы ты в онлайне купил. А так тебе надо ехать в стор. Я говорю - да я уже с другой стороны Земли, как я в стор-то ваш попаду? Ну, говорит, как приедешь в то место, где есть сторы, необязательно США, приходи в стор, там тебе все сделают. А если в июне я приеду, то не слишком ли будет поздно, спрашиваю? Говорит - should be fine (с ударением на should). Не нравится мне это, думаю. Во-первых, should смущает, а во-вторых, как-то долго ждать, когда я еще приеду в сторовую страну... Спрашиваю - а если я в магазин непосредственно позвоню? А позвони, говорит тетка, и дала мне телефон магазина (он совпал с тем, что был на чеке).

Звоню в магазин. Опять отвечает робот - что у вас? Хочу рефанд, говорю. Он - вы хотите записаться в genius bar или у вас есть какая техническая проблема? Рефанд, говорю, хочу! В общем ему надоело, он соединил меня с человеком. Человек сразу понимает о чем речь, спрашивает номер моей кредитки (фишинг! фишинг!), тут же по ней все находит и без вопросов рефандит мне $500 плюс такс ($543.75 в сумме), о чем мне тут же на gmail сваливается чек. Деньги, говорит, поступят в течение трех бизнес-дней. Все довольны и писают кипятком от радости, скептики посрамлены.

А ночью приходит ответ на мое первое письмо в магазин - говорят, мы хотели тут уже тебе все зарефандить, но видим, что тебе уже все зарефандили )
Ссылка3 комментария|Оставить комментарий

Катание (и не только) на Тахо [янв. 28, 2013|09:36 pm]
Andy La Rubin
[Tags|, , ]

Как я уже говорил, Heavenly я выбрал для катания не из-за каких-то крутых склонов, а по причинам кране простым: во-первых виды на озеро, а во-вторых подъемник находится совсем рядом с отелем, в который я уже третий раз приезжаю из-за отменного завтрака (вернее, первый раз случайно, а вторые два - точно из-за него):



Читать дальше...Свернуть )
Ссылка11 комментариев|Оставить комментарий

navigation
[ viewing | most recent entries ]
[ go | earlier ]