Giter VIP home page Giter VIP logo

maxurl's Introduction

Image Max URL

Image Max URL is a program that will try to find larger/original versions of images and videos, usually by replacing URL patterns.

It currently contains support for >9000 hardcoded websites (full list in sites.txt), but it also supports a number of generic engines (such as Wordpress and MediaWiki), which means it can work for many other websites as well.

It is currently released as:

  • Userscript: (most browsers)
  • Browser extension: Firefox (other browsers supporting WebExtensions can sideload the extension through this git repository)
    • Since addons have more privileges than userscripts, it has a bit of extra functionality over the userscript
    • Source code is in manifest.json and the extension folder
  • Website
    • Due to browser security constraints, some URLs (requiring cross-origin requests) can't be supported by the website
    • Source code is in the gh-pages branch
  • Reddit bot (/u/MaxImageBot)

Community:

Sideloading the extension

The extension is currently unavailable to other browsers' addon stores (such as Chrome and Microsoft Edge), but you can sideload this repository if you wish to use the extension version instead of the userscript.

  • Repository:
    • Download the repository however you wish (I'd recommend cloning it through git as it allows easier updating)
    • Chromium:
      • Go to chrome://extensions, make sure "Developer mode" is enabled, click "Load unpacked [extension]", and navigate to the maxurl repository
    • Firefox:
      • Go to about:debugging->This Firefox, select "Load temporary Add-on...", and navigate to "manifest.json" within the maxurl repository
      • Note that the addon will be deleted once Firefox is closed. There's unfortunately nothing I can do about this.
  • CRX (Chromium-based browsers):
  • XPI (Firefox-based browsers):

Contributing

Any contribution is greatly appreciated! If you have any bug reports, feature requests, or new websites you want supported, please file an issue here.

If you don't have a Github account, feel free to either use one of the community links above or contact me directly.

If you wish to contribute to the repository itself (code contributions, translations, etc.), please check CONTRIBUTING.md for more information.

Integrating IMU in your program

As mentioned above, userscript.user.js also functions as a node module.

var maximage = require('./userscript.user.js');

maximage(smallimage, {
  // If set to false, it will return only the URL if there aren't any special properties
  // Recommended to keep true.
  //
  // The only reason this option exists is as a small hack for a helper userscript used to find new rules,
  //  to check if IMU already supports a rule.
  fill_object: true,

  // Maximum amount of times it should be run.
  // Recommended to be at least 5.
  iterations: 200,

  // Whether or not to store to, and use an internal cache for URLs.
  // Set this to "read" if you want to use the cache without storing results to it.
  use_cache: true,

  // Timeout (in seconds) for cache entries in the URL cache
  urlcache_time: 60*60,

  // List of "problems" (such as watermarks or possibly broken image) to exclude.
  //
  // By default, all problems are excluded.
  // You can access the excluded problems through maximage.default_options.exclude_problems
  // By setting it to [], no problems will be excluded.
  //exclude_problems: [],

  // Whether or not to exclude videos
  exclude_videos: false,

  // This will include a "history" of objects found through iterations.
  // Disabling this will only keep the objects found through the last successful iteration.
  include_pastobjs: true,

  // This will try to find the original page for an image, even if it requires extra requests.
  force_page: false,

  // This allows rules that use 3rd-party websites to find larger images
  allow_thirdparty: false,

  // This is useful for implementing a blacklist or whitelist.
  //  If unspecified, it accepts all URLs.
  filter: function(url) {
    return true;
  },

  // Helper function to perform HTTP requests, used for sites like Flickr
  //  The API is expected to be like GM_xmlHTTPRequest's API.
  // An implementation using node's request module can be found in reddit-bot/dourl.js
  do_request: function(options) {
    // options = {
    //   url: "",
    //   method: "GET",
    //   data: "", // for method: "POST"
    //   overrideMimeType: "", // used to decode alternate charsets
    //   headers: {}, // If a header is null or "", don't include that header
    //   onload: function(resp) {
    //     // resp is expected to be XMLHttpRequest-like object, implementing these fields:
    //     //   finalUrl
    //     //   readyState
    //     //   responseText
    //     //   status
    //   }
    // }
  },

  // Callback
  cb: function(result) {
    if (!result)
      return;

    if (result.length === 1 && result[0].url === smallimage) {
       // No larger image was found
       return;
    }

    for (var i = 0; i < result.length; i++) {
      // Do something with the object
    }
  }
});

The result is a list of objects that contain properties that may be useful in using the returned image(s):

[{
  // The URL of the image
  url: null,

  // Whether or not this URL is a video
  video: false,

  // Whether it's expected that it will always work or not.
  //  Don't rely on this value if you don't have to
  always_ok: false,

  // Whether or not the URL is likely to work.
  likely_broken: false,

  // Whether or not the server supports a HEAD request.
  can_head: true,

  // HEAD errors that can be ignored
  head_ok_errors: [],

  // Whether or not the server might return the wrong Content-Type header in the HEAD request
  head_wrong_contenttype: false,

  // Whether or not the server might return the wrong Content-Length header in the HEAD request
  head_wrong_contentlength: false,

  // This is used in the return value of the exported function.
  //  If you're using a callback (as shown in the code example above),
  //  this value will always be false
  waiting: false,

  // Whether or not the returned URL is expected to redirect to another URL
  redirects: false,

  // Whether or not the URL is temporary/only works on the current IP (such as a generated download link)
  is_private: false,

  // Whether or not the URL is expected to be the original image stored on the website's servers.
  is_original: false,

  // If this is true, you shouldn't input this URL again into IMU.
  norecurse: false,

  // Whether or not this URL should be used.
  // If true, treat this like a 404
  // If "mask", this image is an overlayed mask
  bad: false,

  // Same as above, but contains a list of objects, e.g.:
  // [{
  //    headers: {"Content-Length": "1000"},
  //    status: 301
  // }]
  // If one of the objects matches the response, it's a bad image.
  // You can use maximage.check_bad_if(bad_if, resp) to check.
  //  (resp is expected to be an XHR-like object)
  bad_if: [],

  // Whether or not this URL is a "fake" URL that was used internally (i.e. if true, don't use this)
  fake: false,

  // Headers required to view the returned URL
  //  If a header is null, don't include that header.
  headers: {},

  // Additional properties that could be useful
  extra: {
    // The original page where this image was hosted
    page: null,

    // The title/caption attached to the image
    caption: null
  },

  // If set, this is a more descriptive filename for the image
  filename: "",

  // A list of problems with this image. Use exclude_problems to exclude images with specific problems
  problems: {
    // If true, the image is likely larger than the one inputted, but it also has a watermark (when the inputted one doesn't)
    watermark: false,

    // If true, the image is likely smaller than the one inputted, but it has no watermark
    smaller: false,

    // If true, the image might be entirely different from the one inputted
    possibly_different: false,

    // If true, the image might be broken (such as GIFs on Tumblr)
    possibly_broken: false
  }
}]

maxurl's People

Contributors

0x464e avatar 4-floss-free-libre-open-source-software avatar anhnhan avatar cdwcgt avatar coastline-echo avatar contextnerror avatar dependabot[bot] avatar dym-sh avatar freso avatar insimpletermsjordan avatar jabster28 avatar kattjevfel avatar kidonng avatar luke-l avatar machou avatar mannivu avatar qsniyg avatar renr3n avatar thelastzombie avatar vanja-san avatar yfdyh000 avatar

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

maxurl's Issues

Setting categories

There are a lot of settings, having categories could help to organize them.

Option for replacing images/links

The option would be disabled by default, but in some cases, it could be useful to replace images to larger ones automatically, or possibly replace/add links to the images that would contain the larger versions.

Progress:

  • Replace images
  • Replace links

Add support for oclc.org and wsimg.com

Twitter: Change redirection

Hi. The script currently appends :orig to the url. This causes my browser to save it as .jpg_orig.

Can you change it from
https://pbs.twimg.com/media/Dbxmq4BV4AA2ozg.jpg:orig
to?
https://pbs.twimg.com/media/Dbxmq4BV4AA2ozg?format=jpg&name=orig

My browser will save it as .jpeg

booth.pximg.net: some image has larger png version

Example:

https://booth.pximg.net/30cd84bf-4155-491d-abee-5770b2947e00/i/1236274/0df91fe3-7ce5-41ad-89f8-a6a52625e752_base_resized.jpg

This doesn't redirect which I assume it because 0df91fe3-7ce5-41ad-89f8-a6a52625e752.jpg returns 404; but it has a larger version at 0df91fe3-7ce5-41ad-89f8-a6a52625e752.png.

(Keep in mind that's not the case for all the images: some do only have JPEG original image. Example. So I'm not sure if it's easy to implement it.)

Popup doesn't stay open after releasing keys

Currently set to Ctrl + Alt, but Ctrl + Shift expresses the same behaviour:

  • Hold both Ctrl and Alt: popup flashes repeatly (not unexpected but kind of weird)
  • Release Alt but hold Ctrl: popup stay (idea)
  • Release both Ctrl and Alt: popup disappear instead of staying open.

Version: 0.70, Addon
Browser: Firefox 62.0.3 x64
Sample site: any site, but here's the first one:
https://www.ghacks.net/2018/10/12/load-larger-image-copies-with-image-max-url

Sveriges Television https://www.svt.se/

Hi,

0,1% of your users will probably benefit this so it is not a super important thing to add.
Images on the website for the Swedish television broadcaster SVT can be better quality.
Main website is https://www.svt.se/ and CDN is https://www.svtstatic.se/.

Example URLs:
https://www.svtstatic.se/image/cinema/760/19912234/1541383772?quality=70&format=auto
https://www.svtstatic.se/image/wide/480/19864886/1540988000?quality=70&format=auto
https://www.svtstatic.se/image/square/200/19910166/1541348996?quality=70&format=auto

URL is svtstatic.se/image/crop/width/ID/verson.extension

Crop can be Original, cinema, imax, square, tv, fourthree, portrait, logo andwide .
Width can be Unscaled, default or an integer
ID isn't always 8 numbers, older images seem to only have 7
Version can be left out, only for cache busting (E.g. /image/wide/992/19912126?quality=70&format=auto)
Extension can be .jpg, .png, .gif and .webp.

We get .jpg 100% of the time even if format=auto is in the URL so I guess it can be left out?

Quality
Looks like images have 70% quality at default. Can be changed by changing ?quality=70 to ?quality=100 in the URL. Changing it to 100 increases the quality. Removing everything defaults to 70%.

/image/wide/992/19912126/1541373740?quality=70 is 72 KB
/image/wide/992/19912126/1541373740?quality=100 is 392 KB
/image/wide/992/19912126/1541373740 is 72 KB

Resolution
Different crop has different resolution. Thumbnails has /224/, normal images has /992/, square thumbnail has /200/ in the URL. 992px looks like the biggest they use.
Can be changed to /unscaled/ to get original image.
/image/wide/224/19912126/1541373740?quality=100 is 224x126px
/image/wide/unscaled/19912126/1541373740?quality=100 is 1920x1080px

Crop
Different images are cropped differently.
Can be Original, cinema, imax, square, tv, fourthree, portrait, logo and wide.

Example: Changing /cinema/ to /original/ to get non-cropped verison:
/image/cinema/unscaled/19765912/1540298095?quality=100 832px vertical
/image/original/unscaled/19765912/1540298095?quality=100 1080px vertical

Image format
Images are served as JPEG at default. Can be changed to PNG to increase quality(?). If images are changed to .png we don't need quality=100.

/image/original/unscaled/19765912/1540298095.jpg?quality=100 is 706 KB
/image/original/unscaled/19765912/1540298095.png is 2,23 MB

Problems with changing file format
Some images get darker while others don't.

This one changes color:
/image/original/unscaled/19912234/1541383772.png
/image/original/unscaled/19912234/1541383772?quality=100

This one doesn't change:
/image/original/unscaled/19911014/1541355230?quality=100
/image/original/unscaled/19911014/1541355230.png

Sorry for the wall of text, and thanks if you try to do any of this!
~@TheLovinator1

Greasyfork's 2MB limit

The base userscript is now more than 2MB, which prevents it from being able to be on Greasyfork.

The current solution is to strip comments, which brings it down to <1MB.

Don't move popup when browsing gallery

Since the popup is essentially "reset" when going to the next or previous image in a gallery, it will open where the mouse is. When using the UI to click on the left/right arrows, this can be quite jarring. Instead, it should open based off the last position.

Extend the hotkey support for the addon

Currently only Shift, Ctrl and Alt can be set as the popup hotkeys and all keys interfere with standard computer usage, I constantly experience the webpage background image being opened when typing (for instance on https://steamcommunity.com/). Preferably allow setting any key and combination of keys.

Bookwalker Support

Would supporting Bookwalker be acceptable?

Product page: https://bookwalker.jp/de320cc93c-47f1-422d-a917-e14f3be19b67/

Standard image: https://rimg.bookwalker.jp/7759762/frDGCemG5kX9EBY8IrbThQ__.jpg
Alt image: https://c.bookwalker.jp/7759762/t_700x780.jpg
Original undisplayed image: https://c.bookwalker.jp/coverImage_2679576.jpg

Here is a bookmarklet we made that explains URL conversion for reference:
javascript:!function(a){var b=document.createElement("textarea"),c=document.getSelection();b.textContent=a,document.body.appendChild(b),c.removeAllRanges(),b.select(),document.execCommand("copy"),c.removeAllRanges(),document.body.removeChild(b)}("https://c.bookwalker.jp/coverImage_" + (parseInt($('meta[property="og:image"]').attr('content').split("/")[3].split("").reverse().join(""))-1) + ".jpg");

Website and userscript not working

I tried the website today (few minutes ago) and it doesn't seem to be working for me. It's working on the mobile btw.
Also, tried using the userscript too, through TamperMonkey on Chrome and it doesn't run too.

UI for the popup

Adding a close button, as well as left/right arrows to browse the gallery could be useful for those who don't want to only rely on keyboard bindings. It would also allow for a minor workaround for websites such as Instagram and Imgur that overwrite keyboard bindings (until #38 is fixed properly).

#37 could also use this.

Key combinations for mouseover popup trigger

Can you add key combinations for the popup trigger? The single key trigger can get annoying when I'm navigating tabs (Ctrl+Shift+Tab) and windows (Alt+Shift+Tab).

Two-key combinations (e.g. Ctrl+Alt) would be good. Three-key combinations (e.g. Alt+Shift+x or Ctrl+Alt+Shift) would be better.

No longer works on deviantart images

As of yesterday, deviantart images are no longer affected by this script (and remain the default "-fullview" lower-res size/quality assigned by deviantart/wixmp). I noticed, when opening them in a new tab, that the new tab no longer refreshes/reloads with the higher/max resolution & quality. Attempting to edit the dimensions or quality in the URL results in an "unauthorized" error page.

For example:
https://www.deviantart.com/raikoart/art/Riven-790761430

Behavior BEFORE:
(in chrome)
Click on image to zoom until max zoomed > right click > open in new tab >image opens in new tab (default "-fullview" low-res version > after a second, script reloads image w/ larger dimensions + higher quality

Behavior NOW:
Click on image to zoom until max zoomed > right click > open in new tab >image opens in new tab (default "-fullview" low-res version > script does not reload image, instead is mouse cursor is constantly 'loading' when in the new tab

Tried enabling/disabling tampermonkey, Image Max url, restart chrome, no good.

The Firefox plugin appears to be working normally however, so perhaps it is a chrome-specific issue?

EDIT: Nevermind, the firefox extension no longer reloads deviantart images with their larger/full res versions either now. Just had it work on one image, and no more after that (using the shift+control key to bring up a popup just displays an endless loading cursor on the mouse).

Script fails to run

I recently found this script and installed it using Tapermonkey on Google Chrome. However, when I try to open an image in a new tab, nothing happens.

PopUp styling

It would be nice to be able to have some sort of customization (for the extension version) for the popUp appearance (borders, shadows, border-radius): either in form of presets or a custom field where user can add their own CSS rules (find example below)

border: 7px solid hsla(0,0%,95%,.6); 
border-radius: 5px; 
box-shadow: 0 0 2px #666

reddit profile icons and banners

Larger area for left and right gallery buttons

If the mouse moves to the left or right side of the image, clicking should result in the gallery being moved left/right, because otherwise the buttons can be a little hard to click.

Popup trigger bug

Chromium v67.0.3396.87
Image Max URL v0.4.8
Mouseover popup trigger Ctrl+Shift+Alt

This bug has been annoying me since v0.4.5 or v0.4.7. The trigger would be executed even if I only pressed Ctrl+Shift.

Steps to reproduce:

  1. Set popup trigger to Ctrl+Shift+Alt
  2. Open any webpage with at least one image (e.g. youtube.com)
  3. Press Ctrl+Shift while hovering mouse on top of an image (no effect as expected)
  4. Press Alt+e (will open chromium's menu)
  5. Press Esc or click anywhere on the page (to hide the menu)
  6. Press Ctrl+Shift while hovering mouse on top of an image (trigger is unexpectedly executed)

Rewrite in a structured manner

Right now, the script works by a very large chain of if blocks. This results in decent performance, but it could be improved, and it can get rather frustrating to debug issues.

Rewriting the script manually would be next to impossible. Instead, since the vast majority of the rules are written in more or less the same way, they could be automatically parsed. The rest would be done manually.

Naively loading the resulting object and parsing it in the script would likely result in a performance nightmare. Instead, it would be compiled in a format similar to this:

switch(domain[0]) {
    case 'a':
        switch (domain[1]) {
            case 'a':
                // ...
        }
        break;
    case 'b':
        switch (domain[1]) {
            case 'a':
                // ...
        }
        break;
    // ...
}

Each of the rules could be functions stored in an array.


Problems so far:

  • Test cases. Not only is it important for the test cases to remain intact, it's also important they remain intact relative to where they were (especially important for larger rules). If they are added as comments, they should somehow still remain near the sites. If they are added as an object (which would allow for automatic tests), they should remain close to the domains, possibly following a format similar to this:
{
    domain: "abc.com",
    tests: [
        {start: "...", end: "..."}
    ]
}
  • The actual format. How exactly should it be structured?
  • Ease of development. Right now, the development is quite simple. Adding a layer of compilation would require extra time (unless it was somehow done automatically?). On top of this, the structured format would be more verbose, and therefore require more time to develop for. Alternatively, a custom format could be created, akin to Adblock.
  • Usefulness. Is the outcome really worth all this effort? While it would be undeniably better, this is quite a simple script. The current method is acceptably fast (it can process a couple thousand different URLs in a matter of seconds), and development is quite efficient.
  • 2MB Limit. This might make the userscript go over the 2MB limit imposed by Greasyfork. One way to get around this could be to download and compile rules on the fly.

If you're curious, this is a quick explanation as to why it was written the way it was.

Custom rules

This would allow people to create their own rules, likely requires #12 to be implemented first.

Although this could theoretically be done before, it would require creating a custom system, which would likely have to be replaced once #12 is implemented. This has a few possible problems:

  1. One of the main blockers for #12 is knowing how to create a proper system for organizing all the rules. Figuring this out likely requires much of #12 to be implemented anyways.
  2. If the custom system is just hacked together (or just using plain javascript eval), it would likely result in the user having to rewrite all of their rules, unless they can somehow be migrated to the new format (virtually impossible in the case of javascript eval).
  3. Plain javascript eval is not only highly sensitive to changes within the userscript (which doesn't have a stable abi), it's also blocked on a number of major websites, meaning that custom rules will not work on them if using the userscript.

Whatever solution is implemented for this, it will take a significant amount of time to implement and document. Users will have to learn a new system, and changing the system midway through is going to hamper user experience (setting aside the issue of a relatively large amount of duplicated development time).

As unoptimal as it is, until #12 is implemented, for now the best option to add your own rules is to submit an issue (or contact me directly) for it to be included upstream, then edit the script locally until then (or use git master).

Make popup behavior more configurable

Right now, the behavior is:

when (trigger_keys_are_pressed) {
  start_loading_image();
}

when (image_finished_loading) {
  show_popup();

  if (trigger_keys_are_pressed) {
    when (!trigger_keys_are_pressed) {
      hide_popup();
    }
  } else {
    when (any_key_is_pressed) {
      hide_popup();
    }
  }
}

This behavior was chosen because it could be annoying to have to keep holding down the trigger keys while the image is loading in order to see the image. However, this behavior could be confusing or annoying to some users, so it should be configurable.

Add option to go through image layers

Right now it tries to "guess" the correct layer, but there are times it guesses wrong. This likely needs a UI (unless the up/down arrow keys were used for this).

It should also allow going through IMU's history for the specified image.

Hotkeys don't work when resistFingerprinting is set to true in about:config in Firefox

I'm not sure if I should file this as a bug or not, probably not as I'm assuming it's a browser limitation, but it was bothering me the whole day that I kept using my hotkeys and nothing would happen. I re-installed the extension and even tried changing the combinations to all sorts of settings and nothing.

I was about to file an issue here about this when it suddenly hit me that I had switched the privacy.resistFingerprinting setting in about:config the other day and that could be the reason. Turns out that intuition was right. If you have this option on, the hotkeys will simply not work, though redirection still works normally as long as you directly open the image.

Hopefully this can serve other people having a similar issue in the future. And if the dev wasn't aware maybe they can create a workaround (unless it's actually impossible, in which case I hope this serves as a troubleshoot for others)

Popup gallery counter

As suggested by @07416, having a counter in the UI for the amount of popup images available would be helpful.

This would likely be optional, because it might be a little CPU-intensive. Alternatively, if it goes above a set amount, such as 100 images, it could either display as 100+ or not display a counter at all. That amount should be configurable.

Add option for disabling watermarks

On a few websites, although it will result in a larger image, the larger image will add a watermark (on many of them, for images they don't even own).

For now, these websites have been added as part of the script, but having the option to disable these rules would be helpful.

Comment/image deletion

Please provide a way for OPs to delete comments left by this bot (via sending a PM with the comment ID, downvoting, etc.)

Twitter/TweetDeck does not work with tracking protection turned on

Not directly related to the script but.
Maybe some other sites too. In Firefox, when browser internal tracking protection is set to "always" popup and redirections stop working. Adding exception doesn't help.
I found it just right now. But for information, Twitter/TweetDeck not worked for me from the beginning when first installed the script, then at some point it started. And recently somewhere at version 0.7.6 7(?) this bug(?) is back. So maybe it was the reason from the beginning? No noticeable problems with other sites.

Chrome Extension

I've always loved using the max image url extension on Firefox since it lets me quickly open the image in a new tab via shortcut, but recently I've had to move to Chrome due to some complications with Firefox and I realized just how much I miss this feature in particular and I have no way to get it back.

It doesn't seem like it is possible to open an image in a new tab via a short cut with the script alone (or at least I couldn't find it in the settings page) which means that when using Chrome (or any chromium browser) there's no way to set a shortcut to open an image in a new tab, meaning the pop up or the direct image redirect are the only methods available.

The script is also somewhat slower than the extension.

So my question is are there any plans to create a Chrome extension that has the same set of features the Firefox one has?

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.