Day 26: TogetherJS —— 让我们一起来编程!

简介: 今天的《30天学习30种新技术》挑战,我打算学习一个源自Mozilla的很酷的JavaScript库——TogetherJS。几个月前,我写过一个面向Java 8的在线Java编辑器。今天我将学习如何使用TogetherJS来给这个应用增加协作功能。

编者注:我们发现了有趣的系列文章《30天学习30种新技术》,正在翻译,一天一篇更新,年终礼包。下面是第 26 天的内容。


今天的《30天学习30种新技术》挑战,我打算学习一个源自Mozilla的很酷的JavaScript库——TogetherJS。几个月前,我写过一个面向Java 8的在线Java编辑器。今天我将学习如何使用TogetherJS来给这个应用增加协作功能。

image.png

TogetherJS是什么?

TogetherJS是一个开源的HTML5 Javascript库,提供了用户间的即时协作功能。它同时通过WebRTC支持了多人间的文字、语音聊天功能。使用TogetherJS,多个用户可以在同一页面上交互,看到对方的光标位置,一起浏览和编辑一个站点。TogetherJS支持最新版的Firefox、Chrome和Safari。


TogetherJS Demo

Demo应用跑在OpenShift上:http://tryjava-t20.rhcloud.com/

image.png

点击“Start TogetherJS”按钮,开启新会话。会有确认框提示。

image.png

在点击“I'm Ready”前,用户可以修改自己的姓名和头像。

image.png

用户会收到一个链接,他可以把这个链接分享给其他用户。

image.png

我新开一个浏览器,打开邀请链接。

image.png

第二个用户加入之后,可以看到第一个用户的所有操作。

image.png

第二个用户编写了一个简单的Hello World Java 程序。第一个用户同样可以看到第二个用户的操作。

image.png

第一个用户打开聊天窗口,给第二个用户发送了一条信息。

image.png

第二个用户收到了信息。

image.png

第一个用户修正了分号问题,第二个用户马上看到了改动。

image.png

第一个用户运行了程序,然后结束了会话。

image.png

Github仓库

今天的示例程序的代码可以从Github取得。


依赖

我们将使用Harp作为静态web服务器。Harp可以使用NPM安装。

npm install -g harp

开发TogetherJS应用

创建一个day26demo目录,在其中新建一个index.html文件,内容如下:

<!doctype html>

<htmllang="en">

<head>

<metacharset="utf-8">

<metaname="viewport"content="width=device-width, initial-scale=1.0">

<metaname="description"content="Run Java 8 in Cloud">

<metaname="author"content="Shekhar Gulati">

<title>TryJava8 | Run Java 8 in Cloud | Powered by OpenShift</title>

<linkrel="stylesheet"href="//cdnjs.cloudflare.com/ajax/libs/codemirror/3.19.0/codemirror.css">

<scriptsrc="//cdnjs.cloudflare.com/ajax/libs/codemirror/3.19.0/codemirror.min.js"></script>

<scriptsrc="//cdnjs.cloudflare.com/ajax/libs/codemirror/3.19.0/addon/edit/matchbrackets.js"></script>

<scripttype="text/javascript"src="//cdnjs.cloudflare.com/ajax/libs/codemirror/3.19.0/mode/clike/clike.js"></script>

<style>

.CodeMirror {

   border: 2px inset #dee;

}

body{

   padding-top: 80px;

}

</style>

<linkrel="stylesheet"href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css">

</head>

<body>

   <navclass="navbar navbar-default navbar-inverse navbar-fixed-top"role="navigation">

 <divclass="navbar-header">

   <buttontype="button"class="navbar-toggle"data-toggle="collapse"data-target="#bs-example-navbar-collapse-1">

     <spanclass="sr-only">Toggle navigation</span>

     <spanclass="icon-bar"></span>

     <spanclass="icon-bar"></span>

     <spanclass="icon-bar"></span>

   </button>

   <aclass="navbar-brand"href="/">TryJava</a>

 </div>

 <divclass="collapse navbar-collapse"id="bs-example-navbar-collapse-1">

   <ulclass="nav navbar-nav">

     <liclass="active"><ahref="/">Home</a></li>

   </ul>

  </div>

</nav>

   <divclass="jumbotron container">

       <h1>TryJava8 -- Free , Online Java 8 Code Editor</h1>

       <p>Write your Java 8 code online anywhere , anytime...</p>

     </div>

   <divclass="container">

       <divclass="row">

           <divclass="col-md-7">

               <h2>Run your Java 8 Code</h2>

               <formid="codeForm">

                   <divclass="control-group">

                       <divclass="controls">

                           <textareaid="code"name="code"

                               placeholder="Write your Java8 Code"></textarea>

                       </div>

                   </div>

                   <divclass="control-group">

                       <divclass="controls">

                           <buttontype="submit"class="btn btn-success">Run Code</button>

                       </div>

                   </div>

               </form>

           </div>

           <divid="outputBox"class="col-md-4 col-md-offset-1">

               <divid="resultRow"class="row">

                   <h2>Program Output</h2>

                   <divid="result"class="col-md-4"></div>

               </div>

           </div>

       </div>

       <hr>

       <footerid="footer">

           <p>&copy; Shekhar Gulati 2013</p>

           <p>

               Made with love by <ahref="https://twitter.com/shekhargulati/"

                   target="_blank">Shekhar Gulati</a>. Contact him at <a

                   href="mailto:shekhargulati84@gmail.com">shekhargulati84@gmail.com</a>.

           </p>

           <p>

               <ahref="https://www.openshift.com/"target="_blank"><img

                   alt="Powered by OpenShift"

                   src="https://www.openshift.com/sites/default/files/images/powered-transparent-black.png"></a>

           </p>

       </footer>

   </div>

   <scriptsrc="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>

   <script>

       var editor = CodeMirror.fromTextArea(document.getElementById("code"), {

           lineNumbers : true,

           matchBrackets : true,

           mode : "text/x-java"

       });

   </script>

</body>

</html>

我们使用了Twitter Bootstrap 3、jQuery和CodeMirror。


运行Java程序

接着我们在index.html</body>前添加相应的代码,使用jQuery进行POST请求,以便执行Java代码。

<script type="text/javascript">

       $("#codeForm").submit(

           function(event) {

               event.preventDefault();

               $("#status").empty();

               $("#result").empty();

               var code = $('textarea').val();

               if (!code) {

                   alert("Please write some code");

                   return;

               }

               var data = {code : code};

 `             var url = "http://tryjava-t20.rhcloud.com/api/snippets";

               $.ajax( url,

                       {

                           data : JSON.stringify(data),

                           crossDomain : true,

                           contentType : 'application/json',

                           type : 'POST',

                           async : true,

                           success : function(result) {

                               $("#resultRow").show();

                               if (result.compilerOutput != 0) {

                                   $("#result").append("<p class='text-error'>"+ result.result + "</p>");

                               } elseif (result.verdict === "FAILURE") {

                                   $("#result").append("<p class='text-error'>"+ result.result+ "</p>");

                               } else {

                                   $("#result").append("<p class='text-success'>"+ result.result+ "</p>");

                               }

                           },

                           error : function() {

                               alert("Something wrong happened on the server");

                           }

                       });

           });

   </script>

添加协作功能

现在我们将使用TogetherJS添加协作功能。

<scriptsrc="//togetherjs.com/togetherjs-min.js"></script>

Run Code按钮旁添加协作按钮:

<button class="btn btn-info"onclick="TogetherJS(this); return false;">Start TogetherJS</button>

刷新一下浏览器,你会看到Start TogetherJS按钮。点击按钮后,TogetherJS会初始化库,显示opt-in对话框,然后用户就可以看到别的用户的操作了。

TogetherJS的会话连接到你启动它的域名。所以如果你的部分站点在别的域名上,用户们无法跨域交流。httpshttp的差别也会导致会话无法建立。


自己部署TryJava应用

你可以将你自己的TryJava应用部署在云端。后端和前端的代码都是开源的

将应用部署到OpenShift之前,我们需要进行一些设置:

  1. 注册一个OpenShift账号。注册是完全免费的,Red Hat给每个用户三枚免费的Gear,可以用Gear运行你的应用。在写作此文的时候,每个用户能免费使用总共 1.5 GB 内存和 3 GB 硬盘空间。
  2. 安装 rhc客户端工具rhc是ruby gem,因此你的机子上需要装有 ruby 1.8.7以上版本。 只需输入 sudo gem install rhc即可安装 rhc 。如果你已经安装过了,确保是最新版。运行sudo gem update rhc即可升级。关于配置rhc命令行工具的详细信息,请参考: https://openshift.redhat.com/community/developers/rhc-client-tools-install
  3. 使用 rhc 的 setup 命令配置你的 OpenShift 账号。这个命令会帮助你创建一个命名空间,同时将你的ssh公钥上传至 OpenShift 服务器。


设置之后,输入如下命令即可将应用部署到 OpenShift:

rhccreate-apptryjavadiymogodb-2--from-code=https://github.com/shekhargulati/tryjava.git

这个命令将创建应用,设置公开的DNS,创建私有git仓库,最后利用你的Github仓库中的代码来部署应用。应用可以通过 http://tryjava-t20.rhcloud.com/ 访问。

今天就到这里了。多多反馈。

相关文章
|
3天前
|
人工智能 自然语言处理 Shell
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
仅用3分钟,百炼调用满血版Deepseek-r1 API,享受百万免费Token。阿里云提供零门槛、快速部署的解决方案,支持云控制台和Cloud Shell两种方式,操作简便。Deepseek-r1满血版在推理能力上表现出色,尤其擅长数学、代码和自然语言处理任务,使用过程中无卡顿,体验丝滑。结合Chatbox工具,用户可轻松掌控模型,提升工作效率。阿里云大模型服务平台百炼不仅速度快,还确保数据安全,值得信赖。
157353 24
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
|
5天前
|
人工智能 API 网络安全
用DeepSeek,就在阿里云!四种方式助您快速使用 DeepSeek-R1 满血版!更有内部实战指导!
DeepSeek自发布以来,凭借卓越的技术性能和开源策略迅速吸引了全球关注。DeepSeek-R1作为系列中的佼佼者,在多个基准测试中超越现有顶尖模型,展现了强大的推理能力。然而,由于其爆火及受到黑客攻击,官网使用受限,影响用户体验。为解决这一问题,阿里云提供了多种解决方案。
16971 37
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
|
5天前
|
并行计算 PyTorch 算法框架/工具
本地部署DeepSeek模型
要在本地部署DeepSeek模型,需准备Linux(推荐Ubuntu 20.04+)或兼容的Windows/macOS环境,配备NVIDIA GPU(建议RTX 3060+)。安装Python 3.8+、PyTorch/TensorFlow等依赖,并通过官方渠道下载模型文件。配置模型后,编写推理脚本进行测试,可选使用FastAPI服务化部署或Docker容器化。注意资源监控和许可协议。
1310 8
|
13天前
|
人工智能 搜索推荐 Docker
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
DeepSeek R1 + LobeChat + Ollama:快速本地部署模型,创建个性化 AI 助手
3416 117
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
|
8天前
|
人工智能 自然语言处理 API
DeepSeek全尺寸模型上线阿里云百炼!
阿里云百炼平台近日上线了DeepSeek-V3、DeepSeek-R1及其蒸馏版本等六款全尺寸AI模型,参数量达671B,提供高达100万免费tokens。这些模型在数学、代码、自然语言推理等任务上表现出色,支持灵活调用和经济高效的解决方案,助力开发者和企业加速创新与数字化转型。示例代码展示了如何通过API使用DeepSeek-R1模型进行推理,用户可轻松获取思考过程和最终答案。
|
5天前
|
人工智能 自然语言处理 程序员
如何在通义灵码里用上DeepSeek-V3 和 DeepSeek-R1 满血版671B模型?
除了 AI 程序员的重磅上线外,近期通义灵码能力再升级全新上线模型选择功能,目前已经支持 Qwen2.5、DeepSeek-V3 和 R1系列模型,用户可以在 VSCode 和 JetBrains 里搜索并下载最新通义灵码插件,在输入框里选择模型,即可轻松切换模型。
934 14
|
12天前
|
API 开发工具 Python
阿里云PAI部署DeepSeek及调用
本文介绍如何在阿里云PAI EAS上部署DeepSeek模型,涵盖7B模型的部署、SDK和API调用。7B模型只需一张A10显卡,部署时间约10分钟。文章详细展示了模型信息查看、在线调试及通过OpenAI SDK和Python Requests进行调用的步骤,并附有测试结果和参考文档链接。
1938 9
阿里云PAI部署DeepSeek及调用
|
9天前
|
人工智能 数据可视化 Linux
【保姆级教程】3步搞定DeepSeek本地部署
DeepSeek在2025年春节期间突然爆火出圈。在目前DeepSeek的网站中,极不稳定,总是服务器繁忙,这时候本地部署就可以有效规避问题。本文以最浅显易懂的方式带读者一起完成DeepSeek-r1大模型的本地部署。
|
12天前
|
缓存 自然语言处理 安全
快速调用 Deepseek API!【超详细教程】
Deepseek 强大的功能,在本教程中,将指导您如何获取 DeepSeek API 密钥,并演示如何使用该密钥调用 DeepSeek API 以进行调试。

热门文章

最新文章