Fork me on GitHub
#clojure
<
2016-08-30
>
richiardiandrea00:08:49

@drewverlee to me, clojure.spec and plumatic/schema are comparable in terms of what they do, that is specification, validation and then data generation (actually both piggiebacking on test.check

richiardiandrea00:08:41

I used to use schema and apart from a few quirks I found it very nice, especially because it was data oriented (specs are maps)

richiardiandrea00:08:29

clojure.spec has a couple of differences but still works quite nicely, and I opted to use it for my newer projects (together of course, with the team I am working with) mainly because it is going to be in the language "core" and therefore directly maintained

richiardiandrea00:08:55

about clojure.spec some function does not accept pure data it seems (found a couple of example macro that does not accept data), but probably things are going to change (it is still alpha code)

richiardiandrea00:08:52

I have never used scjsv but the big difference I see is that it does validation of the data input your receive "from the wire" as JSON

richiardiandrea00:08:41

schema and spec can do both validation of data "from the wire" (after conversion) and "runtime" data

richiardiandrea00:08:56

while the program is running

Drew Verlee00:08:24

thanks @richiardiandrea. I think part of what im confused about is if something like protocal buffers (by google) are only concerned with encoding & decoding or if they can play a similar role in data validation. It seems like the answer is yes. But obviously you can only take advantage of this if the sender has decided to offer the option.

richiardiandrea00:08:43

I think the offer some kind of validation yes, because when you cannot de-serialize correctly they throw. I am not very familiar with protobuffer too much and I would investigate if there is in-depth error detailing for instance, which is actually a big thing in clojure.spec (each data piece is reported together with the error)

lambeta00:08:04

Hey, hivemind

(continuous-take-while #(not= % "END") ["START" "MIDDLE" "END" "START" "MIDDLE" "END"])
;;=> [["START" "MIDDLE"] ["START" "MIDDLE”]]
any idea to implement this function?

lfn301:08:30

@lambeta loop with a take-while and skip using the count from the last collection you take-whiled?

radon01:08:11

(->> ["START" "MIDDLE" "END" "START" "MIDDLE" "END"] (partition-by #{"END"}) (partition 2) (map first))

danboykis01:08:13

@lambeta is this close enough to what you want? (remove #(= % ["END"]) (partition-by #(not= % "END") ["START" "MIDDLE" "END" "START" "MIDDLE" "END"]))

gfredericks01:08:59

I think the function is underspecified

radon01:08:08

Note that my solution will break if you have two consecutive instances of ”END”

radon01:08:25

Combining my solution with @danboykis’s we get

(->> ["START" "MIDDLE" "END" "START" "MIDDLE" "END"] (partition-by #{"END"}) (remove #{[“END”]}))

radon01:08:44

This is more robust.

gfredericks01:08:59

(constantly [["START" "MIDDLE"] ["START" "MIDDLE"]]) ;; also works

danboykis01:08:41

I like gfredericks' solution if that's all you want

lambeta01:08:36

@danboykis I implemented it with this solution. but just think it’s a little ugly. because we need remove the “[END]"

lambeta01:08:06

@gfredericks that’s hard code, right?

gfredericks01:08:05

I doubt it's what you wanted but my point is you weren't very specific about what you wanted because you didn't explain what sort of variety there is in the input

gfredericks01:08:09

or how the input and output relate

gfredericks01:08:50

oh wait I didn't read closely enough

danboykis01:08:51

@lambeta you can write a custom loop/recur that wouldn't remove, but it's not as short

gfredericks01:08:20

I somehow misread and thought you had only given the input and output :)

danboykis01:08:58

also I assumed continuous as part of the name implied you're working on potentially infinite sequences

lambeta01:08:31

one second, let me prepare the whole problem.

lambeta01:08:21

I have a file named molecules like this:

COMPND      AMMONIA
ATOM      1  N  0.257  -0.363   0.000
ATOM      2  H  0.257   0.727   0.000
ATOM      3  H  0.771  -0.727   0.890
ATOM      4  H  0.771  -0.727  -0.890
END
COMPND      METHANOL
ATOM      1  C  -0.748  -0.015   0.024
ATOM      2  O  0.558   0.420  -0.278
ATOM      3  H  -1.293  -0.202  -0.901
ATOM      4  H  -1.263   0.754   0.600
ATOM      5  H  -0.699  -0.934   0.609
ATOM      6  H  0.716   1.404   0.137
END
and then I read it by (line-seq (io/reader "molecules")), finally I want to output looks like this
(("AMMONIA" ("N" "0.257" "-0.363" "0.000") ("H" "0.257" "0.727" "0.000") ("H" "0.771" "-0.727" "0.890") ("H" "0.771" "-0.727" "-0.890")) ("METHANOL" ("C" "-0.748" "-0.015" "0.024") ("O" "0.558" "0.420" "\
-0.278") ("H" "-1.293" "-0.202" "-0.901") ("H" "-1.263" "0.754" "0.600") ("H" "-0.699" "-0.934" "0.609") ("H" "0.716" "1.404" "0.137")))

lambeta01:08:07

this is my solution:

(defn read-all-molecules [input-file]
  (map (fn [molecules]
         (let [[_ name] (str/split (first molecules) #"\s+")
               atoms (map (comp (fn [[_ _ & type-coordinates]]
                                  type-coordinates)
                                     #(str/split % #"\s+"))
                               (rest molecules))]
           (concat [name] atoms)))
       (filter #(not= % ["END"])
               (partition-by #(= % "END") (line-seq (io/reader input-file))))))

richiardiandrea01:08:51

@lambeta personally I would divide the mapping in two, the first identifying a "compound" and then an "atom". It seems to me it would simplify the solution a bit

radon01:08:20

{:compound […] :atoms […]}

richiardiandrea01:08:21

maybe similarly to a two-way parsing...the output can be the above or [{:compound {:atoms []} {:compound {:atoms []}}] depending on your requirements

radon01:08:30

I was thinking the most natural way to represent it would be

[{:compound “AMMONIA” :atoms [{:atom “N” :x 0.257 :y -0.363 :z 0.000} …]} …]

radon01:08:13

You want to pick the data structure that will be the easiest to understand and manipulate, in general.

ramji01302:08:18

Hi All, I am new to Clara rules. One of my usecase I supposed to iterate list of object and perform validations in clojure. Anyone could you please suggest an approach, how it can be done?

nathanmarz02:08:30

@lambeta Specter has this functionality built-in:

(select (continuous-subseqs #(not= "END" %))  ["START" "MIDDLE" "END" "START" "MIDDLE" "END"])
;; => [["START" "MIDDLE"] ["START" "MIDDLE"]]

nathanmarz02:08:07

can also do transformations with it:

(transform (continuous-subseqs #(not= "END" %))
  (fn [v] [(count v)])
  ["START" "MIDDLE" "END" "START" "MIDDLE" "END"])
;;=> [2 "END" 2 "END"]

hagmonk03:08:27

I've been noodling on this and feel unsatisfied with some of the approaches I've tried … I want to go from [{:a 1 :b 2} {:a 3 :b 4 :c 5}] to {:a [1 3] :b [2 4] :c [5]}

dpsutton03:08:33

(merge-with (comp conj vector) {:a 1 :b 2} {:a 3 :b 4 :c 5})

dpsutton03:08:43

except that left 5 not in a vector

hagmonk03:08:28

yah that's one of the wrinkles

hagmonk03:08:44

I thought maybe reduce-kv to set- or vec-ize the values first

hagmonk03:08:14

I started to rathole on trying to minimize the number of steps 🙂

hagmonk03:08:09

oh and that doesn't build a flat vector or set of values, which I'd also like: (comp conj vector) {:a 1 :b 2} {:a 3 :b 4 :c 5} {:a 6 :b 7 :c 8}) => {:a [[1 3] 6], :b [[2 4] 7], :c [5 8]}

hagmonk03:08:34

instead of :a [1 3 6] etc

dpsutton03:08:34

(merge-with list {:a 1 :b 2} {:a 3 :b 4 :c 5})

hagmonk03:08:59

ah that puts me on the right track ... (merge-with (comp flatten list) [{:a 1 :b 2} {:a 3 :b 4 :c 5} {:a 6 :b 7 :c 8}])

hagmonk03:08:11

=> {:a (1 3 6), :b (2 4 7), :c (5 8)}

dpsutton03:08:15

i'm not sure why this doesn't work actually

dpsutton03:08:35

i think its blowing up on me making a vec from v, but it seems right to me

dpsutton03:08:22

ah because (vec 5) blows up

hagmonk03:08:11

(vector 5) works

hagmonk03:08:39

I still feel like flatten shouldn't be required … this still feels like it should be a one-pass fold

Chris O’Donnell03:08:48

@hagmonk: does your function only take two maps, or can it take arbitrarily many?

Chris O’Donnell03:08:07

oh I see, there's 3 above

hagmonk03:08:07

arbitrarily many … same keys in each map though

dpsutton03:08:11

(merge-with (comp conj vector) {:a 1} {:a 2})

dpsutton03:08:44

but that requires the flatten

dpsutton03:08:52

ha don't overthink it. if its a vector, conj it, other wise make a vector of the two

Chris O’Donnell03:08:30

@dpsutton: there has to be a final pass where keys that are not in collections get put into vectors, as well

Chris O’Donnell03:08:40

something like (into {} (map (fn [[k v]] [k (if (vector? v) v (vector v))]) merged-maps))

dpsutton04:08:41

get all the keys from all maps, and reduce over each key, making a vector of all of the values

dpsutton04:08:13

although you could argue that getting all of the keys across all maps is double enumerating

didibus04:08:31

Is it possible to mix a protocol with a multi-method?

didibus04:08:18

Like I want to extend a type, but I want different implementations for each combination of type/first-argument

hagmonk04:08:51

if you know the keys in advance (which I do in this case)

yonatanel12:08:36

Why is threading macro not working with deref?

(-> uri @(http/get))

gfredericks12:08:14

Because deref magically adds extra parentheses and so changes what the threading macro does

yonatanel12:08:02

i see. it works if i separately use (deref)

gfredericks12:08:41

Try using the deref function instead and it should be less tricky

abdullahibra12:08:20

is there way a good way to generate sentence from some words, which will discover the relations between them, for example:

abdullahibra12:08:10

#{Alice shoe train} -> maybe generate: alice wear shoe in the train ?

kaffein13:08:45

abdullahibra I think it's more an algorithmic/semantic issue than a clojure issue

achesnais13:08:17

yeah @abdullahibra that’s some advanced linguistics and/or machine learning you’d need 🙂

kaffein13:08:01

You can also try to dive in Natual Language Processing abdullahibra 🙂

abdullahibra13:08:43

okay great guys

dialelo13:08:56

@yonatanel see what that desugars to:

user=> (clojure.pprint/pprint (clojure.walk/macroexpand-all '(-> uri @(http/get))))
(clojure.core/deref uri (http/get))

yonatanel15:08:49

Has anyone compared or experienced core.async vs manifold vs pulsar?

andreas-thoelke15:08:52

@yonatanel All three are great I think, each one has it's strengths. I use all three in one app - they go together nicely and are supplementary in many aspects. Just starting though, so I can't speak about stability and how things will turn out long term.

yonatanel16:08:28

@andreas-thoelke What are your reasons to use each one?

dpsutton16:08:16

i've been reading over the manifold source and the ability to treat channels as streams and seq's seems pretty nice

dpsutton16:08:21

and splicing things into each other, etc

andreas-thoelke16:08:01

@yonatanel If you want to model complex async processes, Pulsar actors allow you to do this very easily (partly due to the good documentation and core.match being integrated). I find doing similar things in Manifold more abstract/challenging/ takes more time to learn/ has fewer examples/docs.

yonatanel16:08:47

@andreas-thoelke Good to know. Would you migrate everything to Pulsar or do you have particular reasons to use core.async and manifold?

andreas-thoelke16:08:56

@yonatanel core.async is more about connecting parts of your system, rather then a general async/event driven lib. I think Manifold is very elegant when it comes to chaining deferreds/promises and combining and inspecting stream graphs.

andreas-thoelke16:08:49

Pulsar is very feature rich (it basically has reactive programming and core.async included), it's still pretty exotic in the community, so you'll probably only want to buy into Pulsar if you want actors.

fabrao16:08:18

Hello all, WTF is that ?

(slurp "temp\2meses.csv")
-> Invalid digit: m

fabrao16:08:57

this is just a text file

chronno16:08:21

@fabrao it has to do with the backslash in your string. If you want a literal backslash in your string you have to escape it: "temp\\2meses.csv", otherwise java thinks what follows is an octal number representing a char. That's why it says 'Invalid digit: m', m is not a valid digit in an octal number.

fabrao17:08:12

Ouch! I´m dumb as* rs, sorry !!!

flyboarder17:08:17

Hello everyone, looking for devs in the Edmonton area who may be interested in a clj meetup.

andrei17:08:18

I mean will it be streamed?

flyboarder17:08:12

@andrei: depends on the venue

flyboarder17:08:16

We are working with Startup Edmonton to use their space or a partner

andrei17:08:07

one sec, where is edmonton?

andrei17:08:11

in Finland?

nkraft17:08:23

That would be Alberta, Canada, yes?

andrei17:08:44

nvm what I said before, I confused channels :LOL:

mnewhook17:08:18

erg, if I have some sequence of stuff like [“a” "b” “c” “d”] how do I say set each of these elements to true in a map?

spei17:08:58

@mnewhook my implementation is pretty naive:

(reduce (fn [m k] (assoc m k true)) your-map ["a" "b" "c" "d"])

mnewhook17:08:08

arg, ok I was trying reduce-kv. Yeah that works 🙂 Thanks!

stand17:08:10

Like this?

(zipmap ["a" "b" "c" "d"] (repeat true))

richiardiandrea18:08:26

@flyboarder: maybe you are already aware of it, but there is also a #C0736RLDT channel

stand18:08:39

It's like the #clojure channel except more polite.

flyboarder18:08:33

@stand: lol like #clojure but we apologize for posting 😂

stand19:08:53

(def str (fn [& args] (apply clojure.core/str (conj args "Sorry, "))))

hagmonk20:08:35

does anyone here know of strategies for maintaining relationships between caches? e.g. let's say I cache some data and compute some roll-up data based off it. I want properties like automatic, efficient re-calculation of the roll-up should any origin cache data change. sort of like a materialized view.

hagmonk20:08:26

it feels like a very well-worn area but I'm not finding a lot of papers or libraries that talk about techniques, either in clojure or java

hiredman20:08:01

I think generally the solution would be to cache one or the other

reitzensteinm20:08:16

I actually have a plan to build a library around this

reitzensteinm20:08:30

not that it helps you in the least right now 🙂

hagmonk20:08:44

heh, not immediately anyhow!

reitzensteinm20:08:10

I tend to build a cache invalidation system, where caches can depend on multiple keys, then you can touch any of them to invalidate anything that depends on them

reitzensteinm20:08:27

then you have a background process that checks the cached vs real value for the computation, to make sure you didn't miss anything

reitzensteinm20:08:32

as a general solution, it would be hard to beat

hagmonk20:08:43

that's basically it, in a nutshell

hagmonk20:08:19

so I had this idea that you could register a function that takes a cache entry and maps it to a key, and another function that maps it to a value

hagmonk20:08:50

so for an origin cache, one function represents the relationship with the "downstream" cache key, and the other function can be used to recompute the downstream cache value

hagmonk20:08:27

and maybe that JCache listeners or events would be a neat way to glue things together

hagmonk20:08:58

but then I got that "am I reinventing the wheel?" feeling …

cdine20:08:46

Is there a way to see through wats going on under my lein build? A verbose log or sorts ?

hiredman20:08:59

there is the DEBUG env variable

cdine20:08:00

Lein did set my hair on fire today.. Have a few java files to compile and have the right :java-source-paths configured in project.clj... yet it doesn't compile any of the files...

hiredman20:08:27

I would work backwards from there

hiredman20:08:36

what makes you think it isn't compiling the files?

cdine20:08:50

checked the target folder...

cdine20:08:03

and of course imports fail with classnotfound

hiredman20:08:31

what tasks have you run since you added that to lein?

cdine20:08:31

This used to be working until today.. I have just removed a few libs today from project clj ... and stopped working (dont see any correlation obv).. tried lein clean and a lein repl

hiredman20:08:53

lein compile

hagmonk20:08:43

@hiredman does :aot :all influence java classes like this?

hiredman20:08:58

lein javac is specifically the task that compiles java source, but it is setup to run before a few other built in tasks like compile and jar

hiredman20:08:17

I would sort of expect it to run before lein repl too

hiredman20:08:46

are you using any plugins?

cdine20:08:20

I was expecting it to run before lein repl ... anyway just tried lein compile with no luck

hiredman20:08:28

if you are using any plugins, you should disable them all, one of them could be fiddling with whatever, you should also double check your project.clj

cdine20:08:57

just cljsbuild plugin

hiredman20:08:30

roll back to a previous version, and see if that does in fact build the classfiles, if lein clean isn't a regular thing you do, you could have broken compiling a while back and been using stale class files in target/ since then

hiredman20:08:46

definitely try disabling cljsbuild

cdine20:08:19

yeah, will be doing just that...

hagmonk20:08:40

I'd try lein new ... and try to get a hello-world java class compiling by itself

hagmonk20:08:24

even better if it's a known working example off github or whatever. if you can't get that working it's your local environ

hiredman20:08:01

if there was some issue with that, like a missing jdk or whatever, then lein would complain

cdine20:08:12

Haven't done clean for weeks... so yeah I might have been working on a stale set... might have broken in between..

dpsutton20:08:31

does anyone know why my app might see a suitable driver for microsoft sql server when run from lein ring server but not from tomcat8? running from command line works on the same server

hiredman20:08:36

if you've never played with git bisect, it is very cool

cdine20:08:13

I have not... @hiredman , thanks for the suggestions.. let me narrow it down..

hagmonk20:08:36

@dpsutton in similar cases I've looked at the classpath in the process to verify they're the same

dpsutton20:08:56

i'm not specifiying a classpath for either. They both list their dependencies and can load them all

hagmonk20:08:36

I mean the classpath that lein provides when it invokes the jvm for you

dpsutton20:08:43

but i can run it on fedora 24, windows, but not ubuntu 16.04

dpsutton20:08:02

ah. how would i go about finding that?

dpsutton20:08:25

we are a .NET shop so java is half familiar, half completely foreign to me

hiredman20:08:29

tomcat may do something weird with classloaders, so whatever classloader ends up trying to load the class can't find it, you may need to explicitly load it from some other classloader

dpsutton20:08:30

especially with tooling and setup

hagmonk20:08:45

I'd use VisualVM

dpsutton20:08:06

the strange thing is that we were running everything fine under tomcat7/14.04/java7 but recently updated to java8/16.04/tomcat8 and all has gone to hell

hagmonk20:08:15

I'm pretty sure you can attach and get classpath from there, and it will be much nicer than grepping process lists

hiredman20:08:32

try something like (.loadClass (.getClassLoader clojure.lang.RT) "whateverthedriversclassnameis") at the top of your source file

hiredman20:08:29

com.microsoft.sqlserver.jdbc.SQLServerDriver

dpsutton20:08:14

(.loadClass (.getClassLoader clojure.lang.RT) "com.microsoft.sqlserver.jdbc.SQLServerDriver")?

hiredman20:08:06

yeah, something like that, that might not be the correct classloader method

dpsutton20:08:17

hmm, no such luck

dpsutton20:08:40

i ran it from lein on the server, verified it worked, then compiled it there and moved it to a directory so tomcat could see it, and no luck

dpsutton20:08:39

and in the webapps folder, in the lib i've got sqljdbc4-3.0.jar, which should be all that i need

hagmonk21:08:56

you can put jars directly on to the classpath if necessary

cdine21:08:44

@hiredman , I figured it , but its puzzling.. I have a dev profile which adds 'dev' folder (containing user.clj) to the :source-paths... If I remove :source-paths from dev profile, everything works fine.. java files do compile... if I add it back, it doesn't compile any of the java files.. any thoughts ?

akiva21:08:25

I’m looking to read an image file from disk and store it in a database. Does anyone have a quick link on the best way to do this (hopefully just using `http://clojure.java.io)?

akiva21:08:02

Storage isn’t the issue. I’m just wondering the most idiomatic way to read a binary file.

danielcompton21:08:04

though not the most efficient

hiredman21:08:18

cdine: the dev profile is overwriting the whatever the default profile is

hiredman21:08:27

instead of merging

akiva21:08:46

@danielcompton, ah, I was under the impression that slurp only handles strings.

danielcompton21:08:59

slurp handles many many things

akiva21:08:05

Well, let’s give it a go.

hiredman21:08:16

slurp returns a string and goes through a reader, it is not appropriate for binary data

danielcompton21:08:45

oh returns a string yes

hiredman21:08:00

use a ByteArrayOutputStream

hiredman21:08:18

copy an input stream in to it, call toByteArray on it

cdine21:08:26

guess so.. But its supposed to merge.. at least as per the docs...

hiredman21:08:57

cdine: the exact thing lein does to combine profiles is kind of complicated

dpsutton21:08:20

This is just a weird statement to me: "Latest stable release: 0.6.2-alpha3"

dpsutton22:08:51

just throwing this out there, but this doesn't look like an invalid connection string for sql server, does it?

dpsutton22:08:17

java.sql.SQLException: No suitable driver found for jdbc:sqlserver://[servername];database=[database];user=[user];password=[password]

dpsutton22:08:29

the jdbc:sqlserver:// prefix isn't invalid by any chance is it?

dpsutton22:08:40

i'm just real sick of this issue and grasping at straws here

hagmonk22:08:31

god I hate this stuff, struggled with it too

dpsutton22:08:41

worst part is everything worked until an upgrade

dpsutton22:08:50

and it works on all machines except when run through tomcat

hagmonk22:08:22

are you using a connection pooler like Hikari or just straight up connection?

dpsutton22:08:28

straight up

dpsutton22:08:34

just an internal tool for us 5 developers

hagmonk22:08:00

(aside: connection pooler stuff is kinda cool for enqueuing work against the DB, not just load, I was sold after using Hikari CP)

hagmonk22:08:50

you're using com.microsoft.sqlserver.jdbc.SQLServerDataSource?

dpsutton22:08:20

[com.microsoft/sqljdbc4 "3.0"]

dpsutton22:08:29

as the 3.0 version is on maven so i don't need to keep it locally

hagmonk22:08:40

and using clojure.java.jdbc

hagmonk22:08:21

basically, clojure.java.jdbc/get-connection is where all the magic happens

hagmonk22:08:36

java.sql.DriverManager/getConnection is passed the string you supply as a URI

hagmonk22:08:08

so you could take a step back and try some non-URI connection parameters as specified in the doc string for get-connection.

dpsutton22:08:34

problem is that this hasn't changed. only the upgrade java 7 -> 8, ubuntu 14.04 -> 16.04

dpsutton22:08:50

but i was thinking of changing over to the map style

dpsutton22:08:54

just to see if that worked

hagmonk22:08:04

could java 7 -> 8 have rolled java.sql.DriverManager? if so that could definitely affect it

dpsutton22:08:06

but i'm running java 1.8 on windows and fedora 24 and both work

dpsutton22:08:16

what do you mean rolled java sql DriverManager?

hagmonk22:08:43

I'm not sure if that library is pulled in as a transitive dependency by clojure.java.jdbc or whether it's part of the JDK itself

hagmonk22:08:02

if the latter, bumping java versions could have changed it and caused it to break

dpsutton22:08:23

is there a way to restore it then? or to check to see if this is indeed the issue?

dpsutton22:08:31

and thanks so much for all of your help by the way

hagmonk22:08:55

oh no worries, I totally tore my hair out getting pgjdbc-ng to work and learned more about this than I wanted to know

dpsutton22:08:31

so here's another wrinkle. I rolled java backl to version 7 and everything works again

dpsutton22:08:49

like without doing anything. tomcat7 points to the same war file haha

dpsutton22:08:55

oh java. this is crazy talk

hagmonk22:08:20

this whole java.sql.DriverManager thing is basically taking a string and then trying to figure out "I wonder if I have a class somewhere I can reach that understands this kind of connection?"

hagmonk22:08:41

so I feel it's sensitive to deployment environment, config, and platform changes

dpsutton22:08:42

yeah. that seems crazy to me that its a runtime check

dpsutton22:08:54

how could you every really be comfortable

dpsutton22:08:14

its crazy to me that i'm not saying sql server dep and at compile or link time its saying all of this is present and accounted for

hagmonk22:08:56

well it's not only just present, but that also the driver groks the rest of the connection args you've passed in as params

hagmonk22:08:24

so being explicit with a map at least lets you rule out some uncertainty to begin with

dpsutton22:08:06

appreciated

dpsutton22:08:26

got it back online with java 7 and i'll try some more stuff tomorrow to see if i can get it working with java 8

shaun-mahood22:08:30

@dpsutton: have you tried the other sq server driver? [net.sourceforge.jtds/jtds "1.3.1"]? Not sure it's even remotely related.

dpsutton22:08:32

again thanks so much for your time

dpsutton22:08:49

can it talk to microsoft sql server?

dpsutton22:08:53

if so i'm interested

dpsutton22:08:09

but sean corfield mentions he only tests against 4.0 of microsoft's driver, which they make you download

dpsutton22:08:12

rather than distribute

dpsutton22:08:39

hmm. i think i'm hitting sqlServer 2014 which is not in the list of supported servers here

hagmonk22:08:41

@dpsutton also, what you'll want to do tomorrow is find the javadoc for version 3.0 of the driver, since it tells you the other keys supported when you use get-connection

dpsutton22:08:43

i'll try it

dpsutton22:08:12

thanks hagmonk. I've got to run now but yall have been super helpful

hagmonk22:08:21

:thumbsup:

shaun-mahood22:08:48

@dpsutton: i just read the jdbc docs and it looks like he tests against both, as far as I know the jtds driver is preferred and recommended over the ms one - I use it all the time and have never had an issue using it to talk to ms sql server.

danielcompton22:08:25

Is there a clojure/core predicate which matches lists, sets, and vectors, but not maps?

cfleming22:08:07

In case anyone is into Gradle, I just released the plugin I use to compile Cursive with: https://github.com/cursive-ide/gradle-clojure

gfredericks22:08:39

`(every-pred coll? (complement map?))

gfredericks22:08:41

(every-pred coll? (complement map?))

danielcompton22:08:27

that’ll do it. Thanks!

cfleming23:08:37

@gfredericks If I ever form a hipster band, I’ll call it emacs glitch

hagmonk23:08:58

@cfleming and only one band member can play at a time, right?

cfleming23:08:51

And all the instruments require you to press each string twice with a minimum of three fingers per press.

hagmonk23:08:32

And each instrument is homemade and not interchangeable, of course

cfleming23:08:22

I think this idea has legs

cfleming23:08:45

(although it should probably be moved to #off-topic at this stage)

hagmonk23:08:09

one more: the band hasn't improved at all since you saw them first in college, despite everything around them improving a great deal

gfredericks23:08:15

It has my full support