Giter Club home page Giter Club logo

genie.jl's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

genie.jl's Issues

Error "404 Not Found" when starting existing web app

I can create a new web app and see it in the browser. But I cannot start an existing web app it seems.

The local web server is running according to Julia:

shell> cd Anders_cool_new_app
F:\Julia\Anders_cool_new_app

julia> using Genie

julia> Genie.AppServer.startup()
[ Info: Listening on: Sockets.InetAddr{Sockets.IPv4}(ip"127.0.0.1", 0x1f40)
[2018-09-13 12:35:12|info]: Web server running at 127.0.0.1:8000

But when I go to http://localhost:8000/ I get two errors:

  1. In the browser, I get error
    "404 Not Found
    Oh dear, no page here!
    Sorry, we can not find /"

  2. In Julia, I get the session error below:

julia> [ Info: Accept:  ?    0↑     0↓    0s 127.0.0.1:8000:8000 ?16
[ Info: Accept:  ?    0↑     0↓    0s 127.0.0.1:8000:8000 ?16
β”Œ Warning: throttling 127.0.0.1
β”” @ HTTP.Servers C:\Users\aalexandersson\.julia\packages\HTTP\nUK4f\src\Servers.jl:128
β”Œ Info: HTTP.Messages.Request:
β”‚ """
β”‚ GET / HTTP/1.1
β”‚ Host: localhost:8000
β”‚ Connection: keep-alive
β”‚ Cache-Control: max-age=0
β”‚ Upgrade-Insecure-Requests: 1
β”‚ User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36
β”‚ Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
β”‚ Accept-Encoding: gzip, deflate, br
β”‚ Accept-Language: en-US,en;q=0.9
β”‚
β”” """
[ Info: Accept:  ?    0↑     0↓    0s 127.0.0.1:8000:8000 ?16
[2018-09-13 12:35:35|info]: Session error
[2018-09-13 12:35:35|info]: C:\Users\aalexandersson\.julia\packages\Genie\Qst2l\src\Sessions.jl:30
[2018-09-13 12:35:36|info]: Generating temporary session id
[2018-09-13 12:35:37|info]: [2018-09-13T12:35:37.418] -- :/ -- Done

I am using Windows 7.

error using Genie julia (1.0.0)

when i type using Genie shows error here is error trace : -

WARNING: could not import Base.reload into Util
ERROR: LoadError: LoadError: MethodError: no method matching parse(::String)
Closest candidates are:
parse(::Type{LibGit2.GitCredential}, ::AbstractString) at /home/mksmmi/julia/usr/share/julia/stdlib/v1.0/LibGit2/src/gitcredential.jl:71
parse(::Type{LibGit2.GitCredentialHelper}, ::AbstractString) at /home/mksmmi/julia/usr/share/julia/stdlib/v1.0/LibGit2/src/gitcredential.jl:158
parse(::Type{Sockets.IPv4}, ::AbstractString) at /home/mksmmi/julia/usr/share/julia/stdlib/v1.0/Sockets/src/IPAddr.jl:166
...
Stacktrace:
[1] top-level scope at none:0
[2] include at ./boot.jl:317 [inlined]
[3] include_relative(::Module, ::String) at ./loading.jl:1038
[4] include at ./sysimg.jl:29 [inlined]
[5] include(::String) at /home/mksmmi/.julia/dev/Genie/src/Genie.jl:4
[6] top-level scope at none:0
[7] include at ./boot.jl:317 [inlined]
[8] include_relative(::Module, ::String) at ./loading.jl:1038
[9] include(::Module, ::String) at ./sysimg.jl:29
[10] top-level scope at none:2
[11] eval at ./boot.jl:319 [inlined]
[12] eval(::Expr) at ./client.jl:389
[13] top-level scope at ./none:3
in expression starting at /home/mksmmi/.julia/dev/Genie/src/Sessions.jl:16
in expression starting at /home/mksmmi/.julia/dev/Genie/src/Genie.jl:32
ERROR: Failed to precompile Genie [c43c736e-a2d1-11e8-161f-af95117fbd1e] to /home/mksmmi/.julia/compiled/v1.0/Genie/8eazC.ji.
Stacktrace:
[1] error(::String) at ./error.jl:33
[2] macro expansion at ./logging.jl:313 [inlined]
[3] compilecache(::Base.PkgId, ::String) at ./loading.jl:1184
[4] _require(::Base.PkgId) at ./logging.jl:311
[5] require(::Base.PkgId) at ./loading.jl:852
[6] macro expansion at ./logging.jl:311 [inlined]
[7] require(::Module, ::Symbol) at ./loading.jl:834

Readme enhancements

url: https://github.com/essenciary/Genie.jl

Location: Working with resources/Adding views/Rendering views
Missing: explain that the html! method comes from the Renderer class
Example: Add "using Genie.Renderer" at the top of the definition of the billgatesbooks function

Location: Generate the Controller
Missing: explain that the user should test the BooksController.billgatesbooks function in Julia to make sure it produces the expected text to avoid issues later
Example: genie> BooksController.billgatesbooks()

CMS

Any plans for a CMS?

Or would it be possible to integrate with a html CMS myself?

ErrorException in example application

Hi, was thinking about trying out this framework which seems super cool. However, when I try to get started using the instructions in the README file i end up with the following error when going to localhost:8000

2017-08-26T20:50:54.099 - critical: ErrorException("type String has no field data")


2017-08-26T20:50:54.607 - critical: 
Stacktrace:
 [1] encryption_sauce() at /Users/linuslagerhjelm/.julia/v0.6/Genie/src/Encryption.jl:41
 [2] encrypt at /Users/linuslagerhjelm/.julia/v0.6/Genie/src/Encryption.jl:17 [inlined]
 [3] |> at ./operators.jl:862 [inlined]
 [4] set! at /Users/linuslagerhjelm/.julia/v0.6/Genie/src/Cookies.jl:47 [inlined]
 [5] #start#1(::Dict{String,String}, ::Function, ::String, ::HttpCommon.Request, ::HttpCommon.Response) at /Users/linuslagerhjelm/.julia/v0.6/Genie/src/Sessions.jl:64
 [6] route_request(::HttpCommon.Request, ::HttpCommon.Response, ::IPv4) at /Users/linuslagerhjelm/.julia/v0.6/Genie/src/Router.jl:84
 [7] handle_request(::HttpCommon.Request, ::HttpCommon.Response, ::IPv4) at /Users/linuslagerhjelm/.julia/v0.6/Genie/src/AppServer.jl:122
 [8] (::AppServer.##1#9)(::HttpCommon.Request, ::HttpCommon.Response) at /Users/linuslagerhjelm/.julia/v0.6/Genie/src/AppServer.jl:25
 [9] (::HttpServer.#on_message_complete#14{HttpServer.Server,HttpServer.Client{TCPSocket},Bool})(::HttpCommon.Request) at /Users/linuslagerhjelm/.julia/v0.6/HttpServer/src/HttpServer.jl:427
 [10] on_message_complete(::Ptr{HttpParser.Parser}) at /Users/linuslagerhjelm/.julia/v0.6/HttpServer/src/RequestParser.jl:113
 [11] http_parser_execute(::HttpParser.Parser, ::HttpParser.ParserSettings, ::Array{UInt8,1}) at /Users/linuslagerhjelm/.julia/v0.6/HttpParser/src/HttpParser.jl:115
 [12] process_client(::HttpServer.Server, ::HttpServer.Client{TCPSocket}, ::Bool) at /Users/linuslagerhjelm/.julia/v0.6/HttpServer/src/HttpServer.jl:389
 [13] (::HttpServer.##7#8{HttpServer.Server,Bool})() at ./task.jl:335

And I can not see anything but the 500 - error page in the browser 😞

DB Initialization Removed

e559572 Removed Genie.REPL.db_init() and is still referenced in documentation.

Best I can tell this function is still needed for initializing schema_migrations.
Alternatively a user could just run SearchLight.create_migrations_table(App.config.db_migrations_table_name) directly.

Switch to HTTP.Server

Hey @essenciary, really enjoyed your JuliaCon talk. Over the last little while, I've been working on overhauling some of the fundamental webstack packages, including HttpCommon, HttpParser, HttpServer, URIParser, and Requests.jl. I've consolidated the packages (for now) into a single HTTP.jl package that is meant to be a full replacement for the previous packages I mentioned. Functionality & APIs should be largely the same, so it shouldn't be too hard to switch over.

The long-term plan is to deprecate some of those webstack packages as they are not actively maintained.

I'll try to find some time to dig more into the Genie framework and maybe submit a PR or two to help switch over! Great stuff!

Warning: Replacing docs for `Genie.REPL.secret_token :: Tuple{}` in module `Genie.REPL

can not enter interactive session
julia = Version 1.0.0
window 10

julia> Genie.REPL.new_app("your_cool_new_app") [2018-09-12 11:54:37|info]: Done! New app created at C:\Users\swen\desktop\julia\your_cool_new_app [2018-09-12 11:54:38|info]: Changing active directory to your_cool_new_app [2018-09-12 11:54:38|info]: Installing app dependencies Updating registry at C:\Users\swen.julia\registries\GeneralUpdating git-repohttps://github.com/JuliaRegistries/General.git`
[2018-09-12 11:54:44|info]: Starting your brand new Genie app - hang tight!

Starting Genie in >> DEV << mode

β”Œ Warning: Replacing docs for Genie.REPL.secret_token :: Tuple{} in module Genie.REPL
β”” @ Base.Docs docs\Docs.jl:223
[2018-09-12 11:54:46|info]: LoadError("C:\Users\swen\desktop\julia\your_cool_new_app\genie.jl", 39, Base.Meta.ParseError("invalid escape sequence"))`

UndefinedVarError Registering Channel/WebSocket

Creating a channel and registering a new websocket catches a critical error.

ex. Route

channel("/movies/subscribe", MoviesChannel.subscribe, named = :ch_movie_subscribe)

ex. JS call

Channels.sendMessageTo('movies', 'subscribe', { 'arg': 'val' } );

When accessed, a critical error is caught near AppServer.jl:75

Tracing back, it looks to be an an UndefinedVarError in Route.jl:540

FYI - AccessControl.jl

Hi there,

Found this project by looking at the (few) stars of SecureSessions.jl.
Thought you might be interested in AccessControl.jl.

It is very much a work-in-progress, just thought I'd mention it, particularly if it overlaps with your project.
Feedback welcome, though I'm trying to keep it low-level at this stage to enable framework authors to wrap it with their preferred style.

Cheers,
Jock

respond_with_html needs full path

Hi, I'm trying to follow the step by step guide at

https://geniejl.readthedocs.io/en/latest/guides/Step%20by%20step%20app%20development%20with%20Genie/

When I get to adding the line

    respond_with_html("home", "home_page.md")

The home page is broken. To get it to work, I needed to replace this line with the full path to home_page.md:

    respond_with_html("home", "app/resources/home/views/home_page.md")

I've followed through the logic from Genie.Renderer to Genie.Flax and I don't see any path translation going on. Should there be?

Error when running using Geni

Error when running "using Genie"

Julia 1.0 OSX

`julia> using Genie
[ Info: Precompiling Genie [f2e6c872-b7ec-5699-ac8c-130193b63b97]
ERROR: LoadError: LoadError: ArgumentError: Package Genie does not have YAML in its dependencies:

  • If you have Genie checked out for development and have
    added YAML as a dependency but haven't updated your primary
    environment's manifest file, try Pkg.resolve().
  • Otherwise you may need to report an issue with Genie
    Stacktrace:
    [1] require(::Module, ::Symbol) at ./loading.jl:830
    [2] include at ./boot.jl:317 [inlined]
    [3] include_relative(::Module, ::String) at ./loading.jl:1038
    [4] include at ./sysimg.jl:29 [inlined]
    [5] include(::String) at /Users/dell/.julia/packages/Genie/3qBuH/src/Genie.jl:4
    [6] top-level scope at none:0
    [7] include at ./boot.jl:317 [inlined]
    [8] include_relative(::Module, ::String) at ./loading.jl:1038
    [9] include(::Module, ::String) at ./sysimg.jl:29
    [10] top-level scope at none:2
    [11] eval at ./boot.jl:319 [inlined]
    [12] eval(::Expr) at ./client.jl:389
    [13] top-level scope at ./none:3
    in expression starting at /Users/dell/.julia/packages/Genie/3qBuH/src/Configuration.jl:6
    in expression starting at /Users/dell/.julia/packages/Genie/3qBuH/src/Genie.jl:8
    ERROR: Failed to precompile Genie [f2e6c872-b7ec-5699-ac8c-130193b63b97] to /Users/dell/.julia/compiled/v1.0/Genie/MKohm.ji.
    Stacktrace:
    [1] error(::String) at ./error.jl:33
    [2] macro expansion at ./logging.jl:313 [inlined]
    [3] compilecache(::Base.PkgId, ::String) at ./loading.jl:1184
    [4] macro expansion at ./logging.jl:311 [inlined]
    [5] _require(::Base.PkgId) at ./loading.jl:941
    [6] require(::Base.PkgId) at ./loading.jl:852
    [7] macro expansion at ./logging.jl:311 [inlined]
    [8] require(::Module, ::Symbol) at ./loading.jl:834`

LoadError: LoadError: InitError: ArgumentError: Unknown time zone "America/Indianapolis" trying to run using Genie

I saw that this issue is closed but I am still getting the error
#48

I am on a corporate network I am not sure if that is why. Thank you!

ERROR: LoadError: LoadError: InitError: ArgumentError: Unknown time zone "America/Indianapolis"

Stacktrace:
[1] (::getfield(TimeZones, Symbol("##1#3")){String})() at %userprofile%.julia\packages\TimeZones\wytr8\src\TimeZones.jl:70
[2] get!(::getfield(TimeZones, Symbol("##1#3")){String}, ::Dict{AbstractString,Dates.TimeZone}, ::String) at .\dict.jl:453
[3] Type at %userprofile%.julia\packages\TimeZones\wytr8\src\TimeZones.jl:64 [inlined]
[4] localzone() at %userprofile%.julia\packages\TimeZones\wytr8\src\local.jl:146
[5] Type at %userprofile%.julia\packages\Memento\QMKyB\src\formatters.jl:35 [inlined]
[6] #config!#71(::String, ::Dict{AbstractString,Int64}, ::Bool, ::Bool, ::Bool, ::Bool, ::Function, ::Memento.Logger, ::String) at %userprofile%.julia\packages\Memento\QMKyB\src\config.jl:39
[7] #config!#69 at %userprofile%.julia\packages\Memento\QMKyB\src\config.jl:36 [inlined]
[8] config! at %userprofile%.julia\packages\Memento\QMKyB\src\config.jl:25 [inlined]
[9] init() at %userprofile%.julia\packages\Memento\QMKyB\src\Memento.jl:67
[10] _include_from_serialized(::String, ::Array{Any,1}) at .\loading.jl:627
[11] macro expansion at .\logging.jl:312 [inlined]
[12] _require_search_from_serialized(::Base.PkgId, ::String) at .\loading.jl:698
[13] _require(::Base.PkgId) at .\loading.jl:931
[14] require(::Base.PkgId) at .\loading.jl:852
[15] macro expansion at .\logging.jl:311 [inlined]
[16] require(::Module, ::Symbol) at .\loading.jl:834
[17] include at .\boot.jl:317 [inlined]
[18] include_relative(::Module, ::String) at .\loading.jl:1038
[19] include at .\sysimg.jl:29 [inlined]
[20] include(::String) at %userprofile%.julia\packages\Genie\VQydg\src\Genie.jl:4
[21] top-level scope at none:0
[22] include at .\boot.jl:317 [inlined]
[23] include_relative(::Module, ::String) at .\loading.jl:1038
[24] include(::Module, ::String) at .\sysimg.jl:29
[25] top-level scope at none:2
[26] eval at .\boot.jl:319 [inlined]
[27] eval(::Expr) at .\client.jl:389
[28] top-level scope at .\none:3
during initialization of module Memento
in expression starting at %userprofile%.julia\packages\Genie\VQydg\src\Loggers.jl:6
in expression starting at %userprofile%.julia\packages\Genie\VQydg\src\Genie.jl:24
ERROR: Failed to precompile Genie [c43c736e-a2d1-11e8-161f-af95117fbd1e] to %userprofile%.julia\compiled\v1.0\Genie\8eazC.ji.
Stacktrace:
[1] error(::String) at .\error.jl:33
[2] macro expansion at .\logging.jl:313 [inlined]
[3] compilecache(::Base.PkgId, ::String) at .\loading.jl:1184
[4] _require(::Base.PkgId) at .\logging.jl:311
[5] require(::Base.PkgId) at .\loading.jl:852
[6] macro expansion at .\logging.jl:311 [inlined]
[7] require(::Module, ::Symbol) at .\loading.jl:834

ConnectionPools.jl

Another FYI: ConnectionPools.jl may or may not help too. Working example is in the README, as well as in test/runtests.jl.

Currently it supports only Redis, but I'd be happy to add support for ODBC/SqLite/Postgres if that would help jinnie.

Extending the ORM to neo4j

How much work would that be?

It has a different querying language and is not a relational dn, but a graph db.

Edit: Maybe I don't need a graph db? I have entities that are related to multiple categories and to each other.

Can this be modelled currently or since tbe relationships will be many to many and there is no multiple inheritance , i would need to add code?

Maybe model composition instead of inheritance to handle the categories?

Server closes connection unexpectedly

For some reason, the "Hello World"-kinda example won't work for me:

using Genie
import Genie.Router: route

route("/") do
    "Hi there!"
end
Genie.AppServer.startup()

in juno will tell me the server is running on port 8000, but any browser I point at localhost:8000 will complain that the connection was unexpectedly closed.

Similarly when trying with netcat, the connection is closed after I sent GET / HTTP/1.1 rather than sending back the "Hi there!".

Using HTTP directly instead like

using HTTP
HTTP.listen() do http::HTTP.Request
    HTTP.Response("Hi there!")
end

creates the expected result.

Warnings on 0.6.0

On Julia 0.6.0 i've got a lot of warnings when "using Genie":

WARNING: Array{T}(::Type{T}, m::Int) is deprecated, use Array{T}(m) instead.
Stacktrace:
 [1] depwarn(::String, ::Symbol) at ./deprecated.jl:70
 [2] Array(::Type{Any}, ::Int64) at ./deprecated.jl:57
 [3] @memoize(::Vararg{Any,N} where N) at /home/a.konovalov/.julia/v0.6/Memoize/src/Memoize.jl:32
 [4] include_from_node1(::String) at ./loading.jl:569
 [5] eval(::Module, ::Any) at ./boot.jl:235
 [6] _require(::Symbol) at ./loading.jl:483
 [7] require(::Symbol) at ./loading.jl:398
 [8] include_from_node1(::String) at ./loading.jl:569
 [9] eval(::Module, ::Any) at ./boot.jl:235
 [10] _require(::Symbol) at ./loading.jl:483
 [11] require(::Symbol) at ./loading.jl:398
 [12] eval(::Module, ::Any) at ./boot.jl:235
 [13] eval_user_input(::Any, ::Base.REPL.REPLBackend) at ./REPL.jl:66
 [14] macro expansion at ./REPL.jl:97 [inlined]
 [15] (::Base.REPL.##1#2{Base.REPL.REPLBackend})() at ./event.jl:73
while loading /home/a.konovalov/.julia/v0.6/Genie/src/Configuration.jl, in expression starting on line 106

WARNING: deprecated syntax "abstract GenieType" at /home/a.konovalov/.julia/v0.6/Genie/src/genie_types.jl:8.
Use "abstract type GenieType end" instead.

WARNING: deprecated syntax "typealias Controller GenieController" at /home/a.konovalov/.julia/v0.6/Genie/src/genie_types.jl:16.
Use "const Controller = GenieController" instead.

WARNING: deprecated syntax "typealias Channel GenieChannel" at /home/a.konovalov/.julia/v0.6/Genie/src/genie_types.jl:21.
Use "const Channel = GenieChannel" instead.

WARNING: deprecated syntax "typealias Route Tuple{Tuple{String,String,Union{String,Function}},Dict{Symbol,Dict{Any,Any}}}" at /home/a.konovalov/.julia/v0.6/Genie/src/Router.jl:28.
Use "const Route = Tuple{Tuple{String,String,Union{String,Function}},Dict{Symbol,Dict{Any,Any}}}" instead.

WARNING: deprecated syntax "typealias Channel Tuple{Tuple{String,Union{String,Function}},Dict{Symbol,Dict{Any,Any}}}" at /home/a.konovalov/.julia/v0.6/Genie/src/Router.jl:29.
Use "const Channel = Tuple{Tuple{String,Union{String,Function}},Dict{Symbol,Dict{Any,Any}}}" instead.

WARNING: deprecated syntax "typealias HttpPostData Dict{String,String}" at /home/a.konovalov/.julia/v0.6/Genie/src/Input.jl:19.
Use "const HttpPostData = Dict{String,String}" instead.

WARNING: deprecated syntax "typealias HttpFiles Dict{String,HttpFile}" at /home/a.konovalov/.julia/v0.6/Genie/src/Input.jl:20.
Use "const HttpFiles = Dict{String,HttpFile}" instead.

WARNING: deprecated syntax "typealias ClientId Int" at /home/a.konovalov/.julia/v0.6/Genie/src/Channels.jl:9.
Use "const ClientId = Int" instead.

WARNING: deprecated syntax "typealias ChannelId String" at /home/a.konovalov/.julia/v0.6/Genie/src/Channels.jl:10.
Use "const ChannelId = String" instead.

WARNING: deprecated syntax "typealias ChannelClient Dict{Symbol,Union{WebSockets.WebSocket,Vector{ChannelId}}}" at /home/a.konovalov/.julia/v0.6/Genie/src/Channels.jl:11.
Use "const ChannelClient = Dict{Symbol,Union{WebSockets.WebSocket,Vector{ChannelId}}}" instead.

WARNING: deprecated syntax "typealias ChannelClientsCollection Dict{ClientId,ChannelClient}" at /home/a.konovalov/.julia/v0.6/Genie/src/Channels.jl:12.
Use "const ChannelClientsCollection = Dict{ClientId,ChannelClient}" instead.

WARNING: deprecated syntax "typealias ChannelSubscriptionsCollection Dict{ChannelId,Vector{ClientId}}" at /home/a.konovalov/.julia/v0.6/Genie/src/Channels.jl:13.
Use "const ChannelSubscriptionsCollection = Dict{ChannelId,Vector{ClientId}}" instead.

WARNING: deprecated syntax "typealias MessagePayload Union{Void,Dict}" at /home/a.konovalov/.julia/v0.6/Genie/src/Channels.jl:14.
Use "const MessagePayload = Union{Void,Dict}" instead.

Are you plan to completely switch to 0.6.0 in a near future? I will be very appreciate if you start new "temporary" git branch for 0.6.0 containing Genie code with fixed/modern Julia syntax.
I'm totally newcomer to Julia, so i'm not sure that i can fix all of this warnings correctly myself :(

EscapeString.jl

...yet another FYI:

EscapeString may or may not be helpful. AccessControl.jl uses it to escape HTML in order to prevent XSS attacks. The package is tiny at this stage, but provides a simple unified interface for escaping strings, handy for web app security. The plan is to build it out as required.

[RFI] License

Under which license is Genie.jl distributed ?

I haven't found any precise information for now.

Thanks
Oli

Errors when trying to start Genie

I just installed Genie by

Pkg.clone("https://github.com/essenciary/Genie.jl")

When try start it, I get

julia> using Genie
ERROR: LoadError: LoadError: LoadError: LoadError: UndefVarError: config not defined
Stacktrace:
 [1] is_dev() at /home/user/.julia/Genie/src/configuration.jl:41
 [2] include_from_node1(::String) at ./loading.jl:576
 [3] eval(::Module, ::Any) at ./boot.jl:235
 [4] _require(::Symbol) at ./loading.jl:490
 [5] require(::Symbol) at ./loading.jl:405
 [6] include_from_node1(::String) at ./loading.jl:576
 [7] eval(::Module, ::Any) at ./boot.jl:235
 [8] _require(::Symbol) at ./loading.jl:490
 [9] require(::Symbol) at ./loading.jl:405
 [10] include_from_node1(::String) at ./loading.jl:576
 [11] include(::String) at ./sysimg.jl:14
 [12] include_from_node1(::String) at ./loading.jl:576
 [13] eval(::Module, ::Any) at ./boot.jl:235
 [14] _require(::Symbol) at ./loading.jl:490
 [15] require(::Symbol) at ./loading.jl:405
while loading /home/user/.julia/Genie/src/App.jl, in expression starting on line 8
while loading /home/user/.julia/Genie/src/Inflector.jl, in expression starting on line 6
while loading /home/user/.julia/Genie/src/file_templates.jl, in expression starting on line 6
while loading /home/user/.julia/Genie/src/Genie.jl, in expression starting on line 32

I am using

julia> versioninfo()
Julia Version 0.6.3-pre.0
Commit 93168a6 (2017-12-18 07:11 UTC)
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz
  WORD_SIZE: 64
  BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Haswell)
  LAPACK: libopenblas64_
  LIBM: libopenlibm
  LLVM: libLLVM-3.9.1 (ORCJIT, haswell)

Install - deprecated packages?

Hello,

I noticed in doc / install:

https://github.com/essenciary/Genie.jl/blame/master/docs/src/index.md#L14

https://github.com/JuliaDB/DBI.jl doesn't seem to be very active and doesn't seem to support Julia 0.7.

julia> using DBI
[ Info: Precompiling DBI [1a78104a-c441-5896-88f2-79e5ca307c3b]
ERROR: LoadError: syntax: extra token "DatabaseSystem" after end of expression
Stacktrace:
 [1] include at ./boot.jl:317 [inlined]
 [2] include_relative(::Module, ::String) at ./loading.jl:1038
 [3] include(::Module, ::String) at ./sysimg.jl:29
 [4] top-level scope at none:2
 [5] eval at ./boot.jl:319 [inlined]
 [6] eval(::Expr) at ./client.jl:399
 [7] top-level scope at ./none:3
in expression starting at /Users/scls/.julia/dev/DBI/src/DBI.jl:25
ERROR: Failed to precompile DBI [1a78104a-c441-5896-88f2-79e5ca307c3b] to /Users/scls/.julia/compiled/v0.7/DBI/tyy23.ji.
Stacktrace:
 [1] error(::String) at ./error.jl:33
 [2] macro expansion at ./logging.jl:313 [inlined]
 [3] compilecache(::Base.PkgId, ::String) at ./loading.jl:1185
 [4] _require(::Base.PkgId) at ./logging.jl:311
 [5] require(::Base.PkgId) at ./loading.jl:852
 [6] macro expansion at ./logging.jl:311 [inlined]
 [7] require(::Module, ::Symbol) at ./loading.jl:834

and

https://github.com/essenciary/Genie.jl/blame/master/docs/src/index.md#L16

https://github.com/JuliaDatabases/PostgreSQL.jl is marked as DEPRECATED
maybe using https://github.com/invenia/LibPQ.jl should be considered.

Kind regards

Hydration / dehydration?

Just a dumb question, but is this the same thing as serializing & deserializing? Because it seems like a poor name if so.

Minimal working example?

I've been following this project for some time, and found I have some spare VMs to mess around on! Do you have a minimum working example available so I can check this package out?

I'm only lightly familiar with Flask, having built an app or two. So really, just something for Genie that defines a page, maybe a database export I can import...just something to get me started would be fantastic.

Integration with new Interact family?

One of the things which excite me most about Julia is solving the web two language problem. This won't go away completely until compilation to WASM is improved, but there are really meaningful steps in the new Interact work by @piever: https://discourse.julialang.org/t/ann-interactbase-a-redesign-of-interact-to-create-and-style-web-apps-in-julia/11471/2

Have you thought about integration with Genie? Doing both UI and backend in julia would be a real advantage over say Django for data scientist types and amateur webdevs.

Genie config seems to overuse `eval`

Just browsing through the code, I can see a lot of use of eval, which mostly seems to be used for pulling in configuration from the application. This seems a little fishy to me - generally eval should only be used in specialized circumstances, for example if you really need to generate a bunch of function definitions like you're doing inside Flax. For other uses, consider a setter function, for example:

module Foo

_config = nothing

function foo_config(c)
    global _config = c
end

function use_config()
    @info "using global config" config=_config
end

end

Thence

julia> Foo.foo_config("blah")
"blah"

julia> Foo.use_config()
β”Œ Info: using config
β””   config = "blah"

Using eval for pulling in configuration seems problematic and unlikely to work with precompilation. Actually I'm surprised it works at all! I'm probably missing something about how Genie initializes itself.

Registering on MetaData

Hi @essenciary, I really enjoyed your JuliaCon talk and I am so excited to start writing Genie Apps!

Is there something that prevents this package from being registered on MetaData? The current docs indicate that Pkg.clone is the method for getting this package.

Can't start Genie interactive mode

An installing of Genie was succeeded first time today.
But Genie console don't automatically start when I created new app.
If I run Genie server by myself (click .bat or , run bin/server) I get errors.

I'm using
Windows 10, Powershell
Julia v1.0
Genie (up to date)

julia> using Genie

julia> Genie.REPL.new_app( "my_genie" );
[2018-09-12 08:34:35|info]: Done! New app created at C:\users\wall-e\juliatest\my_genie

julia>
PS C:\users\wall-e\juliatest> cd my_genie
PS C:\users\wall-e\juliatest\my_genie> bin/server

C:\users\wall-e\juliatest\my_genie>C:\Users\Wall-E\AppData\Local\Julia-1.0.0\bin\julia -L ../genie.jl --color=yes --depwarn=no -q -- s
ERROR: could not open file C:\users\wall-e\juliatest\genie.jl
Stacktrace:
 [1] include at .\boot.jl:317 [inlined]
 [2] include_relative(::Module, ::String) at .\loading.jl:1038
 [3] include(::Module, ::String) at .\sysimg.jl:29
 [4] macro expansion at .\logging.jl:324 [inlined]
 [5] exec_options(::Base.JLOptions) at .\client.jl:219
 [6] _start() at .\client.jl:421

Updated signatures for route.jl

Hi,

We just pulled latest master branch and we see that the route definitions have changes (can't use a route(string,string...) route after recent commits. We compared the versions and those signatures have been removed. c0cd59b...f92789e

Looking for best way forward - is there another pattern that we should follow for route definitions? The example seem to still use the old definitions - https://github.com/essenciary/genie-todo-mvc/blob/master/config/routes.jl.

Thanks!

@dehann

Dependence on PostgreSQL

PostgreSQL is not in METADATA and from the README seems like it never will be unless someone else takes the reigns. But I notice it is a dependency to run

julia> include(Pkg.dir("Genie","genie.jl"))

I need to run

julia> using PostgreSQL

before genie.jl in v0.5 will run.

Not too serious, but just FYI πŸ‘

Authentication layer example

Hi,

I'd like to use OAuth 2.0-type authentication as part of an API. I can't seem to find an example of how to implement this using the existing auth layer. Is there an example, if not could I help write one?

Thanks! Great library by the way.

Error when trying to run the server in PROD mode

Genie is now working fine in DEV mode with Julia 1.0. However, if I try to run it in production mode I receive an error. This is with the untouched default app.

$ GENIE_ENV=prod bin/server
 _____         _
|   __|___ ___|_|___
|  |  | -_|   | | -_|
|_____|___|_|_|_|___|


Starting Genie in >> PROD << mode

ERROR: LoadError: LoadError: MethodError: Cannot `convert` an object of type String to an object of type Symbol
Closest candidates are:
  convert(::Type{T}, ::T) where T at essentials.jl:154
  Symbol(::String) at boot.jl:425
  Symbol(::AbstractString) at strings/basic.jl:205
  ...
Stacktrace:
 [1] (::getfield(Genie.Configuration, Symbol("##Settings#1#2")))(::Int64, ::Int64, ::String, ::Bool, ::String, ::String, ::Dict{String,String}, ::Array{String,1}, ::Bool, ::Int64, ::String, ::String, ::String, ::String, ::Symbol, ::Int64, ::String, ::Bool, ::String, ::Symbol, ::Bool, ::Bool, ::Bool, ::String, ::Bool, ::Bool, ::Bool, ::Bool, ::String, ::Symbol, ::String, ::String, ::Array{Tuple{String,String},1}, ::Symbol, ::Symbol, ::Bool, ::Bool, ::Bool, ::Bool, ::Symbol, ::Type) at /Users/antonio/.julia/packages/Genie/JhkJX/src/Configuration.jl:197
 [2] (::getfield(Core, Symbol("#kw#Type")))(::NamedTuple{(:output_length, :suppress_output, :log_router, :log_formatted, :log_cache, :log_views, :log_level, :log_verbosity, :assets_path, :cache_duration, :session_auto_start),Tuple{Int64,Bool,Bool,Bool,Bool,Bool,String,Symbol,String,Int64,Bool}}, ::Type{Settings}) at ./none:0
 [3] top-level scope at none:0
 [4] include at ./boot.jl:317 [inlined]
 [5] include_relative(::Module, ::String) at ./loading.jl:1038
 [6] include at ./sysimg.jl:29 [inlined]
 [7] include at /Users/antonio/code/my_cool_app/src/App.jl:4 [inlined]
 [8] bootstrap() at /Users/antonio/code/my_cool_app/src/App.jl:15
 [9] load() at /Users/antonio/code/my_cool_app/src/App.jl:200
 [10] top-level scope at none:0
 [11] include at ./boot.jl:317 [inlined]
 [12] include_relative(::Module, ::String) at ./loading.jl:1038
 [13] include(::Module, ::String) at ./sysimg.jl:29
 [14] exec_options(::Base.JLOptions) at ./client.jl:229
 [15] _start() at ./client.jl:421
in expression starting at /Users/antonio/code/my_cool_app/config/env/prod.jl:3
in expression starting at /Users/antonio/code/my_cool_app/genie.jl:45

using Genie

At some point, we should aim to be able to do the following:

julia> Pkg.clone("https://github.com/essenciary/Genie.jl.git")
julia> using Genie

Unless I'm confused, the shortest distance to be able to run Genie is:

julia> Pkg.clone("https://github.com/JuliaDB/PostgreSQL.jl.git")
julia> using PostgreSQL
julia> Pkg.clone("https://github.com/essenciary/Genie.jl.git")
julia> include(Pkg.dir("Genie","genie.jl"))

Also see #9

Post request with payload: Example

Hi,

I very recently started working with Genie. Really excited to try it out!

I searched for an example in the docs to handle a post request with request payload and I couldn't find any. Could you please share an example on how to handle a post request and handle it in a controller?

Also how to start the app in production mode?

Thank you,
Abann

LINQ support (FYI, at least..)

I just noticed: https://github.com/davidanthoff/LINQ.jl/tree/dev

And know of SearchLight ORM here.

I only think I know a bit at a high-level what LINQ is about - an ORM(?).

So there seems to be redundant effort here(?). [And SearchLight was already planned to have it's own package.] I've not looked into the status of LINQ.jl (or SearchLight), but I think it may be the way forward for those who do not want to write their own SQL (and I see here that PostgreSQL is no longer a dependency).

I would hate for there to be competing ORM solutions (or going to have to use two together or learn two..).

No YAML package for Genie-0.7.0 with Julia-0.5.0

Hi, i tried to use Genie with Julia-0.5.0 on Windows8

Genie.jl-0.7.0>julia -L genie.jl --color=yes -q

Starting Genie in >> DEV << mode using 1 worker(s)

ERROR: LoadError: LoadError: LoadError: LoadError: ArgumentError: Module YAML no
t found in current path.
Run Pkg.add("YAML") to install the YAML package.

julia> Pkg.add("YAML")
ERROR: unknown package https://github.com/JuliaDB/DBI.jl required by Genie.jl-0.
7.0

Thanks in advance!

POST data

'lo.

I'd be interested in adding support for POST data if you don't already have it covered.

I already have some code written for getting POST and file data from my CGI module (see https://github.com/Jaylle/CGI.jl/blob/master/CGI.jl#L365 for example) - so I'd most likely use/modify that.

As for the interface, is there any preference for how this should be accessible and how it should work internally? For example, I see that GET query params are currently passed automatically as a method argument, but I like the idea of the framework not having to parse the POST/file data until an attempt is made to access said data (just to avoid doing unnecessary work). This would require having a new method (e.g. Genie.input) or module (e.g. Input.post) return an object containing the POST and/or file data on-demand, unless you could suggest an alternative.

Let me know your thoughts.

Module distributed no found in current path

julia> using Genie
WARNING: requiring "Dates" in module "SearchLight" did not define a correspondin
g module.
ERROR: LoadError: LoadError: ArgumentError: Module Distributed not found in curr
ent path.
Run Pkg.add("Distributed") to install the Distributed package.
Stacktrace:
[1] _require(::Symbol) at .\loading.jl:435
[2] require(::Symbol) at .\loading.jl:405
[3] include_from_node1(::String) at .\loading.jl:576
[4] eval(::Module, ::Any) at .\boot.jl:235
[5] _require(::Symbol) at .\loading.jl:490
[6] require(::Symbol) at .\loading.jl:405
[7] include_from_node1(::String) at .\loading.jl:576
[8] eval(::Module, ::Any) at .\boot.jl:235
[9] _require(::Symbol) at .\loading.jl:490
[10] require(::Symbol) at .\loading.jl:405
while loading C:\Users\Administrator.julia\v0.6\SearchLight\src\SearchLight.jl,
in expression starting on line 20
while loading C:\Users\Administrator.julia\v0.6\Genie\src\Genie.jl, in expressi
on starting on line 13

===========
julia> Pkg.add("Distributed")
ERROR: unknown package Distributed
macro expansion at .\pkg\entry.jl:53 [inlined]
(::Base.Pkg.Entry.##1#3{String,Base.Pkg.Types.VersionSet})() at .\task.jl:335
Stacktrace:
[1] sync_end() at .\task.jl:287
[2] macro expansion at .\task.jl:303 [inlined]
[3] add(::String, ::Base.Pkg.Types.VersionSet) at .\pkg\entry.jl:51
[4] (::Base.Pkg.Dir.##4#7{Array{Any,1},Base.Pkg.Entry.#add,Tuple{String}})() at
.\pkg\dir.jl:36
[5] cd(::Base.Pkg.Dir.##4#7{Array{Any,1},Base.Pkg.Entry.#add,Tuple{String}}, ::
String) at .\file.jl:59
[6] #cd#1(::Array{Any,1}, ::Function, ::Function, ::String, ::Vararg{String,N}
where N) at .\pkg\dir.jl:36
[7] add(::String) at .\pkg\pkg.jl:117

Nothing shows up after running server

Julia 1.0 OSX

`julia> HTTP.listen() do request::HTTP.Request
@show request
@show request.method
@show HTTP.header(request, "Content-Type")
@show HTTP.payload(request)
try
return HTTP.Response("Hello")
catch e
return HTTP.Response(404, "Error: $e")
end
end
[ Info: Listening on: Sockets.InetAddr{Sockets.IPv4}(ip"127.0.0.1", 0x1f91)

`

fix src/Genie.jl

This error occurred in Solus Linux, julia v0.6

julia> using Genie
ERROR: LoadError: could not open file /home/khkkoj/.julia/v0.6/Genie/src/configuration.jl
Stacktrace:
 [1] macro expansion at ./REPL.jl:97 [inlined]
 [2] (::Base.REPL.##1#2{Base.REPL.REPLBackend})() at ./event.jl:73
while loading /home/khkkoj/.julia/v0.6/Genie/src/Genie.jl, in expression starting on line 8

The problem was in src/Genie.jl

in line 8,

include(joinpath(Pkg.dir("Genie"), "src", "configuration.jl"))

configuration.jl should be changed to Configuation.jl since the file name in the src folder is the capitalized one...

I fixed this and it ran well!

Precompile / sysimg / binary

@essenciary, have you tried (or know about) precompiling a Genie project into a single executable? Ideally for use in a desktop app, something like https://github.com/NHDaly/ApplicationBuilder.jl

Or, what about building a sysimg? I got my way through generating a sysimg but so far it hasnt produced any noticeable benefit -- the structure of the project seems to require a little more hoop jumping to ensure all deps are compiled AOT...

I'm loving the perf & boilerplate you established with Genie, but that initial wait time to compile each route as they are first-requested just kills the possibilities beyond traditional long-running deployments. Is there a flag I'm missing to precompile each Flax view/route?

I'm pretty confident the killer feature that'll open the floodgates of adoption, with Julia web servers in general, would be parity with golang's ability to spit out a self-contained binary. Any electron app beyond the scope of throwaway utilities ends up with non-trivial server & DB systems (ie https://github.com/Foundry376/Mailspring) that would benefit herein. Any thoughts/advice in this direction?

Building EzXML BUG V(1.1)

Building EzXML ────→ ~/.julia/packages/EzXML/DUxj7/deps/build.log
β”Œ Error: Error building EzXML:
β”‚ β”Œ Warning: platform_key() is deprecated, use platform_key_abi() from now on
β”‚ β”‚ caller = ip:0x0
β”‚ β”” @ Core :-1
β”‚ [ Info: Downloading https://github.com/bicycle1885/XML2Builder/releases/download/v1.0.1/XML2Builder.v2.9.7.x86_64-linux-gnu.tar.gz to /root/.julia/packages/EzXML/DUxj7/deps/usr/downloads/XML2Builder.v2.9.7.x86_64-linux-gnu.tar.gz...
β”‚ ERROR: LoadError: Could not download https://github.com/bicycle1885/XML2Builder/releases/download/v1.0.1/XML2Builder.v2.9.7.x86_64-linux-gnu.tar.gz to /root/.julia/packages/EzXML/DUxj7/deps/usr/downloads/XML2Builder.v2.9.7.x86_64-linux-gnu.tar.gz:
β”‚ ErrorException("")
β”‚ Stacktrace:
β”‚ [1] error(::String) at ./error.jl:33
β”‚ [2] macro expansion at ./logging.jl:313 [inlined]
β”‚ [3] #download#89(::Bool, ::Function, ::String, ::String) at /root/.julia/packages/BinaryProvider/cVlaj/src/PlatformEngines.jl:487
β”‚ [4] #download at ./none:0 [inlined]
β”‚ [5] #download_verify#90(::Bool, ::Bool, ::Bool, ::Function, ::String, ::String, ::String) at /root/.julia/packages/BinaryProvider/cVlaj/src/PlatformEngines.jl:567
β”‚ [6] #download_verify at ./none:0 [inlined]
β”‚ [7] #install#129(::Prefix, ::String, ::Bool, ::Bool, ::Bool, ::Function, ::String, ::String) at /root/.julia/packages/BinaryProvider/cVlaj/src/Prefix.jl:314
β”‚ [8] (::getfield(BinaryProvider, Symbol("#kw##install")))(::NamedTuple{(:prefix, :force, :verbose),Tuple{Prefix,Bool,Bool}}, ::typeof(install), ::String, ::String) at ./none:0
β”‚ [9] top-level scope at /root/.julia/packages/EzXML/DUxj7/deps/build.jl:36
β”‚ [10] include at ./boot.jl:317 [inlined]
β”‚ [11] include_relative(::Module, ::String) at ./loading.jl:1041
β”‚ [12] include(::Module, ::String) at ./sysimg.jl:29
β”‚ [13] include(::String) at ./client.jl:388
β”‚ [14] top-level scope at none:0
β”‚ in expression starting at /root/.julia/packages/EzXML/DUxj7/deps/build.jl:32
β”‚ [16:52:17]
β”‚ [16:52:17] curl: (35) Peer reports incompatible or unsupported protocol version.
β”” @ Pkg.Operations /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.0/Pkg/src/Operations.jl:1069
Building Gumbo ────→ ~/.julia/packages/Gumbo/G7Qbw/deps/build.log
β”Œ Error: Error building Gumbo:
β”‚ β”Œ Warning: platform_key() is deprecated, use platform_key_abi() from now on
β”‚ β”‚ caller = ip:0x0
β”‚ β”” @ Core :-1
β”‚ β”Œ Warning: Could not extract the platform key of https://github.com/JuliaWeb/GumboBuilder/releases/download/v0.1.0/Gumbo.x86_64-linux-gnu.tar.gz; continuing...
β”‚ β”” @ BinaryProvider ~/.julia/packages/BinaryProvider/cVlaj/src/Prefix.jl:185
β”‚ [ Info: Downloading https://github.com/JuliaWeb/GumboBuilder/releases/download/v0.1.0/Gumbo.x86_64-linux-gnu.tar.gz to /root/.julia/packages/Gumbo/G7Qbw/deps/usr/downloads/Gumbo.x86_64-linux-gnu.tar.gz...
β”‚ ERROR: LoadError: Could not download https://github.com/JuliaWeb/GumboBuilder/releases/download/v0.1.0/Gumbo.x86_64-linux-gnu.tar.gz to /root/.julia/packages/Gumbo/G7Qbw/deps/usr/downloads/Gumbo.x86_64-linux-gnu.tar.gz:
β”‚ ErrorException("")
β”‚ Stacktrace:
β”‚ [1] error(::String) at ./error.jl:33
β”‚ [2] macro expansion at ./logging.jl:313 [inlined]
β”‚ [3] #download#89(::Bool, ::Function, ::String, ::String) at /root/.julia/packages/BinaryProvider/cVlaj/src/PlatformEngines.jl:487
β”‚ [4] #download at ./none:0 [inlined]
β”‚ [5] #download_verify#90(::Bool, ::Bool, ::Bool, ::Function, ::String, ::String, ::String) at /root/.julia/packages/BinaryProvider/cVlaj/src/PlatformEngines.jl:567
β”‚ [6] #download_verify at ./none:0 [inlined]
β”‚ [7] #install#129(::Prefix, ::String, ::Bool, ::Bool, ::Bool, ::Function, ::String, ::String) at /root/.julia/packages/BinaryProvider/cVlaj/src/Prefix.jl:314
β”‚ [8] (::getfield(BinaryProvider, Symbol("#kw##install")))(::NamedTuple{(:prefix, :force, :verbose),Tuple{Prefix,Bool,Bool}}, ::typeof(install), ::String, ::String) at ./none:0
β”‚ [9] top-level scope at /root/.julia/packages/Gumbo/G7Qbw/deps/build.jl:27
β”‚ [10] include at ./boot.jl:317 [inlined]
β”‚ [11] include_relative(::Module, ::String) at ./loading.jl:1041
β”‚ [12] include(::Module, ::String) at ./sysimg.jl:29
β”‚ [13] include(::String) at ./client.jl:388
β”‚ [14] top-level scope at none:0
β”‚ in expression starting at /root/.julia/packages/Gumbo/G7Qbw/deps/build.jl:23
β”‚ [16:52:32]
β”‚ [16:52:32] curl: (35) Peer reports incompatible or unsupported protocol version.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.