Jun. 12th, 2012

μWTF

Jun. 12th, 2012 12:35 pm
juan_gandhi: (Default)
if (System.currentTimeMillis < file.lastModified + maxAge)


- oops, omg, does not work! How come? maxAge = Long.MaxValue (default value)

The right code is

if (System.curentTimeMillis - file.lastModified < maxAge)


P.S. Thanks for the discussion. I got it. There should be no "default invalid value"; the value must be Option[Long], and the comparator should return the right stuff on None.

Takes time to learn monadic, eh.
juan_gandhi: (Default)
Которые объясняют действия оппозиции их желанием сменить Путина на себя.
Это примерно того же уровня претензия, что и у путинистов, мол, схвачено и проплачено.

Моральные качества таких людей вызывают мои большие сомнения. Могут быть при этом умные люди. Но тест не прошли.
juan_gandhi: (Default)
Я тут недавно научился программировать.

Вам, может, смешно, но у меня из трёх типов скилзов - projecteuler, тяп-ляп-прототип, Солидный Тест-Дривен, общая картинка ни хрена не складывалась. Более того, я годами пытался понять, как это люди делают тяп-ляп прототип и выдают это за готовое изделие. Фанерную конуру за уютный жилой дом.

А, в дополнение к трём типам ещё где-то сверху витал Дух Функционального Программирования, который иной раз снисходил на код в стиле projecteuler, но остальных гнушался.

Так вот, странным образом, после того, как перепёр МакБрайда с Патерсоном на скалу, картинка сложилась.

Картинка примерно такая.

Есть какая-то объективная реальность, данная нам в ощущениях, а не в теоремах и задачах. Мы эту реальность начинаем тыкать палкой, потом скриптуем это дело, усложняя, пока не получится прототип, который в целом как-бы делает дело, но смотреть на эту лапшу не хочется. Но работает, в простейших случаях; все случаи методом тыка не покроешь.

Ну и хорошо. Останавливаемся здесь.

И начинаем писать юниттесты, не трогая (по возможности) имеющийся код, а только изолируя всю объективную реальность, чтобы всё работало внутри матрицы. Прежде всего, покрываем те случаи, которые у нас уже работали в объективной реальности.

Теперь наша программа изолирована, и можно на ней ставить опыты. Пишем дикое количество юниттестов - конфигфайлы с отсутствующими полями, с отрицательными номерами портов, со всяким бредом; файловые системы, которые говорят, что файл есть, но читать его не дают; репозитории, бросающие исключение если их спросить про какой-нибудь фолдер; и т.п. Не забудем замокать время, так что наш wait будет просто тикать - и в конце теста проверять, что натикало.

По дороге если приходится сильно чинить код, то его, конечно, надо бы опять на объективной реальности прокатать.

Ну вот, и когда матрица готова, то можно работать над кодом.

Можно убирать мутабельность и заменять всё на фолды, редьюсы, мапы и фильтры; можно выделять классы, всё перефигачивать - гоняя при этом юниттесты; т.к. это настоящие юниттесты, а не тяп-ляп, то они все пробегают за секунду.

Ну и когда код почищен и блестит, можно наращивать функциональность - статистику, логгинг, репортинг, всякие такие финтифлюшки, опциональные конфиг-параметры, и т.д. Вы его гладите, он мурлычет.

Скорость офигенная.

P.S. Я тут ну не вполне для прикола, но вставил в свою последнюю апликашку что-то вроде варзей:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
  val webServer = new Thread("Web Server") {
    def response(text: String, code: String = "200 OK") =
      """HTTP/1.0 """ + code + """
    Content-Type: text/html
    Content-Length: """ + text.length + """

    """ + text

    override def run {
      for(port <- env.webPort) {
        val ss = new ServerSocket(port)
        while (true) try {
          val s = ss.accept
          try { s.getOutputStream.write(response(stats.toString).getBytes)
          } finally { s.close }
        } catch { case ie: InterruptedException => return }
      }
    }
  }



Это веб-сервер, который (если, конечно, в конфиге задан порт) возвращает статистику пока программа работает. 19 строчек. И не надо никакого asp.net api изучать.
juan_gandhi: (Default)
.....
36 (Visual) FoxPro 0.265%
37 Erlang 0.257%
38 Awk 0.257%
39 Smalltalk 0.247%
40 APL 0.243%
41 Scala 0.234%
42 Forth 0.230%
43 ML 0.224%
.....

(src: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html)

Profile

juan_gandhi: (Default)
Juan-Carlos Gandhi

August 2025

S M T W T F S
      12
3456789
10 11 12 13141516
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 18th, 2025 08:24 pm
Powered by Dreamwidth Studios