juan_gandhi: (VP)
С утра ходил на рассказ Маниша из Нетфликса, как оно там с аккой и плеем; но по большей части добрый Маниш рассказывал идиотам, что не наадо бояться скалы - а идиоты зубоскалили, спрашивали, а что там за патерн матч, как в регекспах, что ли? А я ляпнул с последней парты - "как в Хаскеле" - чем заметно обидел идиотов. Вот! Вот оно как!

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

В будке Пивотала раздают значки. Я взял значок про Томката - Пивотал заявляет, что это всё они. Что они разработали Tomcat, Groovy, Rabbit MQ. Охуели ребята, конечно. Я их подначивал, типа и храм 14-го века тоже вы? Они с кривой улыбочкой - тоже мы.

Ходил ещё на "tcp/ip программистам" - классная лекция, красивая. Узнал кое-что; в частности - что есть такие тулзы... ну вы поняли, я ж теоретик. Я пакет нюхаю, может, раз в пять лет.

Потом один, слегка подзапоздавший к раздаче Скалы, чудак из мира Преподавателей Чего Угодно, впаривал "Скалу для Джавщиков", я туда пошел просто перекантоваться, но там не было коннекции, и я пошел туда, где коннекция есть.

В 5 здесь Aaron Schlesinger из Stackmob стал рассказывать про их красивый пакет, Newman, для рестфул веба.

Ррекомендую!!! Не зря пришел.

У них, кстати, есть класс Result, в lift-json-scalaz. От же ж.

Заодно... сначала оказалось, что у Арона нет штучки, чтобы мак к rgb присобачить, а у меня есть. И тут же дошло, а мне тоже кое-что надо. Не сможет ли Стакмоб похостить 14-го, Грегори Мередит приезжает.

А ещё развиртуализовался с [livejournal.com profile] scolar.
juan_gandhi: (VP)
http://ivan-gandhi.livejournal.com/2488144.html

Yes, I was convinced that it's pretty much doable.
Thank you, [livejournal.com profile] migmit, [livejournal.com profile] archaicos, [livejournal.com profile] sassa_nf, [livejournal.com profile] hamster37, [livejournal.com profile] mikkim08; good stuff.

Here's my code, based on the code by [livejournal.com profile] mstone wrote in C. Mine is in Scala.

def matches(s: String, r: String): Boolean = {
  def matchesOneChar(x:String) = !x.isEmpty && (r(0)=='.' || r(0) == x(0))
  if (r.isEmpty) s.isEmpty                                                     else
  if (!r.tail.startsWith("*")) matchesOneChar(s) && matches(s.tail, r.tail)    else
                               s.tails takeWhile (!matches(_, r drop 2)) forall matchesOneChar
}

def mustMatch   (s: String, r: String) = print(s"<<$s>> vs <<$r>>: ${if (matches(s, r)) "OK" else "*** bad!"}") 
def mustNotMatch(s: String, r: String) = print(s"<<$s>> vs <<$r>>: ${if(!matches(s, r)) "OK" else "*** bad!"}") 

    mustMatch("", "")
    mustNotMatch("", "a")
    mustMatch("a", "a*")
    mustMatch("a", ".*")
    mustMatch("", ".*")
    mustMatch("", "a*")
    mustNotMatch("b", "a*")
    mustMatch("b", ".*")
    mustMatch("b", "ba*")
    mustMatch("abba", "abba")
    mustNotMatch("", ".")
    mustMatch("a", ".")
    mustMatch("ac", "ab*c")
    mustMatch("abbbc", "ab*c")
    mustNotMatch("abbbc", "a.*b")
    mustMatch("abbbc", "a.*c")
    mustMatch("ac", ".*c")
    mustMatch("aac", "a*b*ac")



Comments?
juan_gandhi: (VP)
private[this] final val  µs_per_ns = 1000L


(that's scala.concurrent.duration.Duration)
juan_gandhi: (VP)
Пока я чесал репу, не хватит ли уже наслаждаться скалой, и не выйти ли из этой зоны комфорта в стратосферу хаскеля, выяснилось, что Эрик Мейер вдруг перебежал из лагеря хаскельщиков в лагерь скальщиков.

Ну хм.
juan_gandhi: (VP)
У меня была пауза между парсерами и проблемами, и пока Чаба переваривает мои рацпредложения, решил немножко поавтоматизировать свой труд по заполнению базы тестовыми данными.

Ну типа руками сдёргиваю экспорт из продакшена (программного доступа не дают), копирую, а потом что, потом надо insert into, с предварительным удалением случайно попавшихся записей с теми же ключами.

Ну а в скале у нас скверил, а скверил идёт на базу и видит, что ключи-то у нас генерируются из последовательности - поэтому он игнорирует ключ, что я даю, ну и т.д.

Ну и ещё, из сиквела с продакшена я получают текст, а скверилу подавай объект, это ещё морока десериализовывать.

Короче, за полдня нафигачил, по мере необходимости, весь нужный мне слой над jdbc, делов-то.

Правильно Tony Morris пишет, проблема ORM, а так же причина существования оной, в том, что производственники ни хера не понимают в программировании.
juan_gandhi: (VP)
What makes me sit in the middle of Sunday and write code? It's fun!!!
Below, with comments

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// we already have a bunch of patient properties on one tab (in props1); now get another bunch from another tab
// we click it and wait for the element to show up; then:
   val props2 = extractProperties("div#ctl00_ContentPlaceHolder1_Details_Container2") map (_.trimPrefixes)
// trimming prefixes means we do not care about all the additional keys, but just a variety of values

// now let's blend the two sets together; <*> will produce either Good((p1,p2)) or Bad(errors1 ++ errors2)
  val propsOpt: Result[(Props, Props)] = props1 <*> props2
// then we want to merge together two sets of patient properties; that's what we do in map
  val patientData = propsOpt map ((xy:(Props, Props)) => (xy._1 ++ xy._2))
  debug(s"Got patient data\n $patientData")

// and now we process the resulting patient properties: if the result was good, we push it on stack (we have Forth)
// if the result was bad, we return an error.
// implicits will convert Void to OperationResult.Success and error returns OperationResult.Error
  patientData.fold(
    push, // this is where my little embedded Forth suddenly kicks in
    bad => error(s"Failed to extract data for this patient - $bad")
  )

some scala

Aug. 23rd, 2013 01:13 pm
juan_gandhi: (VP)
"abc" take 40 does not crash while "abc".substring(0, 40) does.

So there.
juan_gandhi: (VP)
почему в субботу нельзя включать телевизор?

Я как-то недоумеваю, в четверг можно, а в субботу нельзя, а шо такое? Или и в четверг нельзя - а почему об этом по телевизору ничего не говорят, скрывают, что ли?
juan_gandhi: (VP)
под кутом
Read more... )
(10x [livejournal.com profile] alll)


def qsort[T <% Ordered[T]](list:List[T]):List[T] = {
  if (list.length < 2) list else {
    val pivot = list.head
    qsort(xs.tail filter (x>)) ++ (x::qsort(xs.tail filter (x<)))
  }
}


quicksort []     = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
    where
        lesser  = filter (< p) xs
        greater = filter (>= p) xs

toSource()

Aug. 10th, 2013 09:39 am
juan_gandhi: (VP)
В джаваскрипте есть ценный метод, toSource(); он, правда, только к функциям применяется - но я тут понарисовал для скалы, чтобы вот взял какую-нибудь структуру, и её в лог гонишь в таком формате, что можно потом прямо в юниттест вставлять, удобно ж.


List(List("Claim Number:", "19130723010200", "Date Paid:", "", "Date of Claim:", "07/16/1913", "Total Charges: 1", "1", "£1,350.00", "End Service Date:", "07/16/1913", "Plan Paid: 1", "1", "", "Status:", "IN REVIEW", "You Pay: 1", "1", "", "Member:", "LEOPOLD BLOOM", "", "", "Member ID:", "XXXXXXXXX-01", "", ""))
juan_gandhi: (VP)
It asks me how to do international calls, what's my country code and areacode. Weird.
juan_gandhi: (VP)
https://docs.google.com/document/d/1sC42GKY7WvztXzgWPGDqFukZ0smZFmNnQksD_lJzm20/edit?usp=sharing

Comments and questions are greatly appreciated.

"In this “paper” I explore the problem of mixing variance in Scala collections and propose a solution coming from category theory, making Scala collections more type-safe."

so

Jul. 24th, 2013 09:37 pm
juan_gandhi: (VP)
You know the stupid problem with Java/Scala collections: their contains() method takes any type; the explanation being that for this method to be type-dependent, we need contravariance, while collections are (mostly) covariant. So there.

Well, a natural transformation from a covariant functor to a contravariant is not only possible, it's a relatively popular thing. So, does it mean we can make contains() method type-dependent? The answer is YES!

  trait MyList[+T] { // declare a simple collection, e.g. list; it is covariant
    def head:T
    def tail:MyList[T]
    def ::[U>:T](x:U) = HeadAndTail(x, this)
    def size: Int
  }

  case object EmptyList extends MyList[Nothing] { // it's okay that it's a list of Nothing
    def head = error("This list is empty")
    def tail = error("this list is empty")
    def size = 0
  }

  case class HeadAndTail[T](head:T, tail: MyList[T]) extends MyList[T] {
    def size = 1 + tail.size
  }
// All the stuff above allows us to treat lists in a covariant way, like this:
      case class A(name: String) {override def toString = "A(" + name + ")"}
      case class B(override val name: String) extends A(name) {override def toString = "B(" + name + ")"}

      val listB = B("1") :: B("2") :: EmptyList
      listB.size must_== 2
      val listA = A("3") :: listB
      listA.size must_== 3
      val listC: MyList[Any] = listA
// See, MyList is covariant, so if B is a subtype of A, List[B] is a subtype of List[A]

And now... introduce a contravariant trait:
  
  trait Container[-T] {
    def contains(t:T): Boolean
  }

// and the natural transformation from MyList[+T] to Container[-T]:

  implicit def asContainer[T](list:MyList[T]): Container[T] = new Container[T] {
    def contains(t:T) = list.size > 0 && (list.head == t || asContainer(list.tail).contains(t))
  }

And it works. I can draw the appropriate commutative diagrams later, if it is not obvious.

      listA contains A("3") must beTrue
      listA contains B("1") must beTrue
//      listA contains "abracadabra" is a compilation error
      listC contains "abracadabra" must beFalse
      listC contains B("2") must beTrue



Questions? :)

I think it's cool; category theory applied directly to solve a code design problem.
juan_gandhi: (VP)
Тут где-то в окрестностях обсуждают вопрос сложности написания многоэтажных джойнов.

Да блин скажите спасибо, что они есть вообще, что нашлись добрые умные люди, впендюрили это населению, уже слово "курсор" почти вышло из употребления.

Джойн, многоэтажный ли, одноэтажный ли - это pullback, предел определённой диаграммы. Имеет универсальные свойства. Правильная конструкция.



P.S. Это я к тому, что вчерашний вечерок и сегодняшнее утро провёл в некотором недоумении, потому что в моём функциональном коде, извлекающем смысл из таблиц, нет ни одной var, но при этом тесты весело вылетали по NPE. Можно винить jvm с порядком инициализации, можно винить скалу, которая не в состоянии организовать этот порядок... решение то же, что и в скале когда-то - суём нужный объект внутрь класса, и он инициализируется при загрузке класса; в скальной форме это означает, что вместо val пишем object - может, в этом и есть сермяжная правда, хз.
juan_gandhi: (VP)
http://jscala.org/

Генерация джаваскрипта из скалы.
juan_gandhi: (VP)
scala> List(1,2,3) contains ((n:Int) => n > 0)
res1: Boolean = false

Profile

juan_gandhi: (Default)
Juan-Carlos Gandhi

November 2025

S M T W T F S
       1
23456 7 8
9 1011 12 1314 15
16171819 20 2122
23 24 252627 28 29
30      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Nov. 30th, 2025 06:34 pm
Powered by Dreamwidth Studios