{"action":"created","comment":{"url":"https://api.github.com/repos/PyConPL/Book/pulls/comments/77242250","id":77242250,"diff_hunk":"@@ -0,0 +1,83 @@\n+\n+Title of Presentation\n+=====================\n+\n+[Splash](http://splash.readthedocs.io/en/stable/) is an open source scriptable headless browser with \n+HTTP API written in Python 3 with Twisted & PyQt. I’d like to present the project and discuss \n+couple of social and technical phenomena that I noticed while taking part in development of \n+application. I’d like to discuss how application is structured, what libraries we used and\n+how they served us, and finally discuss how open source works for us and how I perceive it.\n+\n+My presentation will have two parts, one technical and other \"social/psychological\". In the first \n+one I'll outline application architecture. In the second one I'll try to discuss some general\n+issues around open source that I noticed.\n+\n+What is Splash and how it works?\n+================================\n+\n+Splash is a headless browser based on WebKit engine. Its main job is rendering HTML and JavaScript.\n+You can interact with Splash by sending HTTP requests with some parameters. For example you can make\n+request to /render.png endpoint with `url` parameter and it will send request to given url, load\n+it into browser window an return screenshot in .png format for you. You can also send request to\n+render.html endpoint and it will return html. \n+\n+Splash is scriptable, which means you can write Lua scripts that tell Splash what to do. For example\n+you can write script that will tell browser to click some link, wait a minute, hover cursor over\n+some page area and finally return screenshot of webpage after performing those actions. \n+\n+Why did we decide to create Splash? Main reason is that we needed some rendering for Scrapy. Scrapinghub\n+was founded by founders of Scrapy - framework for creating web crawlers. \n+Today main challenge for all crawlers is JavaScript. If you want\n+to know how important JavaScript is for modern web try disabling JavaScript in browser and try\n+browsing your favorite webpages. I can guarantee you that in many cases you won't see anything. If\n+you do manage to browse some content you'll see terribly broken layouts, html elements completely\n+out of order, divs and headeings flying all over the place, missing data. In general you'll see\n+chaos and mayhem. Long time ago people believed in a thing called \"graceful degradation\", meaning that \n+if user didnt have JavaScript page should still work but in a limited way. These days no one really","path":"2016/presentations/splash/text.md","position":36,"original_position":36,"commit_id":"f2075c7a45bc041a3ef9f6912f3ce6a7364d15c5","original_commit_id":"f2075c7a45bc041a3ef9f6912f3ce6a7364d15c5","user":{"login":"pigletto","id":137504,"avatar_url":"https://avatars.githubusercontent.com/u/137504?v=3","gravatar_id":"","url":"https://api.github.com/users/pigletto","html_url":"https://github.com/pigletto","followers_url":"https://api.github.com/users/pigletto/followers","following_url":"https://api.github.com/users/pigletto/following{/other_user}","gists_url":"https://api.github.com/users/pigletto/gists{/gist_id}","starred_url":"https://api.github.com/users/pigletto/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pigletto/subscriptions","organizations_url":"https://api.github.com/users/pigletto/orgs","repos_url":"https://api.github.com/users/pigletto/repos","events_url":"https://api.github.com/users/pigletto/events{/privacy}","received_events_url":"https://api.github.com/users/pigletto/received_events","type":"User","site_admin":false},"body":"s/didnt/didn't","created_at":"2016-09-01T19:55:39Z","updated_at":"2016-09-01T19:55:39Z","html_url":"https://github.com/PyConPL/Book/pull/59#discussion_r77242250","pull_request_url":"https://api.github.com/repos/PyConPL/Book/pulls/59","_links":{"self":{"href":"https://api.github.com/repos/PyConPL/Book/pulls/comments/77242250"},"html":{"href":"https://github.com/PyConPL/Book/pull/59#discussion_r77242250"},"pull_request":{"href":"https://api.github.com/repos/PyConPL/Book/pulls/59"}}},"pull_request":{"url":"https://api.github.com/repos/PyConPL/Book/pulls/59","id":83692013,"html_url":"https://github.com/PyConPL/Book/pull/59","diff_url":"https://github.com/PyConPL/Book/pull/59.diff","patch_url":"https://github.com/PyConPL/Book/pull/59.patch","issue_url":"https://api.github.com/repos/PyConPL/Book/issues/59","number":59,"state":"open","locked":false,"title":"splash presentation","user":{"login":"pawelmhm","id":2700942,"avatar_url":"https://avatars.githubusercontent.com/u/2700942?v=3","gravatar_id":"","url":"https://api.github.com/users/pawelmhm","html_url":"https://github.com/pawelmhm","followers_url":"https://api.github.com/users/pawelmhm/followers","following_url":"https://api.github.com/users/pawelmhm/following{/other_user}","gists_url":"https://api.github.com/users/pawelmhm/gists{/gist_id}","starred_url":"https://api.github.com/users/pawelmhm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pawelmhm/subscriptions","organizations_url":"https://api.github.com/users/pawelmhm/orgs","repos_url":"https://api.github.com/users/pawelmhm/repos","events_url":"https://api.github.com/users/pawelmhm/events{/privacy}","received_events_url":"https://api.github.com/users/pawelmhm/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-09-01T19:27:14Z","updated_at":"2016-09-01T19:55:39Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8420181f36d9a2dd9e7a3cdf922b18f6f71def4a","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/PyConPL/Book/pulls/59/commits","review_comments_url":"https://api.github.com/repos/PyConPL/Book/pulls/59/comments","review_comment_url":"https://api.github.com/repos/PyConPL/Book/pulls/comments{/number}","comments_url":"https://api.github.com/repos/PyConPL/Book/issues/59/comments","statuses_url":"https://api.github.com/repos/PyConPL/Book/statuses/f2075c7a45bc041a3ef9f6912f3ce6a7364d15c5","head":{"label":"pawelmhm:splash","ref":"splash","sha":"f2075c7a45bc041a3ef9f6912f3ce6a7364d15c5","user":{"login":"pawelmhm","id":2700942,"avatar_url":"https://avatars.githubusercontent.com/u/2700942?v=3","gravatar_id":"","url":"https://api.github.com/users/pawelmhm","html_url":"https://github.com/pawelmhm","followers_url":"https://api.github.com/users/pawelmhm/followers","following_url":"https://api.github.com/users/pawelmhm/following{/other_user}","gists_url":"https://api.github.com/users/pawelmhm/gists{/gist_id}","starred_url":"https://api.github.com/users/pawelmhm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pawelmhm/subscriptions","organizations_url":"https://api.github.com/users/pawelmhm/orgs","repos_url":"https://api.github.com/users/pawelmhm/repos","events_url":"https://api.github.com/users/pawelmhm/events{/privacy}","received_events_url":"https://api.github.com/users/pawelmhm/received_events","type":"User","site_admin":false},"repo":{"id":66929985,"name":"Book","full_name":"pawelmhm/Book","owner":{"login":"pawelmhm","id":2700942,"avatar_url":"https://avatars.githubusercontent.com/u/2700942?v=3","gravatar_id":"","url":"https://api.github.com/users/pawelmhm","html_url":"https://github.com/pawelmhm","followers_url":"https://api.github.com/users/pawelmhm/followers","following_url":"https://api.github.com/users/pawelmhm/following{/other_user}","gists_url":"https://api.github.com/users/pawelmhm/gists{/gist_id}","starred_url":"https://api.github.com/users/pawelmhm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pawelmhm/subscriptions","organizations_url":"https://api.github.com/users/pawelmhm/orgs","repos_url":"https://api.github.com/users/pawelmhm/repos","events_url":"https://api.github.com/users/pawelmhm/events{/privacy}","received_events_url":"https://api.github.com/users/pawelmhm/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/pawelmhm/Book","description":"This is a book which will be created by PyCon PL Organizers, based on PyCon PL Speaker's talks for PyCon PL Attendees.","fork":true,"url":"https://api.github.com/repos/pawelmhm/Book","forks_url":"https://api.github.com/repos/pawelmhm/Book/forks","keys_url":"https://api.github.com/repos/pawelmhm/Book/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pawelmhm/Book/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pawelmhm/Book/teams","hooks_url":"https://api.github.com/repos/pawelmhm/Book/hooks","issue_events_url":"https://api.github.com/repos/pawelmhm/Book/issues/events{/number}","events_url":"https://api.github.com/repos/pawelmhm/Book/events","assignees_url":"https://api.github.com/repos/pawelmhm/Book/assignees{/user}","branches_url":"https://api.github.com/repos/pawelmhm/Book/branches{/branch}","tags_url":"https://api.github.com/repos/pawelmhm/Book/tags","blobs_url":"https://api.github.com/repos/pawelmhm/Book/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pawelmhm/Book/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pawelmhm/Book/git/refs{/sha}","trees_url":"https://api.github.com/repos/pawelmhm/Book/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pawelmhm/Book/statuses/{sha}","languages_url":"https://api.github.com/repos/pawelmhm/Book/languages","stargazers_url":"https://api.github.com/repos/pawelmhm/Book/stargazers","contributors_url":"https://api.github.com/repos/pawelmhm/Book/contributors","subscribers_url":"https://api.github.com/repos/pawelmhm/Book/subscribers","subscription_url":"https://api.github.com/repos/pawelmhm/Book/subscription","commits_url":"https://api.github.com/repos/pawelmhm/Book/commits{/sha}","git_commits_url":"https://api.github.com/repos/pawelmhm/Book/git/commits{/sha}","comments_url":"https://api.github.com/repos/pawelmhm/Book/comments{/number}","issue_comment_url":"https://api.github.com/repos/pawelmhm/Book/issues/comments{/number}","contents_url":"https://api.github.com/repos/pawelmhm/Book/contents/{+path}","compare_url":"https://api.github.com/repos/pawelmhm/Book/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pawelmhm/Book/merges","archive_url":"https://api.github.com/repos/pawelmhm/Book/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pawelmhm/Book/downloads","issues_url":"https://api.github.com/repos/pawelmhm/Book/issues{/number}","pulls_url":"https://api.github.com/repos/pawelmhm/Book/pulls{/number}","milestones_url":"https://api.github.com/repos/pawelmhm/Book/milestones{/number}","notifications_url":"https://api.github.com/repos/pawelmhm/Book/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pawelmhm/Book/labels{/name}","releases_url":"https://api.github.com/repos/pawelmhm/Book/releases{/id}","deployments_url":"https://api.github.com/repos/pawelmhm/Book/deployments","created_at":"2016-08-30T10:13:26Z","updated_at":"2016-08-30T10:13:27Z","pushed_at":"2016-09-01T19:27:10Z","git_url":"git://github.com/pawelmhm/Book.git","ssh_url":"git@github.com:pawelmhm/Book.git","clone_url":"https://github.com/pawelmhm/Book.git","svn_url":"https://github.com/pawelmhm/Book","homepage":"http://pl.pycon.org/","size":6777,"stargazers_count":0,"watchers_count":0,"language":"TeX","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"PyConPL:master","ref":"master","sha":"c78495b74d67a3d05999ed9eb950f8bd9b9b5f66","user":{"login":"PyConPL","id":5347274,"avatar_url":"https://avatars.githubusercontent.com/u/5347274?v=3","gravatar_id":"","url":"https://api.github.com/users/PyConPL","html_url":"https://github.com/PyConPL","followers_url":"https://api.github.com/users/PyConPL/followers","following_url":"https://api.github.com/users/PyConPL/following{/other_user}","gists_url":"https://api.github.com/users/PyConPL/gists{/gist_id}","starred_url":"https://api.github.com/users/PyConPL/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PyConPL/subscriptions","organizations_url":"https://api.github.com/users/PyConPL/orgs","repos_url":"https://api.github.com/users/PyConPL/repos","events_url":"https://api.github.com/users/PyConPL/events{/privacy}","received_events_url":"https://api.github.com/users/PyConPL/received_events","type":"Organization","site_admin":false},"repo":{"id":22459875,"name":"Book","full_name":"PyConPL/Book","owner":{"login":"PyConPL","id":5347274,"avatar_url":"https://avatars.githubusercontent.com/u/5347274?v=3","gravatar_id":"","url":"https://api.github.com/users/PyConPL","html_url":"https://github.com/PyConPL","followers_url":"https://api.github.com/users/PyConPL/followers","following_url":"https://api.github.com/users/PyConPL/following{/other_user}","gists_url":"https://api.github.com/users/PyConPL/gists{/gist_id}","starred_url":"https://api.github.com/users/PyConPL/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PyConPL/subscriptions","organizations_url":"https://api.github.com/users/PyConPL/orgs","repos_url":"https://api.github.com/users/PyConPL/repos","events_url":"https://api.github.com/users/PyConPL/events{/privacy}","received_events_url":"https://api.github.com/users/PyConPL/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/PyConPL/Book","description":"This is a book which will be created by PyCon PL Organizers, based on PyCon PL Speaker's talks for PyCon PL Attendees.","fork":false,"url":"https://api.github.com/repos/PyConPL/Book","forks_url":"https://api.github.com/repos/PyConPL/Book/forks","keys_url":"https://api.github.com/repos/PyConPL/Book/keys{/key_id}","collaborators_url":"https://api.github.com/repos/PyConPL/Book/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/PyConPL/Book/teams","hooks_url":"https://api.github.com/repos/PyConPL/Book/hooks","issue_events_url":"https://api.github.com/repos/PyConPL/Book/issues/events{/number}","events_url":"https://api.github.com/repos/PyConPL/Book/events","assignees_url":"https://api.github.com/repos/PyConPL/Book/assignees{/user}","branches_url":"https://api.github.com/repos/PyConPL/Book/branches{/branch}","tags_url":"https://api.github.com/repos/PyConPL/Book/tags","blobs_url":"https://api.github.com/repos/PyConPL/Book/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/PyConPL/Book/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/PyConPL/Book/git/refs{/sha}","trees_url":"https://api.github.com/repos/PyConPL/Book/git/trees{/sha}","statuses_url":"https://api.github.com/repos/PyConPL/Book/statuses/{sha}","languages_url":"https://api.github.com/repos/PyConPL/Book/languages","stargazers_url":"https://api.github.com/repos/PyConPL/Book/stargazers","contributors_url":"https://api.github.com/repos/PyConPL/Book/contributors","subscribers_url":"https://api.github.com/repos/PyConPL/Book/subscribers","subscription_url":"https://api.github.com/repos/PyConPL/Book/subscription","commits_url":"https://api.github.com/repos/PyConPL/Book/commits{/sha}","git_commits_url":"https://api.github.com/repos/PyConPL/Book/git/commits{/sha}","comments_url":"https://api.github.com/repos/PyConPL/Book/comments{/number}","issue_comment_url":"https://api.github.com/repos/PyConPL/Book/issues/comments{/number}","contents_url":"https://api.github.com/repos/PyConPL/Book/contents/{+path}","compare_url":"https://api.github.com/repos/PyConPL/Book/compare/{base}...{head}","merges_url":"https://api.github.com/repos/PyConPL/Book/merges","archive_url":"https://api.github.com/repos/PyConPL/Book/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/PyConPL/Book/downloads","issues_url":"https://api.github.com/repos/PyConPL/Book/issues{/number}","pulls_url":"https://api.github.com/repos/PyConPL/Book/pulls{/number}","milestones_url":"https://api.github.com/repos/PyConPL/Book/milestones{/number}","notifications_url":"https://api.github.com/repos/PyConPL/Book/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/PyConPL/Book/labels{/name}","releases_url":"https://api.github.com/repos/PyConPL/Book/releases{/id}","deployments_url":"https://api.github.com/repos/PyConPL/Book/deployments","created_at":"2014-07-31T07:04:58Z","updated_at":"2016-07-16T16:20:58Z","pushed_at":"2016-09-01T19:27:14Z","git_url":"git://github.com/PyConPL/Book.git","ssh_url":"git@github.com:PyConPL/Book.git","clone_url":"https://github.com/PyConPL/Book.git","svn_url":"https://github.com/PyConPL/Book","homepage":"http://pl.pycon.org/","size":6825,"stargazers_count":17,"watchers_count":17,"language":"TeX","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":48,"mirror_url":null,"open_issues_count":6,"forks":48,"open_issues":6,"watchers":17,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/PyConPL/Book/pulls/59"},"html":{"href":"https://github.com/PyConPL/Book/pull/59"},"issue":{"href":"https://api.github.com/repos/PyConPL/Book/issues/59"},"comments":{"href":"https://api.github.com/repos/PyConPL/Book/issues/59/comments"},"review_comments":{"href":"https://api.github.com/repos/PyConPL/Book/pulls/59/comments"},"review_comment":{"href":"https://api.github.com/repos/PyConPL/Book/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/PyConPL/Book/pulls/59/commits"},"statuses":{"href":"https://api.github.com/repos/PyConPL/Book/statuses/f2075c7a45bc041a3ef9f6912f3ce6a7364d15c5"}}}}
{"actor":{"display_login":"pigletto"}}