Fork me on GitHub
#clojure
<
2017-11-14
>
hlolli10:11:10

Can it be that clojure spews out [email protected] file-directories when useing io/file within for loop. Wondering how I can prevent this.

hlolli10:11:16

This is in the target directory, so maybe this is expected?

tatut10:11:51

for produces a lazy sequence

hlolli10:11:22

useing doall did not prevent this

tatut10:11:52

possibly something is getting a name for a directory by calling str on the lazy sequence

hlolli10:11:03

yes that's right, I call .isAbsolute .exists .getPath and .getName.

hlolli10:11:39

well, maybe this is harmless and I just let them be or remove them when needed.

hlolli11:11:19

even more percice, this is inside the lazy sequence (io/file (str proj sep) classp)

tatut11:11:16

why the (str proj sep)?

hlolli11:11:48

yes it's stupid, should only be proj and classp.

Bravi11:11:45

hello. I’m trying to do a simple http call using using clj-http package:

(defn -main
  []
  (client/get ""
              (fn [response] (println response)))

Bravi11:11:58

and I’m getting the following error

Bravi11:11:00

Exception in thread "main" java.lang.RuntimeException: EOF while reading, starting at line 4, compiling:(samsing/core.clj:10:1)

hlolli11:11:54

missing a closing parenthesis there?

Bravi11:11:31

ah damn it 😄

Bravi11:11:43

I feel so stupid haha

hlolli11:11:52

been there 😉

Bravi11:11:34

thank you, that solved it

Bravi12:11:19

and one more question 😄 it doesn’t seem to decode to json, no matter what option I pass

Bravi12:11:29

for example I’m doing the following

Bravi12:11:49

client/get url {:async? true :as :json} handle-response handle-exception

bpiel13:11:08

I'm looking for a debugging library I saw recently (on reddit, probably), but can't seem to find it now. I only looked at it for a moment, but I believe it involved one or more macros for writing values to an atom. Something like that. Anyone know what I'm talking about?

madstap13:11:13

I put my lib in #announcements recently, and it involves some functions for putting stuff in an atom. They're not macros though, just functions. Lib: https://github.com/madstap/hugin Blog post: https://madstap.github.io/posts/dbg/

bpiel13:11:26

That's it! thanks. I checked #announcements, before posting this, but I guess I missed it.

bpiel13:11:13

I used to use spyscope (but it stopped working for me??), then I wrote sayid, but sometimes I still use def and pprint. Some of those times, I think I want something like hugin.

madstap13:11:39

Looks like slack swallowed it...

madstap13:11:11

Yeah, def and pprint work great, but you have to put them in a do. Apart from the debug atom, hugin has def< and pp< respectively that you can wrap around an arbitrary expression without changing how the code works.

fabrao13:11:49

is there any way to "transduce" this?

(frequencies
   (reduce #(if (not (nil? (:samplevalue %2)))
                          (conj %1 (.intValue (:samplevalue %2)))) []
                       (qos/device-qos-range origem device qos alvo inicio fim))) 

fabrao13:11:50

device-qos-range returns collection of numbers

fabrao13:11:06

[1 2 3 100 200 ...]

reborg13:11:29

literally, more or less this:

(frequencies
  (eduction
    (keep :samplevalue)
    (map (memfn intValue))
    [{:samplevalue 3.1} {:samplevalue 2} nil]))

reborg13:11:55

you have the :samplevalue to deal with

reborg13:11:55

(update, just added)

fabrao14:11:14

@reborg Thanks, I´ll try it

fabrao14:11:45

why frequencies does not be in transduce args?

reborg14:11:17

there is no frequencies transducer

fabrao14:11:49

it´s so confuse 😐

fabrao14:11:57

so keep and map are "transdusible" ?

uwo14:11:55

they provide an arity that returns a transducer

rinaldi15:11:20

Has anyone ever used docjure for Excel file generation? Having an issue where even though I specify :data-format it doesn't ever get applied to the generated file.

reborg15:11:10

actually frequencies is the reducing step here @fabrao so you can compact everything into:

(transduce 
 (comp 
  (keep :samplevalue) 
  (map (memfn intValue))) 
 (completing #(assoc! %1 %2 (inc (get %1 %2 0))) persistent!) 
 (transient {}) 
 [{:samplevalue 3.1} {:samplevalue 2} nil])

fabrao15:11:21

@reborg about performance, what do you think is most performatic?

reborg15:11:58

how big is input coll?

fabrao15:11:17

@reborg too much isn´t? It´s a timeseries informations

reborg15:11:36

not particoularly I guess...

reborg15:11:45

so the benchmark are roughly the same

reborg17:11:36

@fabrao Depending how important speed is, the parallel solution is twice as fast, at the price of the increased complexity. I collected all in a gist: https://gist.github.com/reborg/37c76a61c9a60ddae8de737170e2e675 Before going parallel like this tho (with mutation, side-effects and whatnot), I'd carefully weight pro and cons. The very first solution with frequencies and eduction was easy to read and good 98% of the use cases.

fabrao17:11:50

@reborg thanks a lot for your help

reborg17:11:21

no worries, all useful stuff 🙂

fabrao17:11:23

I used the second solution in my code

futuro15:11:15

Does anyone know of a way to get the frame-local variables printed during stacktraces?

futuro15:11:24

I've done a little googling, and read some of clojure.stacktrace, but nothing seems promising.

futuro15:11:44

Ahh, good point.

futuro15:11:29

I've never attempted to extend Throwables, a la slingshot, but maybe that would be the way to go: create Throwables that automatically capture their local variables.

futuro16:11:54

This blog seems to have some of the answer, from a frame-local-variables perspective: http://blog.element84.com/debugging-clojure-with-jdi.html

qqq16:11:40

in a cljc file, I have;

qqq16:11:49

#?(:clj [b.acompat.macro :refer [read-at-compile-time]]
               :cljs [b.acompat.macro :refer-macros [read-at-compile-time]])
^-- can this be simplified ?

moxaj16:11:55

@qqq narrow the reader conditional to the :refer / :refer-macros (as far as I can tell, that's the only difference)

borkdude16:11:40

How do I get this to work? (clojure.java.shell/sh “rm” “/tmp/out/*“)

borkdude16:11:56

The wildcard doesn’t work

qqq16:11:56

@moxaj: maybe this is asking too much, but it seems that at compile time, it should be possible to infer if a symbol if a function or a macro, and have it behave accodingly

moxaj16:11:39

@qqq are you the author of the b.acompat.macro namespace?

qqq16:11:10

@moxaj I am author of the b.acompat.macro namespace

borkdude16:11:39

ok, (clojure.java.shell/sh "bash" "-c" "rm /tmp/out/*") works

jeff.terrell16:11:51

Oh right, this reminds me that wildcards are a creature comfort provided by shells. simple_smile

moxaj16:11:57

@qqq there's a cljs feature called 'implicit macro loading'; add #?(:cljs (:require-macros [b.acompat.macro])) to your b.acompat.macro ns form and you can :refer your macros as usual

qqq16:11:08

@moxaj: are you suggesting:

;; foobar/macro.cljc
(ns foobar.macro 
  #?(:cljs (require-macros [foobar.macro])))


(defmacro black-magic [ ...])

;; other/code.cljc
(ns other.code
  (:require [foobar.macro :refer [black-magic]]))




?

moxaj16:11:27

yes (minor nitpick: it should be :require-macros, with the colon)

qqq16:11:01

@moxaj: thanks; this is interesting; I will try it out once my cljs code compiles again

borkdude17:11:00

Why does = accept one argument?

ghadi17:11:52

because of apply

ghadi17:11:09

you can apply multiple args, so what is so special about one arg

futuro17:11:26

Maybe because of transducers?

futuro17:11:00

Fair enough

ajmagnifico17:11:31

Question: How do people feel about memoizing a function that performs IO to get something out of a database?

ajmagnifico17:11:55

Does that raise red flags for anyone in and of itself?

chris17:11:00

like so many things it depends

chris17:11:11

depends on how often you're writing to the db

chris17:11:15

depends on the load

chris17:11:43

depends on whether having the latest info is critical

chris17:11:08

depends on how important speed is

ajmagnifico17:11:59

I’m thinking of this from a readability / obviousness perspective for the benefit of the human reading the code down the road.

ajmagnifico17:11:15

Right now the application should only need to read the data once for the duration of the app.

ajmagnifico17:11:49

And I’m thinking of memoizing the function to keep things cleaner, so I don’t need to add yet one more thing to my global config

ajmagnifico17:11:10

But down the road, it’s possible that I would need to read from the DB more than once per application run.

ajmagnifico17:11:46

And I’m wondering if 6 months, a year from now, I would remember that the function was memoized, or if I would tear my hair out wondering why it isn’t reading new data in the DB

ajmagnifico17:11:37

anyway, just seeing if people have experience or strong opinions about this sort of thing

chris18:11:52

I would certainly avoid adding this until it's necessary

chris18:11:17

too often I see myself to 'clever' stuff and then confuse myself the next day

ajmagnifico18:11:08

haha, true story

ajmagnifico18:11:14

yeah, that’s why I was hesitant about this

ajmagnifico18:11:32

“Oh, memoizing is this clever, useful thing! I’ll use it!” But I’m not confident that it won’t burn me down the road

reborg17:11:36

@fabrao Depending how important speed is, the parallel solution is twice as fast, at the price of the increased complexity. I collected all in a gist: https://gist.github.com/reborg/37c76a61c9a60ddae8de737170e2e675 Before going parallel like this tho (with mutation, side-effects and whatnot), I'd carefully weight pro and cons. The very first solution with frequencies and eduction was easy to read and good 98% of the use cases.

qqq17:11:16

How do you analyze if the query is pure of makes updates ?

qqq18:11:15

I'm trying to write a function that converts an unqualified keyword to a qualified keyword. I have this so far:

(defn qkw [kw]
  (keyword (str (ns-name *ns*))
           (str (name kw))))
unfortunately, it doesn't work in cljc as ns is undefined in cljs is there a way to make this work in cljs too ?

gdeer8118:11:21

I had to spin up a clojurescript repl to see it for myself and yep calling *ns* returns nil

gdeer8118:11:02

@qqq try this out (defn qkw [kw] (keyword (namespace ::_) (str (name kw))))

qqq18:11:08

that almost works, except ::. gets us the namespace where qkw is defined, not where qkw is called

gdeer8118:11:15

ah yes...more hammock time needed

gdeer8119:11:01

I pasted your macro into a clj file and then called (require-macros '[my-ns :refer [qkw]]) at the figwheel repl and it but when I call (qkw :foo) I get :my-ns/foo

gdeer8119:11:49

so even with the macro it is still giving you the ns where it is defined and not where it's called. I'm not the best at writing macros so maybe it just needs to be tweeked

Russell Mull18:11:44

I tried to post a message to the google group yesterday, but it hasn't appeared. It's possible that it got hung up in moderation; any moderators around?

Russell Mull18:11:01

It's also possible that pressed the wrong button at some point.

andy.fingerhut18:11:58

@russell.mull I am one moderator of Clojure Google group. No messages are waiting for moderation approval right now. There are other moderators, so someone else may have seen it and made a reject decision on your message without me seeing it, but if your message was about Clojure, it shouldn't have been rejected.

Russell Mull18:11:26

@andy.fingerhut ok, thanks; I'll resubmit and be very careful about which button I press this time.

qqq18:11:34

@gdeer81: maybe

(defmacro qkw [kw]
  `(keyword (str (namespace ::foo))
            (str (name ~kw))))

Garrett Hopper19:11:19

Is there any good way of creating an anonymous function which doesn't accept any arguments? I need to be able to create them nested.

#(function/one :alpha (partial function/two :bravo))
Using partial with full arguments works, but it doesn't feel right.

phronmophobic19:11:22

@ghopper, you can’t nest #(...) anonymous functions, but you can nest the (fn [] ...) form

Garrett Hopper19:11:22

Yeah, I know I can just nest fn calls. Was just curious if there was a core function for this type of thing.

phronmophobic19:11:23

so either (fn [] (function/one :alpha #(function/two :bravo)) or (fn [] (function/one :alpha (fn [] (function/two :bravo)))

Garrett Hopper19:11:51

(A core function that allowed creating nested thunks)

gdeer8119:11:54

@qqq doesn't seem to work at the repl for me

wans19:11:25

#clojure-brasil

gdeer8119:11:26

@qqq I'm not the best at writing macros and especially calling them from cljs namespaces, but I think you might be on the right track

yedi20:11:04

hey guys, I'm dealing with this strange issue -- when i call (keys my-map) the key :example-key is included in the results

yedi20:11:42

however, when i log (:example-key my-map) i get nil

yedi20:11:03

and when i print out my-map the key is nowhere to be found

dpsutton20:11:08

what does (:example-key my-map ::its-not-there) return?

yedi20:11:44

it returns not-there

yedi20:11:06

so all evidence points to the key not existing in the map, except for the keys function

yedi20:11:40

also to be clear, i have code that's supposed to add that key and value to the map, so it not being there is problematic

yedi20:11:54

not sure what could be causing this behavior

dpsutton20:11:19

is it a record by any chance?

yedi20:11:33

it's reframe app-db

yedi20:11:46

which i thought was just an atom

yedi20:11:43

it's a reagent/atom

yedi20:11:41

app:cljs.user=> (:search-lol @re-frame.db/app-db ::but-why?)
:cljs.user/but-why?
app:cljs.user=> (keys @re-frame.db/app-db)
(:schema
 :errors
 :audio-label
 :audio-player
 :loaded
 :duration
 :routes-initialized?
 :search-lol
 :token
 :active-page
 :models
 :status
 :path-array
 :file-download
 :playing
 :position 
 :page-query 
 :audio 
 :url-data 
 :location 
 :user 
 :audio-type)
here's the code incase i'm doing something obviously dumb

jeff.terrell20:11:48

What is (type @re-frame.db/app-db)?

yedi20:11:02

cljs.core/PersistentHashMap

plins20:11:14

its possible to get the current localized datetime without any libs in clojure

jeff.terrell20:11:23

@yedi - How about (let [db @re-frame.db/app-db] (prn 'keys (keys db)) (:search-lol db :no-dice)) (to be sure the value isn't changing out from under you)?

phronmophobic20:11:54

what does (->>(keys @re-frame.db/app-db) (map name)) show?

phronmophobic20:11:00

you can make a keyword with a space in it

phronmophobic20:11:24

it might not be it, but might explain the weird behaviour

yedi20:11:25

app:cljs.user=> (let [db @re-frame.db/app-db] (prn 'keys (keys db)) (:search-lol db :no-dice))
keys (:schema :errors :audio-label :audio-player :loaded :duration :routes-initialized? :search-lol :token :active-page :models :status :path-array :file-download :playing :position :page-query :audio :url-data :location :user :audio-type)
keys (:schema :errors :audio-label :audio-player :loaded :duration :routes-initialized? :search :token :active-page :models :status :path-array :file-download :playing :position :page-query :audio :url-data :location :user :audio-type)
:no-dice
app:cljs.user=> keys (:schema :errors :audio-label :audio-player :loaded :duration :routes-initialized? :token :active-page :models :status :path-array :file-download :playing :position :page-query :audio :url-data :location :user :audio-type)

yedi20:11:32

not sure why it printed 3 times

phronmophobic20:11:45

checking for something like (keyword "search-lol ")

yedi20:11:06

app:cljs.user=> (->>(keys @re-frame.db/app-db) (map name))
("schema"
 "errors"
 "audio-label"
 "audio-player"
 "loaded"
 "duration"
 "routes-initialized?"
 "search-lol"
 "token"
 "active-page"
 "models"
 "status"
 "path-array"
 "file-download"
 "playing"
 "position"
 "page-query" 
 "audio" 
 "url-data" 
 "location" 
 "user" 
 "audio-type")

yedi20:11:35

also this is the db that i reset! the atom to for it to get in this state

yedi20:11:48

(-> db
          (assoc-in [:status :search-results-fetch audio-type] :success)
          (assoc-in [:search-lol :search-results] results))

yedi20:11:00

seems pretty straightforward to me so i dunno whats up

yedi20:11:21

note: db doesn't start with (-> db :search-lol :search-results) existing

jeff.terrell20:11:28

My next guess was unicode weirdness, but if you typed in :search-lol in the assoc then that's surely not it.

yedi20:11:30

i assume assoc-in automatically creates a map for them

yedi20:11:42

and it does automatically create the nested maps:

app:cljs.user=> (assoc-in {} [:test :nested] true)
{:test {:nested true}}

yedi20:11:46

so im at a complete loss

jeff.terrell20:11:40

@plins - Should be able to use the Java date/time API without any libs. https://docs.oracle.com/javase/tutorial/datetime/iso/index.html

jeff.terrell20:11:58

@yedi - you've stumped me! ¯\(ツ)

yedi21:11:04

thanks for trying lol, i have no idea what could be the issue

phronmophobic21:11:52

what does that print?

(let [db @re-frame.db/app-db]
  (doseq [k (keys db)]
    (prn k (= k :search-lol) (contains? db k) (get db k ::not-found))))

phronmophobic21:11:43

just added (= k :search-lol) as something to print

yedi21:11:43

ok so this is really strange

yedi21:11:01

prn prints the results twice, and the first time it prints it, :search-lol is there

yedi21:11:46

:search-lol true true {:search-results [{:au...

yedi21:11:19

but then it start printing everything again and an old key that should no longer be in there got printed out too

phronmophobic21:11:43

how are you printing the value?

phronmophobic21:11:56

ie. are you using a repl

phronmophobic21:11:09

or putting it as a top level form in a cljs file

yedi21:11:34

lein fighwheel in intellij

phronmophobic21:11:57

seems like the app + dev tools might be in a weird state

yedi21:11:10

yea lemme restart it

phronmophobic21:11:11

there are something things can cause a figwheel refresh

phronmophobic21:11:30

where it will rerun all the top level forms in your code

phronmophobic21:11:38

like saving a file

phronmophobic21:11:05

maybe there’s something with autosave and not having the state setup to make figwheel happy (eg. using (def state (atom {})) instead of (defonce state (atom {}))

Quest21:11:33

I sometimes hit use-cases for this FN in threading macros. Is there a better/builtin implementation, or suggestions on the name?

(defn pred-or-nil
  [pred? v]
  (when (pred? v) v))

yedi21:11:49

@smith.adriane idk i'm at a loss. something weird is definitely happening because it's worked fine with every other key every tried previously

yedi21:11:20

the repl doesn't seem trustworthy, so i'm tryign to see if i dissoc the key somewhere in my code

manutter5121:11:07

@yedi did you try it from a command-line repl?

manutter5121:11:53

I guy I work with was having some really weird issues that cleared up when he deleted the contents of the /target dir, fwiw

yedi21:11:55

not sure how i'd recreate the state of the app from the cli

yedi21:11:03

lemme delete mine

manutter5121:11:21

Oh that’s right, I was thinking clj not cljs, nvm

manutter5121:11:31

but maybe the /target thing will help

phronmophobic21:11:56

it does seem like a weird situation. I would check to make sure that you’re following the tips for reloadable code, https://github.com/bhauman/lein-figwheel#writing-reloadable-code. I would also try some of these tests outside of the figwheel repl to try to isolate the issue

phronmophobic21:11:17

in the past, Ive added debug functions like

(defn ^:export debugprints []
  (let [db @re-frame.db/app-db]
    (doseq [k (keys db)]
      (prn k (= k :search-lol) (contains? db k) (get db k ::not-found)))))

phronmophobic21:11:35

and then you can call my.namespace.debugprints() from the dev console

yedi21:11:57

ahh cool tip

yedi21:11:11

(and yea lein cleaning and deleting /target didn't help)

Mudge22:11:17

Is there a way to run lein tasks from the repl?

Garrett Hopper22:11:17

Should some-> be able to have as-> contained within it?

hiredman22:11:53

user=> (some-> 1 (as-> % (+ % %)))
2
user=> 

Quest22:11:21

@ghopper anecdotally, I remember having issues with it a few months ago. I usually bust out https://github.com/rplevy/swiss-arrows when I need improved threading

hiredman22:11:06

the -> macros are purely transformations of form, usually when people have trouble with them it is because they expect them to be aware of semantics

Garrett Hopper22:11:53

Alright, I'd changed a -> into an as->; I needed to nest my original -> inside the new as-> which was inside some->. My mistake.

Garrett Hopper22:11:03

Huh, @quest, I'll have to look into that.

hiredman22:11:14

that is too many arrorws

Garrett Hopper22:11:21

Yeah, probably.

Garrett Hopper22:11:34

It doesn't actually look too bad in reality.

hiredman22:11:48

you can't actually tell if it is correct

hiredman22:11:55

that is too many

Garrett Hopper22:11:05

defn callback [{{{cookie-state :value} "state"} :cookies
                 {:strs [code hd] query-state "state"} :query-params}]
  (if-let [userinfo
           (and (= cookie-state query-state)
                (some->
                 (-> @(http-client/post (env :google-token)
                                        {:form-params {:code code
                                                       :client_id (env :google-id)
                                                       :client_secret (env :google-secret)
                                                       :redirect_uri ""
                                                       :grant_type "authorization_code"}})
                     :body
                     (cheshire/parse-string true)
                     :access_token)
                 (as-> access
                     (-> @(http-client/get (env :google-user-info)
                                           {:oauth-token access})
                         :body
                         (cheshire/parse-string true)))))]
    (merge
     (response/redirect "/")
     {:cookies {"access" (compact/sign
                          {:email}
                          (env :secret))}})
    (response/redirect "/login"))

hiredman22:11:59

that is gross

Garrett Hopper22:11:14

Fair enough. Do you have a specific way you'd change it?

Garrett Hopper22:11:54

The alternative I was running into was having more than 2 exit points. (Duplicating my redirect to /login on multiple branches)

hiredman22:11:01

no, I think a good start would be breaking it up, pulling out some helper functions

ghadi22:11:09

agree with the breaking it apart

Garrett Hopper22:11:31

Good call there. I definitely will. This was largely just a matter of getting it working.

ghadi22:11:43

break it apart at the seams where you'd test (the initial OAuth call, the second call)

hiredman22:11:46

I will often rewrite code with multiple exits as explicit cps

hiredman22:11:39

often you can have control flow diverge down two paths, and then you need to join the control flow

hiredman22:11:10

that control flow join is the divergent control flow having the same continuation

hiredman22:11:45

so you just create a function that represents all actions after the join point, and pass it in to each branch

Garrett Hopper22:11:26

Oh, I'm following now. So you'd have a default-response defined at the beginning which calls the redirect to /login?

hiredman22:11:21

sure, something like that

Garrett Hopper22:11:45

That makes sense. Is this a specifically defined pattern? Link?

hiredman22:11:57

I dunno, it is just sort of I think of code after fiddling with compilers for a while

hiredman22:11:25

oh yeah, cps is a thing, and has lots of applications, a lot of which are sort of tangential to the relatively simple "hey, I have this repeated bit of code for different control flow branches, why not make it a function and reuse it on both branches"

Garrett Hopper22:11:49

:thumbsup: Thanks

tvalerio23:11:48

Hi! I’m trying to receive an AWS SNS message in pedestal but I’m facing a small problem. When pedestal receives a message with content-type application/json it automatically convert the body to keywords. But aws sns sends its message with content-type text/plain and pedestal does not convert the message so I can extract the data I need. Is there a way to convert the entire message? I’m trying to create an interceptor to convert the requests but It’s not working problem:

(defn- parse-string-to-map-keys
  [string-to-convert]
  (walk/keywordize-keys string-to-convert))
(defn- parse-stream-to-map-keys
  [stream-to-convert]
  (json/read-str (slurp ( stream-to-convert)) :key-fn keyword))
(def parse-sns-message-to-json
  (interceptor/interceptor
    {:name ::parse-sns-message-to-json
     :enter
     (fn [{:keys [request] :as context}]
       (let [ headers (try
                        (parse-string-to-map-keys (:headers request))
                        (catch Exception _))
              body (try
                     (parse-stream-to-map-keys (:body request))
                     (catch Exception _))]
         (if (and headers body)
           (do
             (assoc context :request (-> request
                                         (assoc :headers headers)
                                         (assoc :json-params body))))
           (-> context
               terminate))))}))

tvalerio23:11:09

I’m using

[clojure.data.json :as json]
as well

tvalerio23:11:55

The body of the message stays like this:

:body #object[org.eclipse.jetty.server.HttpInputOverHTTP 0x9344f6 "[email protected][c=1804,q=0,[0]=null,s=EOF]"], :scheme :http, :request-method :post}

hiredman23:11:56

can you make an interceptor that just changes the content-type for sns messages?

tvalerio23:11:29

I could try this, but I don’t know the order of the functions would pedestal try to convert the message before or after my interceptor?

hiredman23:11:34

I dunno, I've never used pedestal interceptors, my understanding is they form something like a pipeline, so there must be some way to influence the order things flow through the pipeline

tvalerio23:11:53

hm, I see I’ll try to do what you’ve said I’ll send the result in a minute