<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Web on I'm OWenT</title><link>//owent.net/tags/web.html</link><description>Recent content in Web on I'm OWenT</description><generator>Hugo</generator><language>zh-cn</language><copyright>&lt;a rel="license" href="https://github.com/owent/blog-hugo/blob/master/LICENSE.md"&gt;&lt;img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/80x15.png" /&gt;&lt;/a&gt;</copyright><lastBuildDate>Thu, 03 Jan 2019 17:08:50 +0000</lastBuildDate><atom:link href="//owent.net/tags/web/index.xml" rel="self" type="application/rss+xml"/><item><title>Rust玩具-企业微信机器人通用服务</title><link>//owent.net/2019/1901.html</link><pubDate>Thu, 03 Jan 2019 17:08:50 +0000</pubDate><guid>//owent.net/2019/1901.html</guid><description>&lt;h2 id="新玩具-企业微信机器人"&gt;新玩具-企业微信机器人&lt;/h2&gt;&#10;&lt;p&gt;这个机器人其实蛮久前就做好了，现在才写了点分享出来。 最近企业微信不断地开放了机器人的接口，所以我想想拿来做一些开发工具集成也是挺不错的，顺便也是为了继续熟悉一下 &lt;a href="https://rust-lang.org/"&gt;Rust&lt;/a&gt; 的编程习惯。 那么这次就大量使用 &lt;a href="https://crates.io/crates/futures"&gt;futures&lt;/a&gt; 来实现这个机器人的接口服务，这也是即将到来的无栈协程语法糖 &lt;a href="https://crates.io/crates/futures-await"&gt;await&lt;/a&gt; 的基石。&lt;/p&gt;</description></item><item><title>Rust的第二次接触-写个小服务器程序</title><link>//owent.net/2018/1809.html</link><pubDate>Wed, 12 Sep 2018 12:29:50 +0000</pubDate><guid>//owent.net/2018/1809.html</guid><description>&lt;h2 id="just-practice"&gt;JUST PRACTICE&lt;/h2&gt;&#10;&lt;p&gt;蛮久前入门了一下 &lt;a href="https://rust-lang.org/"&gt;Rust&lt;/a&gt; 语言。它的设计模型非常地吸引C/C++的开发者。但是学习语言嘛还是要练习一下，之前也用它给我们项目写了个命令行小工具。这回拿来写个小型的服务器程序吧。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://rust-lang.org/"&gt;Rust&lt;/a&gt; 的生态还处于非常初级的阶段。很多组件和库都处于开发中和设计变更的阶段，比起golang来，很多功能库都没有。&#10;服务器编程本身特别注重高并发能力和，高性能。和原来很多客户端程序的思路是不太一样的。所以本来想等新的Futures和await和2.0版本的宏机制完成再搞。而老的&lt;a href="https://crates.io/crates/futures"&gt;Futures&lt;/a&gt;库由于即将移入核心库，在&lt;a href="https://crates.io/"&gt;crates.io&lt;/a&gt;上下架了。现在似乎很多&lt;a href="https://rust-lang.org/"&gt;Rust&lt;/a&gt;的库都按&lt;a href="https://tokio.rs/"&gt;Tokio&lt;/a&gt;的的模式来，于是我看了一下基于&lt;a href="https://crates.io/crates/futures"&gt;Futures&lt;/a&gt;的多路复用IO库&lt;a href="https://tokio.rs/"&gt;Tokio&lt;/a&gt;的文档来练习一下这个小服务器程序。&lt;/p&gt;</description></item><item><title>接入letsencrypt+全面启用HTTP/2</title><link>//owent.net/2016/1253.html</link><pubDate>Sat, 07 May 2016 15:10:43 +0000</pubDate><guid>//owent.net/2016/1253.html</guid><description>&lt;p&gt;之前我的域名只有owent.net和www.owent.net买了SSL证书，现在有&lt;a href="https://letsencrypt.org/"&gt;letsencrypt&lt;/a&gt;可以拿到免费的SSL签证，就稍微花了点时间把我的域名的其他部分接入了&lt;a href="https://letsencrypt.org/"&gt;letsencrypt&lt;/a&gt;签证系统。另外根据其他人的一些配置建议，提高了HTTPS的安全性配置和性能配置（主要是缓存）。另外原本我的blog就已经启用了spdy，然而现在新版本的&lt;a href="http://nginx.org/"&gt;nginx&lt;/a&gt;（&lt;a href="http://nginx.org/en/CHANGES-1.10"&gt;1.10&lt;/a&gt;）已经release，原先的spdy模块被取消，新增了http/2模块。但是直接换nginx掉包是不行滴（后面有说原因），所以顺带自己处理了一下HTTP/2和nginx新版本的问题。&lt;/p&gt;&#10;&lt;p&gt;并且也对公司里的域名和webserver也这么搞了一下。全面启用HTTPS。&lt;/p&gt;&#10;&lt;h2 id="接入letsencrypt"&gt;接入letsencrypt&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://letsencrypt.org/"&gt;letsencrypt&lt;/a&gt;是Mozilla发起的一个提倡大家用加密的HTTP连接的项目，它允许大家申请到免费的SSL证书，用于HTTPS的证书认证。并且现在它的CA已经被大部分浏览器所接受。我这里本地Win10里使用的IE11，Edge，Firefox 46，Chrome 50全部都能认证通过了。当然手机上也可以。&lt;/p&gt;</description></item><item><title>从Javascript到Typescript到Node.js</title><link>//owent.net/2013/851.html</link><pubDate>Wed, 10 Jul 2013 20:19:39 +0000</pubDate><guid>//owent.net/2013/851.html</guid><description>&lt;p&gt;最近看了点typescript的东西，加上以前看过的一点点Node.js，所以就想把他们系统地整理一下。&lt;/p&gt;&#10;&lt;h2 id="javascript"&gt;Javascript&lt;/h2&gt;&#10;&lt;p&gt;这玩意搞过Web开发的应该都知道吧，Javascript的语法我就不废话了，挺简单的。这里总结几个Javascript的核心机制部分吧。&lt;/p&gt;</description></item><item><title>JSON显示库 -- showJson （Javascript）</title><link>//owent.net/2012/573.html</link><pubDate>Sun, 01 Apr 2012 06:17:48 +0000</pubDate><guid>//owent.net/2012/573.html</guid><description>&lt;p&gt;现在的web的js开发很方便啊，但是碰到iframe里的东西还是不方便看到变量的内容，所以就写了这么个看json内容的玩意，还可以当控制台输出用。&lt;/p&gt;&#10;&lt;p&gt;很简单,有需要以后开发新功能&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-js"&gt;/** &#13;&#10; * Show json in a new page.(For debug)&#13;&#10; *&#13;&#10; * Licensed under the MIT or GPL Version 3 licenses.&#13;&#10; * @version 1.3&#13;&#10; * @author OWenT&#13;&#10; * @link http://www.owent.net&#13;&#10; * @history &#13;&#10; * &#9;&#9;2012.12.27 &#13;&#10; * &#9;&#9;&#9;1. 改进JSON内对象循环引用时的导致的栈溢出问题&#13;&#10; * &#9;&#9;&#9;2. 引入层级路径&#13;&#10; * &#9;&#9;&#9;3. 引入锚点&#13;&#10; */&#13;&#10; &#13;&#10; /**&#13;&#10; * Object转为字符串&#13;&#10; * @param {Object} json Object对象 &#13;&#10; * @param {Number} tab 缩进数量&#13;&#10; * @param {Object} rules 应用规则&#13;&#10; * @param {String} path 当前路径&#13;&#10; * @return 生成的HTML&#13;&#10; */&#13;&#10;function json2String(json, tab, rules, path) {&#13;&#10; var tabStr = &amp;#34;&amp;#34;, singleTab = &amp;#34;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;#34;, isClear = false;&#13;&#10; var txt = &amp;#34;&amp;#34;;&#13;&#10; &#13;&#10; if (!rules) {&#13;&#10; rules = {&#13;&#10; id: &amp;#34;__json2string_process&amp;#34; &amp;#43; (new Date).getTime().toString() &amp;#43; (json2String.baseIndex &amp;#43;&amp;#43;),&#13;&#10; objs: []&#13;&#10; };&#13;&#10; isClear = true;&#13;&#10; }&#13;&#10; &#13;&#10; tab = tab || 1;&#13;&#10; if (!path) {&#13;&#10; path = &amp;#34;{ROOT}&amp;#34;;&#13;&#10; txt &amp;#43;= &amp;#34;&amp;lt;a name=\&amp;#34;&amp;#34; &amp;#43; rules.id &amp;#43; &amp;#34;.&amp;#34; &amp;#43; path &amp;#43; &amp;#34;\&amp;#34;&amp;gt; &amp;lt;/a&amp;gt;&amp;#34;;&#13;&#10; }&#13;&#10; &#13;&#10; for (var i = 0; i &amp;lt; tab; i &amp;#43;&amp;#43;) {&#13;&#10; tabStr &amp;#43;= singleTab;&#13;&#10; }&#13;&#10; &#13;&#10; if (!json &amp;amp;&amp;amp; json !== 0) {&#13;&#10; txt &amp;#43;= &amp;#39;&amp;lt;span style=&amp;#34;color: Red;&amp;#34;&amp;gt;null&amp;lt;/span&amp;gt;&amp;#39;;&#13;&#10; } else if (typeof(json) == &amp;#34;object&amp;#34;) {&#13;&#10; var prefix = &amp;#39;&amp;lt;span style=&amp;#34;color: DarkGray; font-weight: bolder;&amp;#34;&amp;gt;{&amp;lt;/span&amp;gt;&amp;#39;, suffix = &amp;#39;&amp;lt;span style=&amp;#34;color: DarkGray; font-weight: bolder;&amp;#34;&amp;gt;}&amp;lt;/span&amp;gt;&amp;#39;;&#13;&#10; try {&#9;&#9;&#13;&#10; if (toString.call(json).match(/array/i)) {&#13;&#10; prefix = &amp;#39;&amp;lt;span style=&amp;#34;color: Orange;&amp;#34;&amp;gt;[&amp;lt;/span&amp;gt;&amp;#39;;&#13;&#10; suffix = &amp;#39;&amp;lt;span style=&amp;#34;color: Orange;&amp;#34;&amp;gt;]&amp;lt;/span&amp;gt;&amp;#39;;&#13;&#10; }&#13;&#10; } catch(e) {&#13;&#10; // hoho ...&#13;&#10; }&#13;&#10; &#13;&#10; if (json[rules.id]) {&#13;&#10; txt &amp;#43;= prefix &amp;#43; &amp;#34;此处引用 &amp;lt;a style=\&amp;#34;text-decoration: underline; color: Blue;\&amp;#34; href=\&amp;#34;#&amp;#34; &amp;#43; rules.id &amp;#43; &amp;#34;.&amp;#34; &amp;#43; json[rules.id] &amp;#43; &amp;#34;\&amp;#34; target=\&amp;#34;_self\&amp;#34; title=\&amp;#34;跳转到引用 &amp;#34; &amp;#43; json[rules.id] &amp;#43; &amp;#34;\&amp;#34; &amp;gt;&amp;#34; &amp;#43; &#13;&#10; json[rules.id] &amp;#43; &amp;#34;&amp;lt;/a&amp;gt;&amp;#34; &amp;#43; suffix;&#13;&#10; return txt;&#13;&#10; }&#13;&#10; json[rules.id] = path;&#13;&#10; rules.objs.push(json);&#13;&#10; &#13;&#10; txt &amp;#43;= prefix &amp;#43; &amp;#34;&amp;lt;br /&amp;gt;\r\n&amp;#34;;&#13;&#10; var first = true;&#13;&#10; for (var key in json) {&#13;&#10; if (key == rules.id)&#13;&#10; continue;&#13;&#10; &#13;&#10; if (first)&#13;&#10; first = false;&#13;&#10; else&#13;&#10; txt &amp;#43;= &amp;#34;,&amp;lt;br /&amp;gt;\r\n&amp;#34;;&#13;&#10; txt &amp;#43;= tabStr &amp;#43; &amp;#34;&amp;lt;a name=\&amp;#34;&amp;#34; &amp;#43; rules.id &amp;#43; &amp;#34;.&amp;#34; &amp;#43; path &amp;#43; &amp;#34;.&amp;#34; &amp;#43; key &amp;#43; &amp;#34;\&amp;#34;&amp;gt; &amp;lt;/a&amp;gt;&amp;#34; &amp;#43; &amp;#34;&amp;lt;strong&amp;gt;&amp;#34; &amp;#43; &#13;&#10; key &amp;#43; &amp;#34;&amp;lt;/strong&amp;gt; : &amp;#34; &amp;#43;&#9;json2String(json[key], tab &amp;#43; 1, rules, path &amp;#43; &amp;#34;.&amp;#34; &amp;#43; key);&#13;&#10; }&#13;&#10; txt &amp;#43;= &amp;#34;&amp;lt;br /&amp;gt;\r\n&amp;#34; &amp;#43; tabStr.substr(0, tabStr.length - singleTab.length) &amp;#43; suffix;&#13;&#10; } else if (typeof(json) == &amp;#34;string&amp;#34;) {&#13;&#10; txt &amp;#43;= &amp;#39;&amp;lt;span style=&amp;#34;color: Green;&amp;#34;&amp;gt;&amp;#34;&amp;#39; &amp;#43; json &amp;#43; &amp;#39;&amp;#34;&amp;lt;/span&amp;gt;&amp;#39;;&#13;&#10; } else if (typeof(json) == &amp;#34;number&amp;#34;) {&#13;&#10; txt &amp;#43;= &amp;#39;&amp;lt;span style=&amp;#34;color: Blue;&amp;#34;&amp;gt;&amp;#39; &amp;#43; json &amp;#43; &amp;#39;&amp;lt;/span&amp;gt;&amp;#39;;&#13;&#10; } else if (typeof(json) == &amp;#34;function&amp;#34;) {&#13;&#10; txt &amp;#43;= &amp;#39;&amp;lt;span style=&amp;#34;color: Purple;&amp;#34;&amp;gt;&amp;#39; &amp;#43; json &amp;#43; &amp;#39;&amp;lt;/span&amp;gt;&amp;#39;;&#13;&#10; } else {&#13;&#10; txt &amp;#43;= json.toString();&#13;&#10; }&#13;&#10; &#13;&#10; if (isClear) {&#13;&#10; for (var i = 0; i &amp;lt; rules.objs.length; &amp;#43;&amp;#43; i) {&#13;&#10; delete rules.objs[i][rules.id];&#13;&#10; }&#13;&#10; rules.objs = [];&#13;&#10; }&#13;&#10; &#13;&#10; return txt;&#13;&#10;}&#13;&#10; &#13;&#10;function showJson(json, title, windowName, dlg_opt) {&#13;&#10; json2String.baseIndex = json2String.baseIndex || 0;&#13;&#10; &#13;&#10; title = title || &amp;#34;Json viewer&amp;#34;;&#13;&#10; windowName = windowName || &amp;#34;result&amp;#34; &amp;#43; (new Date()).toGMTString();&#13;&#10; if (window.jQuery &amp;amp;&amp;amp; jQuery.fn &amp;amp;&amp;amp; jQuery.fn.dialog) {&#13;&#10; $(&amp;#34;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&amp;#34;).append(json2String(json)).css({&#13;&#10; &amp;#34;text-align&amp;#34;: &amp;#34;left&amp;#34;&#13;&#10; }).dialog($.extend({&#13;&#10; &amp;#34;modal&amp;#34;: false,&#13;&#10; &amp;#34;title&amp;#34;: title,&#13;&#10; &amp;#34;width&amp;#34;: 640,&#13;&#10; &amp;#34;height&amp;#34;: 480,&#13;&#10; &amp;#34;buttons&amp;#34;: {&#13;&#10; &amp;#34;关闭&amp;#34;: function() {&#13;&#10; $( this ).dialog( &amp;#34;close&amp;#34; );&#13;&#10; }&#13;&#10; }&#13;&#10; }, dlg_opt));&#13;&#10; } else {&#13;&#10; var wnd = window.open(&amp;#34;about:blank&amp;#34;, &amp;#34;_blank&amp;#34;, &amp;#34;height=600, width=800, toolbar=no, menubar=no, resizable=yes, location=no, status=no&amp;#34;, true);&#13;&#10; if (!wnd)&#13;&#10; alert(&amp;#34;窗口被拦截！&amp;#34;);&#13;&#10; wnd.document.write(&amp;#34;&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;&amp;#34; &amp;#43; title &amp;#43; &amp;#34;&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;#34; &amp;#43; json2String(json) &amp;#43; &amp;#34;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;#34;);&#13;&#10; }&#13;&#10; return wnd;&#13;&#10;}&lt;/code&gt;&lt;/pre&gt;&#13;&#10;&lt;ol&gt;&#10;&lt;li&gt;更新对不同类型着色&lt;/li&gt;&#10;&lt;li&gt;如果载入了jQuery UI 则使用jQuery UI的Dialog打开，用于解决嵌套iframe时浏览器拦截问题&lt;/li&gt;&#10;&lt;li&gt;解决Object循环引用时栈溢出问题，同时增加引用的指向锚点&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Licensed under the MIT or GPL Version 3 licenses.&lt;/p&gt;</description></item><item><title>解析网站字符串型参数 Javascript QueryString 操作 TQueryString类</title><link>//owent.net/2010/104.html</link><pubDate>Mon, 01 Nov 2010 02:15:09 +0000</pubDate><guid>//owent.net/2010/104.html</guid><description>&lt;p&gt;这是学校USRP项目需要而写的一个类，但是既然写出来了，以后也可能用到，就共享出来吧。&lt;/p&gt;&#10;&lt;p&gt;这个类用于解析网页URL的QueryString参数，或者也可以当做操作一些其他设置的类库。&lt;/p&gt;&#10;&lt;p&gt;本类库支持任意类型的值的记录，支持JSON语法，支持类似“a=b&amp;amp;c=d”作为设置参数，支持对数组和JSON的转换。&lt;/p&gt;</description></item></channel></rss>