tag:blogger.com,1999:blog-4385259139109679902024-03-13T21:26:36.328+03:00Мой блогWarGothhttp://www.blogger.com/profile/10671825184284438092noreply@blogger.comBlogger14125tag:blogger.com,1999:blog-438525913910967990.post-7493311097154950572011-03-28T01:18:00.001+04:002011-03-28T01:19:38.612+04:00Официальный сайт для Sketcher'аЗапустил на гугласайтах официальный сайт для Sketcher'а на английском языке: <a href="http://sites.google.com/site/sketcherapp">http://sites.google.com/site/sketcherapp</a>. Там же будет транслироваться блог разработки на английском языке. Основная цель - пиар проекта и сбор пожертвований (попробую пока эту модель монитизации приложений). С первых пожертвований куплю нормальный домен. Ни слишком ли гиковский сайт получился? :)WarGothhttp://www.blogger.com/profile/10671825184284438092noreply@blogger.com0tag:blogger.com,1999:blog-438525913910967990.post-21101561405323687642011-03-28T01:13:00.002+04:002011-03-28T01:15:11.220+04:00Новый диалог выбора цвета для вашего приложения на AndroidВ последней версии Sketcher добавил новый диалог выбора цвета:<br />
<br />
<img src="http://3.bp.blogspot.com/-77ZxD5k2Mpo/TY-m4-V2eqI/AAAAAAAAEII/6nl2l3P_DvA/s1600/device.png" /><br />
<br />
Он был разработан специально для того, чтобы можно было его использовать в любых других приложений, чтобы можно было его легко модифицировать под конкретные нужды. Исходники лежат здесь: <a href="https://github.com/wargoth/Sketcher/tree/master/src/org/sketcher/colorpicker">https://github.com/wargoth/Sketcher/tree/master/src/org/sketcher/colorpicker</a>. <a href="https://github.com/wargoth/Sketcher/blob/master/src/org/sketcher/Sketcher.java#L117">Пример использования</a>:<br />
<pre>new <a href="https://github.com/wargoth/Sketcher/blob/master/src/org/sketcher/colorpicker/PickerDialog.java">PickerDialog</a>(context, new <a href="https://github.com/wargoth/Sketcher/blob/master/src/org/sketcher/colorpicker/Picker.java#L6">Picker.OnColorChangedListener</a>() {
@Override
public void colorChanged(Paint color) {
// используйте полученный цвет здесь
}
}, currentPaint).show(); // передайте сюда текущий цвет
</pre><br />
Не забудьте включить в свой проект лэйаут диалогового окна, который лежит в папке "res/layout" под именем "color_picker.xml". Исходник его лежит <a href="https://github.com/wargoth/Sketcher/blob/master/res/layout/color_picker.xml">здесь</a>.WarGothhttp://www.blogger.com/profile/10671825184284438092noreply@blogger.com2tag:blogger.com,1999:blog-438525913910967990.post-31604697799176371152011-03-03T23:27:00.003+03:002011-03-03T23:37:04.387+03:00Сортировка огромного массиваОпять задали вопрос на собеседовании, на который я не сразу дал ответ, а уже вдогонку отправил письмом. Что вы думаете по поводу этого?<br />
<br />
Задача: Дан огромный массив чисел, состоящий только из 0, 1 и 2. Описать алгоритм как его отсортировать и оценить сложность алгоритма.<br />
<br />
ЗЫ: в каментах ответ, предупреждаю :)WarGothhttp://www.blogger.com/profile/10671825184284438092noreply@blogger.com5tag:blogger.com,1999:blog-438525913910967990.post-72360281941118170072011-02-12T19:08:00.001+03:002011-02-12T19:10:33.578+03:00Еще одно тестовое задание - собери плиткиНеобходимо написать функцию <code>link_tiles($tiles)</code>, которая сложит переданные в виде списка плитки последовательно и выведет на экран каждый шаг выкладывания плиток. Плитка - кварат, который поделен на 4 части, пронумерованные от 0 до 9. Плитка может быть приложена в том случае если хотя бы 2 числа подходят к соседним плиткам, но и остальные номера, если они прикладываются, тоже должны совпадать. Плитки можно поворачивать. Входные данные заданы таким образом, что всегда есть только 1 вариант расположения плиток.<br />
<br />
Не надо думать о неккоретных данных или огромных наборах данных.<br />
<br />
З.Ы. Хочу похвастаться, что сделал я его за 3 часа 50 минут. Дополнительно отправил еще и юнит-тесты. На сколько успешно - напишу позже.<br />
<br />
Например:<br />
<br />
<pre>$tiles1 = array(
"11", // 1
"23",
"",
"44", // 2
"11",
"",
"16", // 3
"36",
"",
"51", // 4
"71",
"",
"46", // 5
"26",
"",
"14", // 6
"68",
0);
</pre><br />
link_tiles($tiles1) выведет:<br />
<br />
<pre>6 tiles
link 1
11
23
link 2
44
11
11
23
link 3
44
11
1116
2336
link 4
44
5111
711116
2336
link 5 // note this tile had to be rotated 180 degrees clockwise
44
5111
71111662
233664
link 6 // note this tile had to be rotated 270 degrees clockwise
4448
511116
71111662
233664
</pre><br />
<br />
<pre>$tiles2 = array(
"12", // 1
"34",
"",
"36", // 2
"15",
"",
"56", // 3
"78",
"",
"78", // 4
"90",
"",
"46", // 5
"26",
"",
"88", // 6
"01",
"",
"93", // 7
"54",
0);
</pre><br />
link_tiles($tiles2) выведет:<br />
<br />
<pre>7 tiles
link 1
12
34
link 2 // note this tile had to be rotated 180 degrees clockwise
5112
6334
link 3 // note this tile had to be rotated 90 degrees clockwise
755112
866334
link 4 // note this tile had to be rotated 90 degrees clockwise
97755112
08866334
link 5 // note this tile had to be rotated 270 degrees clockwise
97755112
08866334
66
42
link 6 // note this tile had to be rotated 90 degrees clockwise
97755112
08866334
08 66
18 42
link 7 // note this tile had to be rotated 270 degrees clockwise
97755112
08866334
08 66 34
18 42 95
</pre><br />
<pre>$tiles3 = array(
"11", // 1
"12",
"",
"12", // 2
"93",
"",
"93", // 3
"99",
"",
"39", // 4
"98",
"",
"95", // 5
"86",
"",
"57", // 6
"66",
"",
"77", // 7
"57",
"",
"13", // 8
"24",
"",
"45", // 9
"47",
"",
"24", // 10
"39",
0);
</pre><br />
link_tiles(tiles3) выведет:<br />
<br />
<pre>10 tiles
link 1
11
12
link 2
11
12
12
93
link 3
11
12
12
93
93
99
link 4
11
12
12
93
9339
9998
link 5
11
12
12
93
933995
999886
link 6
11
12
12
93
93399557
99988666
link 7
11
12
12 77
93 57
93399557
99988666
link 8
1113
1224
12 77
93 57
93399557
99988666
link 9
1113
122445
12 4777
93 57
93399557
99988666
link 10
1113
122445
12244777
9339 57
93399557
99988666
</pre>WarGothhttp://www.blogger.com/profile/10671825184284438092noreply@blogger.com0tag:blogger.com,1999:blog-438525913910967990.post-75972034902691152582011-02-01T16:54:00.002+03:002011-02-01T22:38:22.593+03:00Задачка на собеседованииИнтересная задачка, заданная мне недавно на собеседовании: вероятность некоторого события за час - 80%. Какова вероятность этого события за 20 мин?<br />
<br />
Решение:<br />
<br />
Домустим, у нас есть некоторое событие, которое 100% произойдет за час. Вероятность, что это событие произойдет в первые 20 мин - 100/3%. То, что это произойдет одновременно (по теории умножения вероятностей): <br />
<br />
0.8% * 1/3 = 0.26(6)<br />
<br />
Т.е, примерно 27% . Так что, самый очевидный и невероятный ответ доказан - надо было просто делить на 3 :)WarGothhttp://www.blogger.com/profile/10671825184284438092noreply@blogger.com10tag:blogger.com,1999:blog-438525913910967990.post-71922024138587137832011-02-01T11:58:00.009+03:002011-02-01T19:37:59.418+03:00PostgreSQL vs MySQLНебольшая заметка о том, почему PostgreSQL круче MySQL:<br />
<br />
<ul><li>лучшая работа со подзапросами</li>
<li><a href="http://www.postgresql.org/docs/8.4/interactive/ddl-schemas.html">схемы</a> - часто очень удобно пользоваться как пространствами имен</li>
<li><a href="http://www.postgresql.org/docs/8.4/static/ddl-constraints.html">чеки</a> - позволяют дополнительно проверять данные перед сохранением</li>
<li><a href="http://www.postgresql.org/docs/8.4/interactive/rules.html">рулы</a> - позволяют создавать <a href="http://www.postgresql.org/docs/8.4/interactive/rules-views.html">обновляемые вьюхи</a></li>
<li>каскадное удаление при дропе таблицы или колонки - мускуль попросит удалять все сначала ручками</li>
<li><a href="http://www.postgresql.org/docs/8.4/interactive/tutorial-inheritance.html">наследование таблиц</a></li>
<li><a href="http://www.postgresql.org/docs/8.4/static/trigger-definition.html">триггеры</a>: временное отключение, триггерные функции, табличные триггеры. Временное отключение бесценно при накатывании миграций, триггерные функции можно использовать повторно</li>
<li>отсутствие кучи ограничений внутри триггеров и функций типа обновить таблицу на которой был вызван триггер и т.п.</li>
<li><a href="http://www.postgresql.org/docs/8.4/static/functions-sequence.html">сиквенсы</a> - позволяют реализовать паттерн "поле идентификации"</li>
<li><a href="http://www.postgresql.org/docs/8.4/static/tutorial-fk.html">внешние ключи</a>: составные, отложенная проверка. Отложенная проверка полезна, когда не нужно проверять целостность во время транзакции и можно отложить это до конца транзакции</li>
<li><a href="http://www.postgresql.org/docs/8.4/static/sql-createindex.html">индексы</a> по выражению, составные, частичные <strike>и хэш</strike> индексы, возможность задавать порядок, конкурентное создание индекса</li>
<li>сам язык SQL мощнее - включает <a href="http://www.postgresql.org/docs/8.4/static/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING">исключения</a> и много чего другого</li>
<li>можно писать на любом языке (Java, C, PHP и др)</li>
<li><a href="http://citforum.ru/database/postgres/fts/">библиотека полнотекстового поиска</a> и куча других полезных библиотек, возможность создавать собственные библиотеки</li>
<li>рекурсивные запросы</li>
<li><strike><a href="http://www.postgresql.org/docs/8.4/static/datatype-xml.html">запросы к XML данным</a></strike></li>
<li><a href="http://www.postgresql.org/docs/8.4/static/queries-order.html">возможность задавать порядок вывода null полей</a></li>
<li>масштабирование на многоядерных системах (мускуль в этом отношении мертвый)</li>
<li><a href="http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis">транзакционный DDL</a> - возможность делать миграции схемы БД в транзакции.</li>
<li>простое добавление и удаление колонок. В постгре по сути изменяются метаданные таблицы, поэтому все происходит очень быстро в не зависимости от размера таблицы; а в мускуле удаление колонки может днями идти блокируя все на своем пути</li>
<li><a href="http://www.postgresql.org/docs/8.4/interactive/planner-optimizer.html">умный оптимизатор запросов</a></li>
<li><a href="http://www.postgresql.org/docs/8.4/static/datatype.html">Строгая типизация, пользовательские типы, массивы, полноценые булевы</a></li>
</ul><br />
Последняя версия 9.0 получила поддержку репликаций "из коробки", так что исчезла последняя причина оставаться на MySQL.<br />
<br />
Если у кого-нибудь еще что-то есть, добавляйте в каменты :)WarGothhttp://www.blogger.com/profile/10671825184284438092noreply@blogger.com14tag:blogger.com,1999:blog-438525913910967990.post-91735391168198229662010-11-03T17:25:00.001+03:002010-11-03T17:36:16.321+03:00GWT: Обманываем JavaВопрос на засыпку, что выведет эта программа:<br />
<br />
<div class="php"><ol><li class="li1"><div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> Inheritance <span class="br0">{</span></div></li>
<li class="li1"><div class="de1"> <span class="kw2">private</span> static <span class="kw2">class</span> A <span class="br0">{</span></div></li>
<li class="li1"><div class="de1"> <span class="kw2">public</span> void tt<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div></li>
<li class="li1"><div class="de1"> <a href="http://www.php.net/system"><span class="kw3">System</span></a><span class="sy0">.</span>out<span class="sy0">.</span>println<span class="br0">(</span><span class="st0">"a"</span><span class="br0">)</span><span class="sy0">;</span></div></li>
<li class="li2"><div class="de2"> <span class="br0">}</span></div></li>
<li class="li1"><div class="de1"> <span class="br0">}</span></div></li>
<li class="li1"><div class="de1"> </div></li>
<li class="li1"><div class="de1"> <span class="kw2">private</span> static <span class="kw2">class</span> B <span class="kw2">extends</span> A <span class="br0">{</span></div></li>
<li class="li1"><div class="de1"> <span class="kw2">public</span> void tt<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div></li>
<li class="li2"><div class="de2"> <a href="http://www.php.net/system"><span class="kw3">System</span></a><span class="sy0">.</span>out<span class="sy0">.</span>println<span class="br0">(</span><span class="st0">"b"</span><span class="br0">)</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"> <span class="br0">}</span></div></li>
<li class="li1"><div class="de1"> <span class="br0">}</span></div></li>
<li class="li1"><div class="de1"> </div></li>
<li class="li1"><div class="de1"> <span class="kw2">public</span> static void main<span class="br0">(</span>String<span class="sy0">...</span> args<span class="br0">)</span> <span class="br0">{</span></div></li>
<li class="li2"><div class="de2"> A a <span class="sy0">=</span> <span class="kw2">new</span> A<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"> a<span class="sy0">.</span>tt<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"> B b <span class="sy0">=</span> <span class="br0">(</span>B<span class="br0">)</span> a<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"> b<span class="sy0">.</span>tt<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"> <span class="br0">}</span></div></li>
<li class="li2"><div class="de2"><span class="br0">}</span></div></li>
</ol></div><br />
Она скомпилируется, но при запуске кинет эксепшн:<br />
<code><br />
a<br />
Exception in thread "main" java.lang.ClassCastException: Inheritance$A cannot be cast to Inheritance$B<br />
at Inheritance.main(Inheritance.java:18)<br />
</code><br />
<br />
Все верно... для Java.<br />
<br />
Однако, в GWT можно так делать. Причем, даже нужно, потому что других способов создать иерархию объектов из JavaScriptObject невозможно, ведь инстанцирование их напрямую запрещено, что исключает использование фабрик. К примеру:<br />
<br />
<br />
<div class="php"><ol><li class="li1"><div class="de1">import com<span class="sy0">.</span>google<span class="sy0">.</span>gwt<span class="sy0">.</span>core<span class="sy0">.</span>client<span class="sy0">.</span>JavaScriptObject<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">import com<span class="sy0">.</span>google<span class="sy0">.</span>gwt<span class="sy0">.</span>core<span class="sy0">.</span>client<span class="sy0">.</span>JsArray<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">import com<span class="sy0">.</span>google<span class="sy0">.</span>gwt<span class="sy0">.</span>user<span class="sy0">.</span>client<span class="sy0">.</span>Window<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"> </div></li>
<li class="li2"><div class="de2"><span class="kw2">public</span> <span class="kw2">class</span> Test <span class="br0">{</span></div></li>
<li class="li1"><div class="de1"> <span class="kw2">private</span> static <span class="kw2">class</span> A <span class="kw2">extends</span> JavaScriptObject <span class="br0">{</span></div></li>
<li class="li1"><div class="de1"> <span class="kw2">protected</span> A<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div></li>
<li class="li1"><div class="de1"> <span class="br0">}</span></div></li>
<li class="li1"><div class="de1"> </div></li>
<li class="li2"><div class="de2"> <span class="kw2">public</span> final void amethod<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div></li>
<li class="li1"><div class="de1"> Window<span class="sy0">.</span>alert<span class="br0">(</span><span class="st0">"A"</span><span class="br0">)</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"> <span class="br0">}</span></div></li>
<li class="li1"><div class="de1"> </div></li>
<li class="li1"><div class="de1"> <span class="kw2">public</span> final native boolean isB<span class="br0">(</span><span class="br0">)</span> <span class="coMULTI">/*-{</span></div></li>
<li class="li2"><div class="de2"><span class="coMULTI"> return this.is_b;</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI"> }-*/</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"> <span class="br0">}</span></div></li>
<li class="li1"><div class="de1"> </div></li>
<li class="li1"><div class="de1"> <span class="kw2">private</span> static <span class="kw2">class</span> B <span class="kw2">extends</span> A <span class="br0">{</span></div></li>
<li class="li2"><div class="de2"> <span class="kw2">protected</span> B<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div></li>
<li class="li1"><div class="de1"> <span class="br0">}</span></div></li>
<li class="li1"><div class="de1"> </div></li>
<li class="li1"><div class="de1"> <span class="kw2">public</span> final void bmethod<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div></li>
<li class="li1"><div class="de1"> Window<span class="sy0">.</span>alert<span class="br0">(</span><span class="st0">"B"</span><span class="br0">)</span><span class="sy0">;</span></div></li>
<li class="li2"><div class="de2"> <span class="br0">}</span></div></li>
<li class="li1"><div class="de1"> <span class="br0">}</span></div></li>
<li class="li1"><div class="de1"> </div></li>
<li class="li1"><div class="de1"> <span class="kw2">public</span> void test<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span></div></li>
<li class="li1"><div class="de1"> JsArray<span class="sy0"><</span>A<span class="sy0">></span> objects <span class="sy0">=</span> getObjects<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li>
<li class="li2"><div class="de2"> <span class="kw1">for</span> <span class="br0">(</span>int i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span> i <span class="sy0"><</span> objects<span class="sy0">.</span>length<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">)</span> <span class="br0">{</span></div></li>
<li class="li1"><div class="de1"> A a <span class="sy0">=</span> objects<span class="sy0">.</span>get<span class="br0">(</span>i<span class="br0">)</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"> <span class="kw1">if</span> <span class="br0">(</span>a<span class="sy0">.</span>isB<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span> <span class="br0">{</span></div></li>
<li class="li1"><div class="de1"> <span class="br0">(</span><span class="br0">(</span>B<span class="br0">)</span> a<span class="br0">)</span><span class="sy0">.</span>bmethod<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"> <span class="br0">}</span> <span class="kw1">else</span> <span class="br0">{</span></div></li>
<li class="li2"><div class="de2"> a<span class="sy0">.</span>amethod<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"> <span class="br0">}</span></div></li>
<li class="li1"><div class="de1"> <span class="br0">}</span></div></li>
<li class="li1"><div class="de1"> <span class="br0">}</span></div></li>
<li class="li1"><div class="de1"> </div></li>
<li class="li2"><div class="de2"> <span class="kw2">private</span> static final native JsArray<span class="sy0"><</span>A<span class="sy0">></span> getObjects<span class="br0">(</span><span class="br0">)</span> <span class="coMULTI">/*-{</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI"> return [{is_b: false}, {is_b: true}];</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI"> }-*/</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">}</span></div></li>
</ol></div><br />
Это можно объяснить тем, что скомпилированный код - уже не Java, а Javascript. Конечно, нельзя использовать наследование по полной - перегружать методы например, т.к. они или класс должны быть "final", но это позволяет разнести логику наследуемых сущностей по классам, сделать код более читаемым и проще поддерживаемым.<br />
<br />
<style type="text/css"><!--
/**
* GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
* (http://qbnz.com/highlighter/ and http://geshi.org/)
*/
.php .de1, .php .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;color: #000020; white-space: nowrap;}
.php {font-family:monospace;color: #006; border: 1px solid #d0d0d0; background-color: #f0f0f0; overflow: auto}
.php a:link {color: #000060;}
.php a:hover {background-color: #f0f000;}
.php .imp {font-weight: bold; color: red;}
.php li, .php .li1 {font-weight: normal; vertical-align:top;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;}
.php .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
.php .li2 {font-weight: bold; vertical-align:top;font-weight: bold; color: #006060;}
.php .kw1 {color: #b1b100;}
.php .kw2 {color: #000000; font-weight: bold;}
.php .kw3 {color: #990000;}
.php .kw4 {color: #009900; font-weight: bold;}
.php .co1 {color: #666666; font-style: italic;}
.php .co2 {color: #666666; font-style: italic;}
.php .co3 {color: #0000cc; font-style: italic;}
.php .co4 {color: #009933; font-style: italic;}
.php .coMULTI {color: #666666; font-style: italic;}
.php .es0 {color: #000099; font-weight: bold;}
.php .es1 {color: #000099; font-weight: bold;}
.php .es2 {color: #660099; font-weight: bold;}
.php .es3 {color: #660099; font-weight: bold;}
.php .es4 {color: #006699; font-weight: bold;}
.php .es5 {color: #006699; font-weight: bold; font-style: italic;}
.php .es6 {color: #009933; font-weight: bold;}
.php .es_h {color: #000099; font-weight: bold;}
.php .br0 {color: #009900;}
.php .sy0 {color: #339933;}
.php .sy1 {color: #000000; font-weight: bold;}
.php .st0 {color: #0000ff;}
.php .st_h {color: #0000ff;}
.php .nu0 {color: #cc66cc;}
.php .nu8 {color: #208080;}
.php .nu12 {color: #208080;}
.php .nu19 {color:#800080;}
.php .me1 {color: #004000;}
.php .me2 {color: #004000;}
.php .re0 {color: #000088;}
.php span.xtra { display:block; }
--!></style>WarGothhttp://www.blogger.com/profile/10671825184284438092noreply@blogger.com0tag:blogger.com,1999:blog-438525913910967990.post-13994965235591346102010-05-22T15:36:00.000+04:002010-05-22T15:36:59.945+04:00Color Picker для AndroidС обновлением рисовалки Sketcher до версии 1.0.3, появилась возможность выбирать цвет линий. В качестве диалога выбора цвета, я использовал и доработал стандартный диалог, который вытащил из примеров приложений. Доработал его дополнительным контролом, который позволяет выбрать оттенок цвета. Исходник лежит здесь: <a href="http://github.com/wargoth/Sketcher/blob/master/src/org/sketcher/ColorPickerDialog.java">http://github.com/wargoth/Sketcher/blob/master/src/org/sketcher/ColorPickerDialog.java</a>.<br />
<br />
<img border="0" src="http://3.bp.blogspot.com/_hpWj6JG-aGQ/S_fBibWM_GI/AAAAAAAADNc/lR7Nct9seqE/s1600/device.png" />WarGothhttp://www.blogger.com/profile/10671825184284438092noreply@blogger.com4tag:blogger.com,1999:blog-438525913910967990.post-15361538869507567382010-04-18T20:07:00.004+04:002010-11-03T16:51:17.461+03:00Использование внешних приложений для отправки картинок или чего-нибудь ещеДля <a href="http://yavalek.blogspot.com/2010/03/0.html">Sketcher</a> понадобилось реализовать возможность отправки получившейся картинки через e-mail, MMS и прочих. Можно, конечно, реализовать свой отправщик почты/MMS/еще-чего-нибудь, но это - изобретение велосипеда. Лучше воспользоваться стандартным механизмом, который предоставляют т.н. <a href="http://developer.android.com/guide/topics/providers/content-providers.html">Content Providers</a>. <br />
<br />
<img border="0" src="http://2.bp.blogspot.com/_hpWj6JG-aGQ/S8stvaRLycI/AAAAAAAACbQ/xPHMU8VZ3gg/s1600/device.png" /><br />
<br />
На примере отправки картинки, это реализуется очень просто:<br />
<br />
<div><!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><span style="color: #008080;">1</span> <span style="color: #000000;">File file; </span><span style="color: #008000;">//</span><span style="color: #008000;"> допустим, есть некоторая картинка</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">2</span> <span style="color: #008000;"></span><span style="color: #000000;">Uri uri </span><span style="color: #000000;">=</span><span style="color: #000000;"> Uri.fromFile(file);<br />
</span><span style="color: #008080;">3</span> <span style="color: #000000;"><br />
</span><span style="color: #008080;">4</span> <span style="color: #000000;">Intent i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Intent(Intent.ACTION_SEND);<br />
</span><span style="color: #008080;">5</span> <span style="color: #000000;">i.setType(</span><span style="color: #000000;">"</span><span style="color: #000000;">image/png</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">6</span> <span style="color: #000000;">i.putExtra(Intent.EXTRA_STREAM, uri);<br />
</span><span style="color: #008080;">7</span> <span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;"> вот здесь создается новое окно со списком доступных приложений,<br />
</span><span style="color: #008080;">8</span> <span style="color: #008000;"></span><span style="color: #008000;">//</span><span style="color: #008000;"> которые могут обработать данный с типом "image/png"</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">9</span> <span style="color: #008000;"></span><span style="color: #000000;">startActivity(Intent.createChooser(i, </span><span style="color: #000000;">"</span><span style="color: #000000;">Send Image To:</span><span style="color: #000000;">"</span><span style="color: #000000;">));</span></div><br />
Однако, есть некоторые нюансы. Во-первых, файл должен быть сохранен на диске, во-вторых, на нем должны стоять права, разрешающие чтение сторонними приложениями.<br />
<br />
Есть и некоторые глюки. Например, у меня на телефоне картинка нормально отсылается через MMS, пикасой, т.е. всеми, кроме Gmail. Пока не знаю почему, но почему-то файл не доходит до него, а в логах logcat пишет что-то типа:<br />
<br />
<code style="overflow:auto">04-01 18:33:06.589: DEBUG/Gmail(4465): ComposeActivity added to <br />
message:0 attachment:|asketch.png|image/png|0|image/png|LOCAL_FILE|file:///data/data/org.sketcher/files/asketch.png size:0 <br />
04-01 18:33:06.609: INFO/Gmail(4465): >>>>> Attachment uri: <br />
file:/// <br />
data/data/org.sketcher/files/asketch.png<br />
04-01 18:33:06.609: INFO/Gmail(4465): >>>>> type: image/png<br />
04-01 18:33:06.609: INFO/Gmail(4465): >>>>> name: asketch.png<br />
04-01 18:33:06.609: INFO/Gmail(4465): >>>>> size: 0</code><br />
<br />
Думаю, что это только у меня такое, но буду думать почему так...<br />
<br />
<b>UPD:</b> Оказалось, что нужно сохранять файлы на SD карте, чтобы сторонние приложения могли без проблем прочесть его (GMail в частности). Возможно, это глюк старых версий, т.к. на некоторых девайсах нет SD картыWarGothhttp://www.blogger.com/profile/10671825184284438092noreply@blogger.com1tag:blogger.com,1999:blog-438525913910967990.post-56613436656261996472010-04-12T15:11:00.008+04:002010-05-13T16:02:00.473+04:00Sketcher Фан-артПриходят письма от пользователей Sketcher, сообщающих о багах, предлагающих новые фичи. Вчера пришло письмо от пользователя, который прислал картинку, нарисованную в Sketcher. Не смог удержаться, чтобы не запостить :) Если еще будут присылать, буду выкладывать сюда.<br />
<br />
John Eide - "Hirsute":<br />
<img src="http://2.bp.blogspot.com/_hpWj6JG-aGQ/S8L_mZwgdWI/AAAAAAAACZ0/QWyNueeBO_Q/s1600/image_10.png" /><br />
<a name='more'></a><br />
John Eide - " Maître d' ":<br />
<img src="http://4.bp.blogspot.com/_hpWj6JG-aGQ/S8VhhzLVDMI/AAAAAAAACaU/SZSBfUQGj94/s1600/image_1.png" /><br />
<br />
Дмитрий выложил на своей страничке еще с десяток рисунков: <a href="http://d3berd.narod.ru/sketcher.html">http://d3berd.narod.ru/sketcher.html</a>WarGothhttp://www.blogger.com/profile/10671825184284438092noreply@blogger.com6tag:blogger.com,1999:blog-438525913910967990.post-40414581304302857822010-04-03T14:39:00.003+04:002010-04-05T19:47:05.977+04:00Про мою игрушку под AndroidДля интересующихся, выкладываю игрушку на раннем этапе разработки: <a href="http://narod.ru/disk/19356766000/Game.apk.html">http://narod.ru/disk/19356766000/Game.apk.html</a> . Изначально, я решил написать движок для игр типа tower defence, чтобы можно было его использовать универсально, меняя лишь логику игры. На данном этапе пытаюсь сделать клон игры Robo Defence. Если есть идеи по игре или желающие продолжить разработку игры для участия в Android Developer Challenge 2010, стучитесь :)<br />
<br />
Скрины:<br />
<br />
<img src="http://lh3.ggpht.com/_hpWj6JG-aGQ/S7cbRZ96yMI/AAAAAAAACZk/hJd-e9nt5kg/s640/2.png" /><br />
<br />
<img src="http://lh3.ggpht.com/_hpWj6JG-aGQ/S7cbRtXlVNI/AAAAAAAACZo/85J6DZDVYr8/s800/1.png" /><br />
<br />
PS. Ресурсы в этой демке выдраны из оригинального Robo DefenceWarGothhttp://www.blogger.com/profile/10671825184284438092noreply@blogger.com0tag:blogger.com,1999:blog-438525913910967990.post-62853975235054564052010-03-30T22:36:00.000+04:002010-03-30T22:36:34.083+04:00Если умер в NetBeans автокомплит функций PHPБыло пару раз, что автокомплит в NetBeans функций PHP умерал. Лечиться это удалением папки ~/.netbeans/_version_/var/cache/index/ и перезапуском NetBeans.WarGothhttp://www.blogger.com/profile/10671825184284438092noreply@blogger.com1tag:blogger.com,1999:blog-438525913910967990.post-34733555456184781832010-03-28T20:46:00.011+04:002010-06-03T18:24:50.454+04:00Первая версия рисовалки под Android. Встречайте Sketcher!Итак, плод 2-х дневной разработки, которые растянулись на 2 недели - Sketcher. Так же выложил исходники, они доступны по адресу: <a href="http://github.com/wargoth/Sketcher">http://github.com/wargoth/Sketcher</a><br />
<br />
<img src="http://qrcode.kaywa.com/img.php?s=6&d=market://search%3Fq%3Dpname:org.sketcher"/><br />
<br />
Скрины:<br />
<br />
<img src="http://lh5.ggpht.com/_hpWj6JG-aGQ/S7b3n8cbIKI/AAAAAAAACZc/9YR_2IkYxsI/s800/device.png" /><br />
<img src="http://lh4.ggpht.com/_hpWj6JG-aGQ/S7b3nwB6XLI/AAAAAAAACZg/JuNJar9X7VY/s800/image_6.png" />WarGothhttp://www.blogger.com/profile/10671825184284438092noreply@blogger.com3tag:blogger.com,1999:blog-438525913910967990.post-40056151731375111802010-03-28T19:05:00.000+04:002010-03-28T21:21:42.179+04:00Hello, WorldТрадиционное сообщение об открытии собственного блога. Начал пока что для того, чтобы выкладывать собственные разработки, идеи и прочий бред. А дальше - посмотрим.WarGothhttp://www.blogger.com/profile/10671825184284438092noreply@blogger.com1