[JOB] Wanted Clojure/Lisp Job

2017-07-13 Thread jongwon.choi
 Hi,

I am in Sydney Australia, and looking for a job.



My current interests and skills/abilities are:

   - 
   
   Design and implementation of reusable team libraries using Clojure
   - 
   
   Design and implementation of microservices with Restful API using Clojure
   - 
   
   Design and implementation of SW develop process using Git and AWS
   - 
   
   Design and implementation of CI/CD using Jenkins, Git and AWS
   - 
   
   Design and implementation of automation using various scripts and AWS
   - 
   
   Design and implementation of advanced DB schema using PostgreSQL
   - 
   
   Design and implementation of a general Machine Learning architecture 
   using R and AWS
   
Most of above points are not individual level targets, but team level 
contribution. I am kin to build an “engineering shop” not a “sweat shop”. 



The main strength of me is, of course, Lisp programming. I love to express 
my ideas in Lisp programming languages(and to make myself and other 
colleagues free from non-programming tasks, I started working on SW 
development process, CI/CD, and automation).

I am very fluent with Clojure, Common Lisp, and Scheme. I can freely 
express my ideas with these Lisp dialects. 

My programming style is “make machines repeats” rather than “punch-in 
duplication using human labors”. Therefore, my code usually does not have 
any concept level duplication as well as implementation level duplication. 



Please feel free to ask my code examples to "oz dot jongwon dot choi" at 
Google Mail.



Thanks


- Jong-won Choi

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Practical ways to deal with 'bag-of-properties' syndrome, AKA dynamic typing?

2015-12-01 Thread jongwon.choi
Use defrecord. People still can mess by using it as map, but it is a different 
problem.

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


usage of "and"

2015-09-07 Thread jongwon.choi
Typo?

  (and cnt (pos? cnt))

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: Using a dynamic var for my database connection for implicit connections+transactions

2015-07-31 Thread jongwon.choi
Cut  paste from my own code base:

(def ^:dynamic *db-conn*)

(defmacro with-db-connection [ body]
  `(jdbc/with-db-connection [con# (get-db-conn)]
 (binding [*db-conn* con#]
   ~@body)))

A few points. Do not give any value to the dynamic var, make it unbound and 
make it fail early for unexpected usage. Set a value via binding and make a 
macro then use the dynamic var only through the macro (i.e., hide its 
existence)

That's how I normally use dynamic vars. Some people afraid of using it, but 
it is like a knife - If you know how to use it, it is useful to remove 
unnecessary complexity.


On Friday, 31 July 2015 10:44:31 UTC+10, J. Pablo Fernández wrote:

 Hello Clojurians,

 I found passing around the database connection to each function that uses 
 it very error prone when you are using transactions as passing the wrong 
 one could mean a query runs outside the transaction when in the source code 
 it is inside the with-db-transaction function. So I ended up defining the 
 db namespace like this:

 (ns db)

 (defonce ^:dynamic conn (atom nil))

 (defn connect!
   (reset conn (generate-new-connection)))

 (defn run-query 
   [query] (run-query query @conn)
   [query conn] (run-the-query-in-connection query conn))


 This is pseudo-code of course, simplified to highlight the part that I'm 
 most unfamiliar with:

 (defonce ^:dynamic conn (atom nil))

 The reason why it's an atom is so that connect! can *set* it and the 
 reason why it's a dynamic var is so I can do this:

 (jdbc/with-db-transaction
 [db-connection-with-transaction @db/conn]
 (binding [db/conn (atom db-connection-with-transaction)]
   (db/run-query SELECT *))

 and the query will be implicitly run inside the transaction. Does it make 
 sense? Is this wrong? will it fail in unexpected ways? Is there a better 
 way?

 Thanks.




-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: Advice for building backend REST services from scratch using clojure

2014-10-07 Thread jongwon.choi
With Lispy languages, you can do whatever you want without worrying too 
much about underlying web server, db, etc.

I use my own constructors like:


(define-crud-handler :employee [:path [customers cust-id sites site-id 
employees] :auth-required? true]
  {:collection {:create (employees-create cust-id site-id)
 :read (employees-collection-read cust-id site-id
   :req-params 
[number draw] [number start] [number length]

order search)
 :partial-update (update-employees-collection-pref [number cust-id] [number 
site-id]
  
 :req-params [keyword payment-schedule] next-pay-date)
 :delete employees-collection-delete
 }
   :element {:read (employees-element-read cust-id site-id employee-id)
 :update (employees-element-modify cust-id site-id employee-id)
 :delete employees-element-delete
 }})

...

(define-crud-fn employees-element-modify [cust-id site-id employee-id]
  (dl/update-item :employee
  {:site-id site-id :id employee-id}
  (into {} (map (fn [[k v]] [k [:put v]]) 
(get-json-parameters)))
  :return :updated-new))


In this way, I can maintain proper abstraction layers and free to change 
underlying web server or db.

On Friday, 11 April 2014 00:13:19 UTC+10, Kashyap CK wrote:

 Hi,
 I have the opportunity to build a set of services from scratch. I plan to 
 use clojure for this.
 I'd like to experiment with options available out there - options such as 
 - what webserver, what database etc. I'd like it very much if you could 
 share some of your experiences in this and possibly some pitfalls to avoid.
 Regards,
 Kashyap


-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: Advice for building backend REST services from scratch using clojure

2014-10-07 Thread jongwon.choi
With Lispy languages, you can do whatever you want without worrying too 
much about underlying web server, db, etc.

I use my own constructors like:


(define-crud-handler :employee [:path [customers cust-id sites site-id 
employees] :auth-required? true]
  {:collection {:create (employees-create cust-id site-id)
 :read (employees-collection-read cust-id site-id
   :req-params 
[number draw] [number start] [number length]

order search)
 :partial-update (update-employees-collection-pref [number cust-id] [number 
site-id]
  
 :req-params [keyword payment-schedule] next-pay-date)
 :delete (employees-collection-delete cust-id site-id)
 }
   :element {:read (employees-element-read cust-id site-id employee-id)
 :update (employees-element-modify cust-id site-id employee-id)
 :delete (employees-element-delete cust-id site-id employee-id)
 }})

...

(define-crud-fn employees-element-modify [cust-id site-id employee-id]
  (dl/update-item :employee
  {:site-id site-id :id employee-id}
  (into {} (map (fn [[k v]] [k [:put v]]) 
(get-json-parameters)))
  :return :updated-new))


In this way, I can maintain proper abstraction layers and free to change 
underlying web server or db.


-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


[ANN] Dynohub: DynamoDB client + transaction layer

2014-07-02 Thread jongwon.choi
Dynohub, a Clojure DynamoDB client with transaction layer

https://github.com/ozjongwon/dynohub


Dynohub is a transperent DynamoDB client with a port of transaction 
library(https://github.com/awslabs/dynamodb-transactions)

There are three layers of abstraction:
  * Dynohub  - a plain client layer
  * Dynolite - a handy client layer on top of Dynohub
  * Dynotx   - a transaction enabled client layer on top of Dynolite

(NOTE: All the limits of Amazon's transaction library also applied to 
Dynohub's transaction layer, Dynotx)

Using 'with-transaction' macro you can add transaction! An example (from 
test):

(deftest conflicting-tx-test
  (testing Conflicts
(setup-db)
(dt/with-transaction [t1]
  (dt/put-item test-table {:id conflictingTransactions_Item1 
:which-transaction? t1})
  (dt/put-item test-table {:id conflictingTransactions_Item2})
  (dt/with-transaction [t2]
(dt/put-item test-table {:id conflictingTransactions_Item1 
:which-transaction? t2 - I win!})
(utils/ignore-errors (dt/commit t1))
(dt/put-item test-table {:id conflictingTransactions_Item3})))
(is (empty? (dl/scan :_tx_table_)))
(is (empty? (dl/scan :_image_table_)))

(is (empty? (dl/get-item test-table {:id 
conflictingTransactions_Item2})))
(is (not (empty? (dl/get-item test-table {:id 
conflictingTransactions_Item3}
(is (= (get (dl/get-item test-table {:id 
conflictingTransactions_Item1}) :which-transaction?)
   t2 - I win!

Any bug reports will be appreciated.

Cheers

- Jong-won Choi

-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: ns/use/require/import inconsistent an confusing

2011-11-30 Thread jongwon.choi
Even though I've written only one toy web framework in Clojure[1], (I 
think) I know the difference.

Because there is documentation for use and ns, I'll add my own only :)

I interpret (use 'ns) as Use 'ns namespace within *current* namespace - 
from your example, 'user'. Usually for REPL.

(ns ...) is a definition of namespace. You can define any namespace in any 
file, I guess (I didn't try that but it seems it's the right thing to me).

I interpret (ns ns1 (:use 'ns2) as Define ns1 namespace and from ns1 
namespace use stuff in ns2 namespace. Usually for files.

I bet ns is a macro and use 'use' - that's what I'll do. You should try 
macroexpand those things to learn how it works and think such a way. Once 
you have this ability, when you see something new and read doc or usage of 
it, you can imagine if it is function or macro, and (for macro) how 
underlying macroexpansion would look like, etc.

[1]:https://github.com/defstruct/tbw

On Wednesday, 30 November 2011 22:06:04 UTC+11, j1n3l0 wrote:

 Also in a REPL you can do the following:

 user (use 'example.core)
 nil
 user 

 But in a source file you have to do:

 (ns stuff.core
   (:use 'example.core))

 I think I've seen the reason for this difference once before but can 
 someone more learned *please* explain :)

 

-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

ANN: template based web v0.1.0

2011-11-27 Thread jongwon.choi
Hello

I've just released the first RC1 of my first Clojure toy project[1].

This is basically old style put tags in HTML and process such tags in
your code. I copied the idea from html-template[2].

Because this is my first Clojure coding effort, there might be
mistakes. Any comment and suggestion will be appreciated.

You can check how to use tbw from an example application[3](copied
from Mark McGranaghan's Developing and Deploying a Simple Clojure
Web Application[4])

Thanks

Jong-won Choi

[1]:https://github.com/defstruct/tbw
[2]:http://weitz.de/html-template/
[3]:https://github.com/defstruct/tbw/blob/master/examples/adder.clj
[4]:http://mmcgrana.github.com/2010/07/develop-deploy-clojure-web-
applications.html

-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en


Re: Lookup on a symbol?

2011-11-27 Thread jongwon.choi
No that doesn't make any sense, but I (think I) know what is going on
there.

(:a 1 2) === (get 1 :a 2)

Jong-won

On Nov 25, 1:35 pm, jaime xiejianm...@gmail.com wrote:
 But we still don't know why it behaves like this and for what
 reason. does (:a 1 2) returns 2 make any sense??

-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en


Re: Lookup on a symbol?

2011-11-27 Thread jongwon.choi
I'd expect the same, but in the code (https://github.com/clojure/
clojure/blob/master/src/jvm/clojure/lang/RT.java)
get and getFrom do not raise any error.


On Nov 24, 6:30 pm, Sean Corfield seancorfi...@gmail.com wrote:

 (:a 1 2) yields 2 which surprises me a bit... I'd expect an error
 because 1 is not a collection that :a can look itself up in.

-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en


Re: Getting index of char from end

2011-11-13 Thread jongwon.choi
Andreas, how're you doing? Frankly my impression of Clojure is just
like this posting.

You know usually with Common Lisp my common sense works - it provides
more than I expect. With Clojure I have to double check because my
expectation is more than Clojure provides, mostly.

And it ends up being using Java side - which might be more than I
expect in a harsh way! (It is like doing assembly programming in C)

I believe Clojure is great for Java programmers but not sure for
Common Lisp programmers. But it is definitely an interesting toy! (I'm
writing a toy web framework in Clojure to see how far I can go)

Hope you're doing well!
(PS: You shouldn't put such code into ADO production code! :-)

On Nov 13, 7:55 pm, Andreas Kostler andreas.koestler.le...@gmail.com
wrote:
 How about using the clojure sequence functions?
 (require '[clojure.contrib.seq-utils :as seq-utils])
 (defn last-index-of [c string]
  (first (seq-utils/find-first (fn [[_ a]] (= a c)) (reverse
 (seq-utils/indexed string)
 P.S. Jong Won, how are you liking Clojure? I've met you in Parramatta
 and joined the ADO team :) Nice to have you on the group here :)
 Cheers
 Andreas


-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en


Getting index of char from end

2011-11-11 Thread jongwon.choi
Hi

I'm wondering the best way to express:

 (position #\a abba :from-end t)

Should I use interop?

 (.lastIndexOf abba (int \a))

Thanks!

-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en