From 44fa0b49cb777dd9367f6caa61578af63e6bb627 Mon Sep 17 00:00:00 2001 From: nixo Date: Tue, 29 Oct 2019 11:57:39 +0100 Subject: [PATCH] readme: add output html --- readme.html | 2238 ++++++++++++++++++++++++++++++++++++++ readme/output-matrix.svg | 153 +++ readme/output-plot.png | Bin 0 -> 3577 bytes readme/output-table.csv | 5 + readme/output-undef.png | Bin 0 -> 5361 bytes readme/output-undef.svg | 27 + readme/output.csv | 1 + readme/output.html | 1 + 8 files changed, 2425 insertions(+) create mode 100644 readme.html create mode 100644 readme/output-matrix.svg create mode 100644 readme/output-plot.png create mode 100644 readme/output-table.csv create mode 100644 readme/output-undef.png create mode 100644 readme/output-undef.svg create mode 100644 readme/output.csv create mode 100644 readme/output.html diff --git a/readme.html b/readme.html new file mode 100644 index 0000000..897ebfb --- /dev/null +++ b/readme.html @@ -0,0 +1,2238 @@ + + + + + + + +ob-julia: high quality julia org-mode support + + + + + + + +
+

ob-julia: high quality julia org-mode support

+ + +
+

1 ob-julia

+
+

+See 3 for more details. +

+
+
+ +
+

2 How it works

+
+
    +
  1. Code block is saved to a temporary file (under /tmp)
  2. +
  3. Decide whether we need to start a new julia process or not +
      +
    1. If session is "none", don't use a session (code under /tmp will +be passed to julia -L initfile src-block.jl). This does not +require ess. The command is customized by +org-babel-julia-command)
    2. +
    3. If session is nil, use default session name +(customized by org-babel-julia-default-session)
    4. +
    5. If session has a values, use it's name
    6. +
  4. +
  5. Check if we want to use a session or not. Check if the session +exists. Start the session accordingly.
  6. +
  7. Is the evaluation async? +
      +
    1. YES: +
        +
      1. Register a filter function
      2. +
      3. Return immediately, printing a ref to the evaluation. +The ref is in the form: julia-async:$uuid:$tmpfile +
          +
        • uuid: identifier of this evaluation, used to find out where to +insert again results
        • +
        • tmpfile: the path where the output will be saved. This is +useful both for debugging purposes and so that we do not need +to store an object that maps computations to files. The +process-filter look for the uuid, and then inserts $tmpfile.
        • +
      4. +
    2. +
    3. NO: Run the code, wait for the results. Insert the results.
    4. +
  8. +
+
+
+ +
+

3 Implemented features

+
+
+
+

3.1 Session (:session none, :session, :session session-name)

+
+

+By default code is executed without a session. The advantage is that +you do not requires emacs-ess to run julia code with ob-julia. But +sessions (especially for julia, where speed comes from compiled code) +are available. The same behaviour is obtained by setting the :session +header to none. +

+ +

+You can enable sessions with the :session argument. Without +parameters, the session used is named after +org-babel-julia-default-session (*julia* by default). With a +parameter, the name is earmuffed (a star is prepended and appended). +

+ +

+The REPL is kept sane. There's no cluttering (you don't see all the +code executed that is required by ob-julia to have results), history +is preserved (you can C-S-up to see the list of org-src block +evaluated), and results are shown (this can be customized by +org-babel-julia-silent-repl). +

+
+
+ +
+

3.2 Async (:async :async yes, :async t)

+
+

+Async works both with and without :session. +

+ +

+The best combination of features is combining session with +:async. Async allows code evaluation in background (you can continue +using emacs while julia compute results). +

+ +

+You can change buffer or even narrow it while the evaluation +completes: the result is added automatically as soon as julia +finishes. Multiple evaluation are queued automatically (thanks to +ess). Cache is supported (evaluating the same code-block twice does +not re-trigger evaluation, even if the code is still running). +

+ +

+It's not possible to have async blocks with :results silent. I'm +currently using this to distinguish between active src block and +variable resolution (when a :var refer to an async block, the block +cannot be executed asynchonously. So we need to distinguish between +the two. This is the only way I was able to find, if you know better +please tell me). +

+ +
+
sleep(1)
+"It works!"
+
+
+ +
+It works!
+
+ + +
+
sleep(1)
+"It works!"
+
+
+ +
+It works!
+
+ + +

+Here the same, without the session +

+
+
sleep(1)
+"It works!"
+
+
+ +
+It works!
+
+ + +
+
sleep(1)
+"It works!"
+
+
+ +
+It works!
+
+ + + +

+Asynchronous evaluation is automatically disabled on export, or when a +code block depends on one (:var) +

+
+
+ +
+

3.3 Variables input (:var), Standard output

+
+
+
+

3.3.1 Inputs

+
+

+Those are example inputs that will be used later, to check whether +import+export pipeline works as expected. +

+ +

+A table +

+ + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ab
11
22
  
44
+ +

+A matrix (no hline) +

+ + + + +++ ++ ++ ++ + + + + + + + + + + + + + + + +
1234
1234
+ +

+A column +

+ + + + +++ + + + + + + + + + + + + + + + + + +
1
2
3
4
+ +

+A row +

+ + + + +++ ++ ++ ++ + + + + + + + + +
1234
+ +

+A list +

+ +
    +
  • 1
  • +
  • 2
  • +
  • 3
  • +
  • 4
  • +
+
+ +
    +
  1. Table
    +
    +
    +
    table
    +
    +
    + + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ab
    11
    22
      
    44
    + +

    +As you can see, the table automatically adds the hline after the +header. This is a heuristic that might fail (might be triggered for +matrix, might not trigger on tables), so you can manually +force/disable it with the :results table or :results matrix param. +

    + +
    +
    table
    +
    +
    + + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ab
    11
    22
      
    44
    +
    +
  2. + +
  3. Row
    +
    +

    +Column, Rows, and Matrix export works just fine (tests in session sync, session async +and without session). +

    + +
    +
    row
    +
    +
    + + + + +++ ++ ++ ++ + + + + + + + + +
    1234
    + +
    +
    row
    +
    +
    + + + + +++ ++ ++ ++ + + + + + + + + +
    1234
    + +
    +
    row
    +
    +
    + + + + +++ ++ ++ ++ + + + + + + + + +
    1234
    +
    +
  4. + +
  5. Column
    +
    +

    +Works both with synchronous evaluation +

    + +
    +
    column
    +
    +
    + + + + +++ + + + + + + + + + + + + + + + + + +
    1
    2
    3
    4
    + +

    +asynchronous evaluation +

    + +
    +
    column
    +
    +
    + + + + +++ + + + + + + + + + + + + + + + + + +
    1
    2
    3
    4
    + +

    +and without a session +

    + +
    +
    column
    +
    +
    + + + + +++ + + + + + + + + + + + + + + + + + +
    1
    2
    3
    4
    +
    +
  6. + +
  7. Matrix
    +
    +

    +Sync +

    + +
    +
    matrix
    +
    +
    + + + + +++ ++ ++ ++ + + + + + + + + + + + + + + + +
    1234
    1234
    + +

    +Just like for tables, you can control header hline line with the +results param. +

    + +
    +
    matrix
    +
    +
    + + + + +++ ++ ++ ++ + + + + + + + + + + + + + + + + +
    1234
    1234
    + +

    +Async +

    + +
    +
    matrix
    +
    +
    + + + + +++ ++ ++ ++ + + + + + + + + + + + + + + + +
    1234
    1234
    + +

    +No session +

    + +
    +
    matrix
    +
    +
    + + + + +++ ++ ++ ++ + + + + + + + + + + + + + + + + +
    1234
    1234
    +
    +
  8. + +
  9. List
    +
    +

    +List are parsed as columns +

    + +
    +
    list
    +
    +
    + +

    +:results list return the list (just like R). It's not perfect with +

    +
    +
    list
    +
    +
    + +
      +
    • (1)
    • +
    • (2)
    • +
    • (3)
    • +
    • (4)
    • +
    +
    +
  10. + +
  11. Table
    +
    +

    +There are two ways in which tables can be passed to Julia: +

    +
      +
    • Array{NamedTuple}
    • +
    • Dictionary
    • +
    + +

    +I like the NamedTuple approach, but if you don't like it you can +customize the variable org-babel-julia-table-as-dict. In both cases, +if you :import DataFrames, you can construct a DataFrame from both. +

    + +

    +TOOD: I miss the julia code for printing Array{NamedTuple}. +

    + +
    +
    table
    +
    +
    + + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ab
    11
    22
      
    44
    + +

    +Also, it's nice that a single NamedTuple can represent a table: +

    +
    +
    table[2]
    +
    +
    + + + + +++ ++ + + + + + + + + + + + + +
    ab
    22
    +
    +
  12. +
+
+
+ +
+

3.4 Directory (:dir)

+
+

+Each source block is evaluated in it's :dir param +

+ +
+
pwd()
+
+
+ +
+/tmp
+
+ + +
+
pwd()
+
+
+ +
+/
+
+ + +

+If unspecified, the directory is session's one +

+
+
pwd()
+
+
+ +
+/home/nixo/dotfiles/emacs/.emacs.d/extra/ob-julia
+
+ + +

+Changing dir from julia code still works +

+
+
cd("/")
+realpath(".")
+
+
+ +
+/
+
+ + +

+but is ephemeral (like fort the :dir param) +

+
+
realpath(".")
+
+
+ +
+/home/nixo/dotfiles/emacs/.emacs.d/extra/ob-julia
+
+ + +

+This is obtained by wrapping the src block in a cd() call: +

+
+
cd(folder) do
+   block
+end
+
+
+
+
+ +
+

3.5 Error management

+
+

+If the block errors out, +

+ +
+
x
+
+
+ + + + +++ ++ + + + + + + +
ERRORUndefVarError(:x)
+ +
+
1 + "ciao"
+
+
+ + + + +++ ++ ++ ++ ++ + + + + + + + + + +
ERRORMethodError(+(1ciao)0x0000000000006426)
+ + + + +++ ++ ++ ++ ++ + + + + + + + + + +
ERRORMethodError(+(1ciao)0x0000000000006420)
+ +

+It works in async +

+
+
x
+
+
+ + + + +++ ++ + + + + + + +
ERRORUndefVarError(:x)
+ +

+On external process (sync) +

+
+
x
+
+
+ + + + +++ ++ + + + + + + +
ERRORUndefVarError(:x)
+ +

+and on external process (async) +

+
+
x
+
+
+ + + + +++ ++ + + + + + + +
ERRORUndefVarError(:x)
+ +

+Error management can still be improved for helping with debug (see +scimax). +

+
+
+ +
+

3.6 Using (:using) and Import (:import)

+
+

+To include dependencies, you can use :using and :import. +

+ +

+Because of how the julia code is actually implemented, in order to use +specialized exports (e.g., DataFrames, see ) you need the +modules to be available before the block gets evaluated. The problem +can be solved in 2 (or 3 ways): +

+
    +
  • Evaluating a block with using/import, then the other block
  • +
  • Using the header arguments
  • +
  • Fixing the Julia code :D
  • +
+ +

+to use :import, you need to pass arguments quoted: +

+
+:using DataFrames Query :import "FileIO: load" "Plots: plot"
+
+
+
+ +
+

3.7 Results (:results output, :results file, )

+
+

+The default is to return the value: +

+ +
+
10
+
+
+ +
+10
+
+ + +

+If results is output, it's included the stdout (what's printed in the +terminal). (This part still needs some work to be useful.) +

+ +
+
10
+
+
+ +
+
println(10)
+
+
+ +
+10
+
+ + +
+
println("a")
+
+"10"
+
+println("b")
+
+
+ +
+a
+b
+
+ + +

+Error (results output) +

+ +
+
This will throw an error
+
+
+ +
+Base.Meta.ParseError("extra token \"will\" after end of expression")
+
+ + +

+Another error (result ouptut) +

+
+
print(one(3,3))
+
+
+ +
+MethodError(one, (3, 3), 0x0000000000006426)
+
+ + +

+A matrix +

+
+
print(ones(3,3))
+
+
+ +
+[1.0 1.0 1.0; 1.0 1.0 1.0; 1.0 1.0 1.0]
+
+
+
+ +
+

3.8 Supported Types

+
+

+Adding new types is easy (you need to define an orgshow() function for +your type. See init.jl). There's a simple mechanism that allows to +define method on non-yet-existing types example. +

+ +

+The current version supports a couple of useful type: DataFrames and +Plots. ob-julia needs community support to add more types: please help! +

+
+
+ +
+

3.9 File output & Inlining

+
+

+There's native support for writing output to file. For unkown file +types, instead of inserting the output in the buffer it's written to the file. +

+ +
+
zeros(3,3)
+
+
+ +

+readme/output.html +

+ +
+
zeros(3,3)
+
+
+ +

+readme/output.csv +

+ +
+
Dict(10 => 10)
+
+
+ +

+readme/output.csv +

+ +

+Saving plots requires the Plots library. You can require it with the +:using header. There's the custom :size "tuple" header argument for +specifying the output size. It must be placed inside parentheses, and +it's evaluated as julia object (that means it can contains variables +and expressions). +

+ +
+
plot(matrix)
+
+
+ + +
+

output-plot.png +

+
+ +

+Matrix also has an automatic conversion (when Plots is loaded), so you +don't even need to pass it to the plot() function (there's a generic +fallback that tries to plot anything saved to png or svg). +

+ +
+
matrix
+
+
+ + +
+

+Sorry, your browser does not support SVG. +

+
+ +

+Plots can also manage errors (in a visually-disturbing way). +

+ +
+
this_is_undefined
+
+
+ + +
+

+Sorry, your browser does not support SVG. +

+
+ +
+
another_undefined_but_async
+
+
+ + +
+

output-undef.png +

+
+ +
+
DataFrame(x = 1:10, y = (0:9) .+ 'a')
+
+
+ + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
xy
1a
2b
3c
4d
5e
6f
7g
8h
9i
10j
+ +
+
DataFrame(table)
+
+
+ +

+readme/output-table.csv +

+ +
+
data
+
+
+ + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
xy
1a
2b
3c
4d
5e
6f
7g
8h
9i
10j
+
+ +
+

3.9.1 Inlining (:inline no, :inline, :inline format)

+
+

+Output to file and Inlining are different things but nicely fit +together to solve the same problem: inserting images or other objects +inside the buffer. +

+ +

+If your type can be represented inside the exported format (like +images as svg/base-64 encoded pngs inside .html, tex plots in a .tex +file), the :inline header is what you need. The behaviour changes +based depending on your interactive use and on the desired output +format. +

+ +

+TODO: right now :results raw is required on export. How do we fix it? +

+ +

+Examples: :inline keyword alone, in interactive evaluation, the output +inserted in the buffer is the usual. +

+
+
matrix
+
+
+ +

+
1234
1234
+

+ +

+But when you export the output to html, the output will be processed +by julia, and inserted in the buffer (or a different representation +for different export formats). This is not of much use with tables +(even if you can customize the export, e.g. by passing the :width +keyword), but is wonderful for pictures. If a result can be inserted +in multiple ways (picture in html can be both inline png or svg), you +can specify the desired format by passing the argument to the :inline +keyword (like :inline svg). In this case, the processed output is +inserted also in interactive sessions. +

+ +
+
matrix
+
+
+ +

+
1234
1234
+

+ +

+Plots default to inline png +

+ +
+
plot(matrix)
+
+
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1.00 + + +1.25 + + +1.50 + + +1.75 + + +2.00 + + +1 + + +2 + + +3 + + +4 + + + + + + + + + +y1 + + + +y2 + + + +y3 + + + +y4 + + + +

+ + +

+But you can also force svg (Since it's multiline, :wrap it with :wrap html) +

+ +
+
plot(matrix)
+
+
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1.00 + + +1.25 + + +1.50 + + +1.75 + + +2.00 + + +1 + + +2 + + +3 + + +4 + + + + + + + + + +y1 + + + +y2 + + + +y3 + + + +y4 + + + +

+
+
+
+
+ + +
+

4 Issues and Missing features

+
+
    +
  • No automated tests yet
  • +
  • Not tested with remote host
  • +
  • Variable resolution of src-block is synchronous. If your :async src +block depends on another :async src block, the latter is evaluated +synchronously, then former asynchonously. This could be implemented +by using a simple queue, where next item is started in the +process-filter and where variables starting with julia-async: are +replaced. Right now I don't feel the need (if results are cached, +things already feels good).
  • +
  • For async evaluation to work the session must be started from +ob-julia (or you must register the filter function manually, +undocumented).
  • +
  • :results output is implemented but untested. I rarely find it +useful.
  • +
  • import/using errors are not reported
  • +
+
+
+ +
+

5 Credits

+
+

+This project originally started as a fork of +astahlman/ob-async. However, because of changes in new version of Org +Mode, julia 1.0 release and unsupported features, I decided to start +over. +

+
+
+
+
+

Author: Nicolò Balzarotti

+

Created: 2019-10-29 Tue 11:56

+

Validate

+
+ + diff --git a/readme/output-matrix.svg b/readme/output-matrix.svg new file mode 100644 index 0000000..51766c6 --- /dev/null +++ b/readme/output-matrix.svg @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1.00 + + +1.25 + + +1.50 + + +1.75 + + +2.00 + + +1 + + +2 + + +3 + + +4 + + + + + + + + + +y1 + + + +y2 + + + +y3 + + + +y4 + + diff --git a/readme/output-plot.png b/readme/output-plot.png new file mode 100644 index 0000000000000000000000000000000000000000..8fad0262693f51d928588fd29f791838c15c9e1f GIT binary patch literal 3577 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 literal 0 HcmV?d00001 diff --git a/readme/output-undef.svg b/readme/output-undef.svg new file mode 100644 index 0000000..616acfa --- /dev/null +++ b/readme/output-undef.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + +ERROR: UndefVarError(:this_is_undefined) + + diff --git a/readme/output.csv b/readme/output.csv new file mode 100644 index 0000000..8e6a436 --- /dev/null +++ b/readme/output.csv @@ -0,0 +1 @@ +Dict(10=>10) \ No newline at end of file diff --git a/readme/output.html b/readme/output.html new file mode 100644 index 0000000..4f75efb --- /dev/null +++ b/readme/output.html @@ -0,0 +1 @@ +
0.00.00.0
0.00.00.0
0.00.00.0
\ No newline at end of file