突袭HTML5之WebGL 3D概述

WebGL开启了网页3D渲染的新时代,它允许在canvas中直接渲染3D的内容,而不借助任何插件。WebGL同canvas 2D的API一样,都是通过脚本操纵对象,所以步骤也是基本相似:准备工作上下文,准备数据,在canvas中绘制对象并渲染。与2D不同的就是3D涉及的知识更多了,例如世界、光线、纹理、相机、矩阵等专业知识。WebGL有一个很好的中文教程,就是下面使用参考中的第一个链接,所以这里不再班门弄斧,后面的内容只是简单的总结一下学习的内容。

浏览器的支持

由于微软有自己的图形发展计划,一直不支持WebGL,所以IE目前除了安装插件外,是无法运行WebGL的。其他的主流浏览器如Chrome、FireFox、Safari、Opera等,都装上最新的版本就可以了。除了浏览器要装最新的外,还要保证显卡的驱动也是最新的。
装上这些以后,可以打开浏览器,输入下面的网址验证一下浏览器对WebGL的支持情况:http://webglreport.sourceforge.net/。

在正常安装以上浏览器之后还是不能运行WebGL,那你可以强制开启WebGL支持试一试。开启方法如下:

Chrome浏览器

我们需要为Chrome加入一些启动参数,以下具体操作步骤以Windows操作系统为例:找到Chrome浏览器的快捷方式,右键点击快捷方式,选择属性;在目标框内,chrome.exe后面的引号后面,加入以下内容:

--enable-webgl --ignore-gpu-blacklist --allow-file-access-from-files

点击确定后关闭Chrome,然后用此快捷方式启动Chrome浏览器。

几个参数的含义如下:

--enable-webgl的意思是开启WebGL支持;

--ignore-gpu-blacklist的意思是忽略GPU黑名单,也就是说有一些显卡GPU因为过于陈旧等原因,不建议运行WebGL,这个参数可以让浏览器忽略这个黑名单,强制运行WebGL;

--allow-file-access-from-files的意思是允许从本地载入资源,如果你不是WebGL的开发者,不需要开发调试WebGL,只是想要看一下WebGL的Demo,那你可以不添加这个参数。

Firefox浏览器

Firefox的用户请在浏览器的地址栏输入“about:config”,回车,然后在过滤器(filter)中搜索“webgl”,将webgl.force-enabled设置为true;将webgl.disabled设置为false;在过滤器(filter)中搜索“security.fileuri.strict_origin_policy”,将security.fileuri.strict_origin_policy设置为false;然后关闭目前开启的所有Firefox窗口,重新启动Firefox。

前两个设置是强制开启WebGL支持,最后一个security.fileuri.strict_origin_policy的设置是允许从本地载入资源,如果你不是WebGL的开发者,不需要开发调试WebGL,只是想要看一下WebGL的Demo,那你可以不设置此项。

Safari浏览器

在菜单中找到“属性”→“高级”,选中“显示开发菜单”,然后到“开发”菜单,选中“开启WebGL”。

开发步骤

下面的代码只是简单总结一下相关的概念,它来源于参考中的中文教程,涉及较多的3D方面的知识。感兴趣的同学直接可以跳到实用参考中的中文教程中学习,比我这里讲解的要详细和准确的多。凑热闹的同学简单看看就可以了,不用深究每一行代码的含义。

准备工作

这个不用说了,就是在页面上添加一个canvas元素作为渲染的容器。例如:

 

  
    Your browser doesn't appear to support the HTML5 canvas element.
  

下面就是正式开始写脚本的时候了,首先看一下程序入口以及整体结构:

 
function start() {
    var canvas = document.getElementById("glcanvas");  
    initGL(canvas);        
    initShaders();        
    initBuffers(); 
       
    gl.clearColor(0.0, 0.0, 0.0, 1.0);        
    gl.enable(gl.DEPTH_TEST); 
       
    drawScene();    
} 

这里的几个方法代表了典型的WebGL的绘制步骤:

步骤一:初始化WebGL工作环境 - initGL

这个方法的代码如下:

 
var gl;    
function initGL(canvas) {  
  gl=null;      
  try {
    // Try to grab the standard context. If it fails, fallback to experimental.
    gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
  }
  catch(e) {}

  // If we don't have a GL context, give up now
  if (!gl) {
    alert("Unable to initialize WebGL. Your browser may not support it.");
  }
} 

这个方法很简单,就是获取WebGL的绘制环境,需要把参数"webgl"传给canvas.getContext方法就行了,但是由于目前WebGL的标准没有最终定型,所以实验阶段用的参数都是"experimental-webgl"。当然你直接去调用canvas.getContext("experimental-webgl")也是可以的,等标准定下以后,你再修改一个代码。

步骤二:初始化着色器Shaders - initShaders

着色器Shader概念比较简单,说白了就是显卡运算指令。构造3D场景需要进行大量的颜色、位置等等信息的计算,如果这些计算由软件执行的话,速度会很慢。所以把这些运算让显卡去计算,速度就很快;如何去执行这些计算,就是由着色器指定的。着色器代码是用一种叫做GLSL的着色器语言编写的,这个我们不去讲述这个语言了。

着色器可以在html中定义,在代码中使用。当然了你在程序中用一个字符串去定义着色器也是一样的。

下面先看定义的部分:

 

这里有两个着色器:面着色器和顶点着色器。

关于这两个着色器,这里有必要说明一下,计算机中的3D模型基本都是由点结合三角面片去描述的,顶点着色器就是去处理这些点的数据,而面着色器就是通过插值的方式,去处理三角面片上点的数据。

上面定义的顶点着色器就定义了顶点的位置和颜色计算方式;而面着色器定义了插值点的颜色计算方式。实际的应用场景中,还会涉及到在着色器中处理光线等效果。

定义了着色器,在程序中就可以查找到它们并可以去使用:

 
    var shaderProgram;

    function initShaders() {
        var fragmentShader = getShader(gl, "shader-fs");
        var vertexShader = getShader(gl, "shader-vs");

        shaderProgram = gl.createProgram();
        gl.attachShader(shaderProgram, vertexShader);
        gl.attachShader(shaderProgram, fragmentShader);
        gl.linkProgram(shaderProgram);

        if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
            alert("Could not initialise shaders");
        }

        gl.useProgram(shaderProgram);

        shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
        gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);

        shaderProgram.vertexColorAttribute = gl.getAttribLocation(shaderProgram, "aVertexColor");
        gl.enableVertexAttribArray(shaderProgram.vertexColorAttribute);

        shaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, "uPMatrix");
        shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
    }

着色器是有了,但是怎么让显卡去执行,Program就是这种桥梁,它是WebGL原生的二进制码,它的作用基本上就是让显卡运行着色器代码去渲染指定的模型数据。
这里还用到一个辅助方法getShader,这个方法就是遍历html文档,查找着色器的定义,拿到定义后创建着色器,这里就不细说了:

 
function getShader(gl, id) {
    var shaderScript, theSource, currentChild, shader;
    
    shaderScript = document.getElementById(id);    
    if (!shaderScript) {
        return null;
    }
    
    theSource = "";
    currentChild = shaderScript.firstChild;    
    while(currentChild) {
        if (currentChild.nodeType == currentChild.TEXT_NODE) {
            theSource += currentChild.textContent;
        }
        
        currentChild = currentChild.nextSibling;
    }
    if (shaderScript.type == "x-shader/x-fragment") {
      shader = gl.createShader(gl.FRAGMENT_SHADER);
    } else if (shaderScript.type == "x-shader/x-vertex") {
      shader = gl.createShader(gl.VERTEX_SHADER);
    } else {
     // Unknown shader type
     return null;
    }
   gl.shaderSource(shader, theSource);
    
   // Compile the shader program
   gl.compileShader(shader);  
    
   // See if it compiled successfully
   if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {  
      alert("An error occurred compiling the shaders: " + gl.getShaderInfoLog(shader));  
      return null;  
   }
    
   return shader;
} 

步骤三:创建/加载模型数据 - initBuffers

这些小例子中,模型数据基本都是直接生成的,实际的程序中,这些数据应该都是从模型加载得到的:

 
    var triangleVertexPositionBuffer;
    var triangleVertexColorBuffer;

    function initBuffers() {
        triangleVertexPositionBuffer = gl.createBuffer();
        gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);
        var vertices = [
             0.0,  1.0,  0.0,
            -1.0, -1.0,  0.0,
             1.0, -1.0,  0.0
        ];
        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
        triangleVertexPositionBuffer.itemSize = 3;
        triangleVertexPositionBuffer.numItems = 3;

        triangleVertexColorBuffer = gl.createBuffer();
        gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexColorBuffer);
        var colors = [
            1.0, 0.0, 0.0, 1.0,
            0.0, 1.0, 0.0, 1.0,
            0.0, 0.0, 1.0, 1.0
        ];
        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
        triangleVertexColorBuffer.itemSize = 4;
        triangleVertexColorBuffer.numItems = 3;
    } 

上面这段代码创建了三角形的顶点和顶点的颜色数据并放在缓冲区中。

步骤四:渲染 - drawScene

准备好了数据以后,交给WebGL去渲染就好了,这里调用的是gl.drawArrays方法。看代码:

 
    function drawScene() {
        gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
        gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

        pMatrix = okMat4Proj(45.0, gl.viewportWidth / gl.viewportHeight, 0.1, 100.0);
        mvMatrix = okMat4Trans(-1.5, 0.0, -7.0);

        gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);
        gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, triangleVertexPositionBuffer.itemSize,
  gl.FLOAT, false, 0, 0);

        gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexColorBuffer);
        gl.vertexAttribPointer(shaderProgram.vertexColorAttribute, triangleVertexColorBuffer.itemSize, 
gl.FLOAT, false, 0, 0);

        setMatrixUniforms();
        gl.drawArrays(gl.TRIANGLES, 0, triangleVertexPositionBuffer.numItems);
    } 

这个函数首先设置了3D世界的背景为黑色,然后设置投影矩阵,设置待绘制对象的位置,然后根据缓冲中的顶点和颜色数据,绘制对象。这里还有一些生成投影矩阵和模型视图矩形的辅助方法(使用了Oak3D图形库中的矩阵辅助方法)与主题关系不大,这里就不详细解释了。

基本上流程就是这么多了,更复杂的纹理,光线等都是在这些基础上加入一些WegGL的特性实现的,这个请参看后面的中文教程,里面有详细的例子。

怎么样?使用原生的WebGL开发是一种什么感受?不仅需要有深厚的3D知识,还需要知道各种实现细节。WebGL这样做是为了灵活的适应各种应用场景,但是对于大多数像我这样非专业人士来说,很多细节是不需要知道的。这样就催生了各种辅助开发的类库,例如这节用到的Oak3D库(为了演示WebGL开发,例子中只用到了矩阵辅助方法)。下一节会介绍一个用的比较多的Three.js图形库。

前面我们看到了使用原生的WebGL API开发是多么的累,正因为如此,大量的WebGL框架被开发出来。使用这些框架,你可以快速创建需要的3D场景。这些框架不同程度的封装了创建3D场景的各种要素,例如场景,相机、模型、光照、材质等等;使用这些封装起来的对象,就可以很简单的创建需要的3D场景,这样你就只需要把更多精力放在逻辑方面就可以了。

目前并没有哪一个具有能压倒其他框架的优势,选择什么样的框,还是看个人喜好吧,不过选择框架的时候,个人觉得还是多看看框架最后的更新时间,选择稳定更新的框架能让你始终能使用上最新的特性,使你的程序稳定性更好。

下面的例子就使用了Three.js框架进行开发。

Three.js是一个比较全面的开源框架,它良好的封装的3D场景的各种要素。你可以用它来很容易的去创建摄像机,模型,光照,材质等等。你还可以选择不同的渲染器,Three.js提供了多种渲染方式,你可以选择使用canvas来渲染,也可以使用WebGL或者SVG来进行渲染。

此外,Three.js可以加载很多格式的3D文件,你的模型文件可以来自Blender,Maya,Chinema4D,3DMax等等。而且内置了比较基础的东西:(球体)Spheres, (飞机)Planes, (立方体) Cubes, (圆柱体)Cylinders。Three.js创建这些物体会非常的容易。

好了,不废话了,直接看代码:

 


 
  threeJSDemo title>
  <meta charset="utf-8">
  <style>
   body
   {
    margin:0px;
    background-color:#B0B0B0;
    overload:hidden;
   }
  </style>
 </head>
 <body>
  <script src="Three.js">script>
  <script>
   var camera,scene,renderer;
   var mesh;
   init();
   animate();
   
   function init(){
    scene = new THREE.Scene();
    camera = new THREE.PerspectiveCamera(70,window.innerWidth / window.innerHeight,1,1000);
    camera.position.z = 400;
    scene.add(camera);   
    geometry = new THREE.CubeGeometry(200,200,200);
    material = new THREE.MeshBasicMaterial( { color: 0xff0000, wireframe: true } );
    mesh = new THREE.Mesh(geometry,material);
    scene.add(mesh);
    renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth,window.innerHeight);
    document.body.appendChild(renderer.domElement);
   }  

   function animate() {
    requestAnimationFrame( animate );
    mesh.rotation.x += 0.05;
    mesh.rotation.y += 0.05;
    renderer.render( scene, camera );
   }
   </script>   
 </body>
</html> </pre> </td> 
         </tr> 
        </tbody> 
       </table><p class="artcon">这个是全部的代码,相对于前面使用WebGL的API的代码,这个简直就是太简单了。</p> <p class="artcon">代码很直观,就那么几步:</p> <p class="artcon">1. 创建场景scene。</p> <p class="artcon">2. 创建摄像机camera。</p> <p class="artcon">3. 创建/加载模型geometry。</p> <p class="artcon">4. 加载材质material。</p> <p class="artcon">5. 渲染模型对象mesh(是由geometry和material组成)。</p> <p class="artcon">6. 启用动画。</p> <p class="artcon">这是每个框架都提供的功能,使用不同的框架除了函数的名称可能不同以外,这些步骤基本都是一样的。下面的参考中列出了很多的框架学习文档,大家可以选几种学习一下。</p> <p class="artcon">针对模型数据,我还想说一点,因为JSON短小精悍,所以比较适合网络传输。未来它可能成为最适合WebGL的模型数据格式,所以很多的框架都开始支持JSON格式的模型数据。</p> </td> 
     </tr> 
    </tbody> 
   </table> 
   <table border="0" align="center"> 
    <tbody> 
     <tr> 
      <td width="34%" height="30"> </td> 
      <td height="30"> </td> 
      <td width="34%" height="30"> </td> 
     </tr> 
     <tr> 
      <td class="lettit" width="34%" height="30">相关文章</td> 
      <td class="lettit" height="30">相关文档</td> 
      <td class="lettit" width="34%" height="30">相关课程</td> 
     </tr> 
     <tr> 
      <td width="34%" height="25"> 
       <hr width="80%"></td> 
      <td width="34%" height="25"> 
       <hr width="80%"></td> 
      <td width="34%" height="25"> 
       <hr width="80%"></td> 
     </tr> 
     <tr> 
      <td width="34%" height="127"> 
       <table> 
        <tbody> 
         <tr> 
          <td width="386" height="25">深度解析:清理烂代码</td> 
         </tr> 
         <tr> 
          <td height="25">如何编写出拥抱变化的代码</td> 
         </tr> 
         <tr> 
          <td height="25">重构-使代码更简洁优美</td> 
         </tr> 
         <tr> 
          <td height="25">团队项目开发"编码规范"系列文章</td> 
         </tr> 
        </tbody> 
       </table></td> 
      <td height="127"> 
       <table> 
        <tbody> 
         <tr> 
          <td width="386" height="25">重构-改善既有代码的设计</td> 
         </tr> 
         <tr> 
          <td height="25">软件重构v2</td> 
         </tr> 
         <tr> 
          <td height="25">代码整洁之道</td> 
         </tr> 
         <tr> 
          <td height="25">高质量编程规范</td> 
         </tr> 
        </tbody> 
       </table></td> 
      <td width="34%" height="127"> </td> 
     </tr> 
    </tbody> 
   </table> 
  </div> 
  <p>转载于:https://www.cnblogs.com/justTheOne-bin/p/3664344.html</p> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1714039075553488896"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(json,操作系统)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1950170537426743296.htm"
                           title="在Windows11上安装Linux操作系统的几种技术方案" target="_blank">在Windows11上安装Linux操作系统的几种技术方案</a>
                        <span class="text-muted">yuanpan</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>在Windows11上安装Linux主要有以下几种技术方案,每种方案适用于不同的需求场景:1.WindowsSubsystemforLinux(WSL)适用场景:开发、命令行工具、轻量级Linux环境支持发行版:Ubuntu、Debian、KaliLinux、Fedora等优点:轻量级:无需虚拟机,直接在Windows上运行Linux命令行环境。无缝集成:可访问Windows文件系统,支持VSCo</div>
                    </li>
                    <li><a href="/article/1950165349387268096.htm"
                           title="2021-01-19" target="_blank">2021-01-19</a>
                        <span class="text-muted">长孙俊明</span>

                        <div>curl-H"Content-Type:application/json"-XPUT127.0.0.1:9200/_all/_settings-d'{"index.max_result_window":"5000000"}'</div>
                    </li>
                    <li><a href="/article/1950163093577330688.htm"
                           title="Linux中Samba服务器安装与配置文件" target="_blank">Linux中Samba服务器安装与配置文件</a>
                        <span class="text-muted">長樂.-</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>Samba简述27zkqsamba是一个基于TCP/IP协议的开源软件套件,可以在Linux、Windows、macOS等操作系统上运行。它允许不同操作系统的计算机之间实现文件和打印机共享。samba提供了一个服务,使得Windows操作系统可以像访问本地文件一样访问Linux、Mac等操作系统上的共享文件。实现跨平台的文件共享,提高办公环境的效率和便利性。samba也支持Windows网络邻居协</div>
                    </li>
                    <li><a href="/article/1950160572502831104.htm"
                           title="Ubuntu24安装MariaDB/MySQL后不知道root密码如何解决" target="_blank">Ubuntu24安装MariaDB/MySQL后不知道root密码如何解决</a>
                        <span class="text-muted"></span>

                        <div>Ubuntu24.04安装MariaDB后root密码未知?解决方案在此在Ubuntu24.04上新安装MariaDB后,许多用户会发现自己不知道root用户的密码,甚至在安装过程中也没有提示设置密码。这是因为在较新的MariaDB版本中,默认情况下root用户采用了unix_socket身份验证插件。这意味着您可以使用操作系统的root用户权限直接登录MariaDB,而无需输入密码。本文将为您详</div>
                    </li>
                    <li><a href="/article/1950152503563710464.htm"
                           title="如何在 Ubuntu 24.04 或 22.04 Linux 上安装和使用 NoMachine" target="_blank">如何在 Ubuntu 24.04 或 22.04 Linux 上安装和使用 NoMachine</a>
                        <span class="text-muted">山岚的运维笔记</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4%E5%8F%8A%E4%BD%BF%E7%94%A8/1.htm">运维及使用</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/nomachine/1.htm">nomachine</a><a class="tag" taget="_blank" href="/search/%E8%BF%9C%E7%A8%8B%E8%BF%9E%E6%8E%A5/1.htm">远程连接</a>
                        <div>NoMachine是一款适用于Linux(Ubuntu)及其他支持的操作系统的远程桌面应用程序,允许用户通过本地或远程系统从世界任何地方控制计算机。它可以在低带宽连接下工作,被专业人士和家庭用户广泛使用。NoMachine的主要功能高性能远程访问跨平台兼容性易于使用,因为用户界面友好提供强大的加密协议,如SSH、SSL及其他安全标准支持远程文件传输和打印服务允许从远程计算机进行音频和视频流媒体传输</div>
                    </li>
                    <li><a href="/article/1950144218282389504.htm"
                           title="为什么学习Web前端一定要掌握JavaScript?" target="_blank">为什么学习Web前端一定要掌握JavaScript?</a>
                        <span class="text-muted">web前端学习指南</span>

                        <div>为什么学习Web前端一定要掌握JavaScript?在前端的世界里,没有什么是JavaScript实现不了的,关于JS有一句话:凡是可以用JavaScript来写的应用,最终都会用JavaScript,JavaScript可运行在所有主要平台的所有主流浏览器上,也可运行在每一个主流操作系统的服务器端上。现如今我们在为网站写任何一个主要功能的时候都需要有懂能够用JavaScript写前端的开发人员。</div>
                    </li>
                    <li><a href="/article/1950133464426672128.htm"
                           title="OpenCloudOS 城市行·成都站圆满落幕,共探操作系统技术新未来!" target="_blank">OpenCloudOS 城市行·成都站圆满落幕,共探操作系统技术新未来!</a>
                        <span class="text-muted">CSDN资讯</span>
<a class="tag" taget="_blank" href="/search/%E4%B8%9A%E7%95%8C%E8%B5%84%E8%AE%AF/1.htm">业界资讯</a><a class="tag" taget="_blank" href="/search/%E8%B5%84%E8%AE%AF/1.htm">资讯</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>7月26日,由OpenCloudOS社区主办,海光信息战略合作的OpenCloudOS城市行・成都站活动在成都欧洲中心圆满举办,线上观看人次超3万。当前,数字化浪潮席卷全球各行各业,在国产化进程加速的背景下,操作系统的技术突破与生态构建不仅是保障信息安全的关键,更是推动产业升级、实现高质量发展的必由之路。然而,国产操作系统在性能优化、安全防护、多场景适配等方面仍面临诸多挑战,亟需产业链上下游协同创</div>
                    </li>
                    <li><a href="/article/1950132582964326400.htm"
                           title="涵盖轻量级锁(SpinLock)与操作系统同步原语(如 CRITICAL_SECTION)的性能优化、Monitor 的原子性和数据竞争防护、Monitor.Wait 和 Pulse 在生产者-消费者" target="_blank">涵盖轻量级锁(SpinLock)与操作系统同步原语(如 CRITICAL_SECTION)的性能优化、Monitor 的原子性和数据竞争防护、Monitor.Wait 和 Pulse 在生产者-消费者</a>
                        <span class="text-muted">zhxup606</span>
<a class="tag" taget="_blank" href="/search/C%23%E5%AE%9E%E6%88%98%E6%95%99%E7%A8%8B/1.htm">C#实战教程</a><a class="tag" taget="_blank" href="/search/%E6%9D%8E%E5%B7%A5%E7%AF%87/1.htm">李工篇</a><a class="tag" taget="_blank" href="/search/wpf/1.htm">wpf</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a>
                        <div>涵盖轻量级锁(SpinLock)与操作系统同步原语(如CRITICAL_SECTION)的性能优化、Monitor的原子性和数据竞争防护、Monitor.Wait和Pulse在生产者-消费者中的作用、控制线程执行顺序、Thread.Join的含义、避免嵌套锁的锁顺序策略,以及防止伪唤醒的条件检查。每个问题包括核心概念、实现细节、与之前讨论的关联(如线程池、进程间同步、分布式同步)、代码示例、测试用</div>
                    </li>
                    <li><a href="/article/1950121240370933760.htm"
                           title="群晖 File Station:集中浏览与管理 NAS 文件的工具" target="_blank">群晖 File Station:集中浏览与管理 NAS 文件的工具</a>
                        <span class="text-muted">Trihawk宇麦科技</span>
<a class="tag" taget="_blank" href="/search/%E7%BE%A4%E6%99%96NAS/1.htm">群晖NAS</a>
                        <div>FileStation是SynologyDSM(DiskStationManager)操作系统中的核心内建应用,以网页形式提供友好的图形界面,供用户在浏览器中管理NAS上的文件和共享资料核心功能特色1.文件浏览与管理Navigate文件夹、执行拖放上传、剪贴、重命名、移动、删除等常用操作,类似WindowsExplorer或macOSFinder的使用体验,直观且便捷支持批量操作、压缩与解压、多文</div>
                    </li>
                    <li><a href="/article/1950118498051092480.htm"
                           title="自定义参数解析器HandlerMethodArgumentResolver,重新定义@ResponseBody的请求方式" target="_blank">自定义参数解析器HandlerMethodArgumentResolver,重新定义@ResponseBody的请求方式</a>
                        <span class="text-muted">chanyi</span>

                        <div>1、解决的问题加了@ResponseBody注解的方法,请求的方式是post的json格式,但如果我们也要通过post的application/x-www-form-urlencoded格式访问此接口。在不改变此接口的情况下。通过修改参数解析器HandlerMethodArgumentResovler来兼容两种请求方法。2、思路根据不同的content-type使用不同参数解析处理器。Conten</div>
                    </li>
                    <li><a href="/article/1950114557917720576.htm"
                           title="Windows系统第一次运行C语言程序,环境配置,软件安装等遇到的坑及解决方法" target="_blank">Windows系统第一次运行C语言程序,环境配置,软件安装等遇到的坑及解决方法</a>
                        <span class="text-muted">灬爱码士灬</span>
<a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>明确需要编辑器和编译器,并选择自己要用什么(我选的编辑器是VSCode:VisualStudioCode;编译器是gcc)下载VSCode并配置环境变量(这里没啥问题),安装C/C++的拓展安装Cygwin,用来在Windows操作系统上模拟Unix/Linux环境(Cygwin官网:https://www.cygwin.com/。)安装过程中镜像可以选择https://mirrors.aliyu</div>
                    </li>
                    <li><a href="/article/1950112038772600832.htm"
                           title="python中的 JWT" target="_blank">python中的 JWT</a>
                        <span class="text-muted">weixin_34355881</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a>
                        <div>Jsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。基</div>
                    </li>
                    <li><a href="/article/1950108839089074176.htm"
                           title="Windows下Oracle安装图解" target="_blank">Windows下Oracle安装图解</a>
                        <span class="text-muted">叫我老村长</span>

                        <div>Windows下Oracle安装图解----oracle-win-64-11g详细安装步骤一、Oracle下载官方下地址http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.htmlwin32位操作系统下载地址:http://download.oracle.com/otn/nt/oracle11g</div>
                    </li>
                    <li><a href="/article/1950105484497317888.htm"
                           title="【Python】PyJWT:轻松实现 JSON Web Token (JWT) 网络令牌的生成与验证" target="_blank">【Python】PyJWT:轻松实现 JSON Web Token (JWT) 网络令牌的生成与验证</a>
                        <span class="text-muted">@Unity打怪升级</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/pip/1.htm">pip</a><a class="tag" taget="_blank" href="/search/ipython/1.htm">ipython</a>
                        <div>PyJWT是一个用Python实现的轻量级库,用于处理JSONWebToken(JWT)。JWT是一种安全的方式,用来表示双方之间经过签名的令牌,通常用于认证和授权场景。PyJWT简化了JWT的生成和验证过程,使得开发者能够轻松地在Python项目中集成JWT功能。在这篇博客中,我们将深入介绍PyJWT,展示如何生成、解码和验证JWT令牌,并且会通过代码示例演示如何在实际项目中使用PyJWT进行认</div>
                    </li>
                    <li><a href="/article/1950066526312787968.htm"
                           title="如何从模型返回结构化数据" target="_blank">如何从模型返回结构化数据</a>
                        <span class="text-muted">努力学习agent</span>
<a class="tag" taget="_blank" href="/search/langchain/1.htm">langchain</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>with_structured_output()方法支持此方法的模型ProviderToolcallingStructuredoutputJSONmodeLocalMultimodalPackageChatAnthropic✅✅❌❌✅langchain-anthropicChatMistralAI✅✅❌❌❌langchain-mistralaiChatFireworks✅✅✅❌❌langchain</div>
                    </li>
                    <li><a href="/article/1950053415744761856.htm"
                           title="[simdjson] 实现不同CPU调度 | 自动硬件适配的抽象" target="_blank">[simdjson] 实现不同CPU调度 | 自动硬件适配的抽象</a>
                        <span class="text-muted">lvy-</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/json%E9%AB%98%E9%80%9F%E8%A7%A3%E6%9E%90lib/1.htm">json高速解析lib</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>第八章:实现不同CPU调度欢迎回来~在前面的章节中,我们已经探索了如何使用simdjson的解析器、填充字符串、文档、值类型、对象与数组,学习了如何处理错误处理,甚至处理文档流。我们已经看到simdjson的速度非常快。这种速度很大程度上源于现代CPU提供的高性能专用指令。但并非所有CPU都相同!在Intel芯片上可用的指令可能在ARM芯片或旧款Intel芯片上不存在。这带来了一个挑战:如何让si</div>
                    </li>
                    <li><a href="/article/1950051525124485120.htm"
                           title="OpenSIPS 邂逅 Kafka:构建高效 VoIP 消息处理架构" target="_blank">OpenSIPS 邂逅 Kafka:构建高效 VoIP 消息处理架构</a>
                        <span class="text-muted">c_zyer</span>
<a class="tag" taget="_blank" href="/search/opensips/1.htm">opensips</a><a class="tag" taget="_blank" href="/search/SIP/1.htm">SIP</a><a class="tag" taget="_blank" href="/search/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/1.htm">消息队列</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/opensips/1.htm">opensips</a><a class="tag" taget="_blank" href="/search/voip/1.htm">voip</a>
                        <div>使用场景使用步骤引入模块组装&发送数据消费数据故障转移使用场景异步日志处理:将OpenSIPS中的SIP信令日志、通话记录(CDR)等数据发送到Kafka队列中。事件通知与监控:利用OpenSIPS的event_interface模块将SIP事件(如呼叫建立、断开、注册等)推送到KafkaOpenSIPS中事件接口有以下类型:EVENT_DATAGRAM-PublishJSON-RPCnotifi</div>
                    </li>
                    <li><a href="/article/1950046609509249024.htm"
                           title="java callable 详解_详解Java Callable接口实现多线程的方式" target="_blank">java callable 详解_详解Java Callable接口实现多线程的方式</a>
                        <span class="text-muted">想法臃肿</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/callable/1.htm">callable</a><a class="tag" taget="_blank" href="/search/%E8%AF%A6%E8%A7%A3/1.htm">详解</a>
                        <div>在Java1.5以前,创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。无论我们以怎样的形式实现多线程,都需要调用Thread类中的start方法去向操作系统请求io,cup等资源。因为线程run方法没有返回值,如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。而自从java1.5开始,就提供了Callable和F</div>
                    </li>
                    <li><a href="/article/1950034755718279168.htm"
                           title="基于C/S架构与JAVA SWING的简易酒店管理系统实现" target="_blank">基于C/S架构与JAVA SWING的简易酒店管理系统实现</a>
                        <span class="text-muted">想法臃肿</span>

                        <div>本文还有配套的精品资源,点击获取简介:本系统名为“简易酒店管理操作系统”,采用C/S架构和JAVASWING工具开发,旨在提供高效的酒店业务流程管理。系统包括客房管理、餐饮服务、前台接待、财务管理、库存管理和报表统计等核心模块,旨在通过技术手段提升酒店运营效率和客户体验,同时注重系统安全和数据保护。1.酒店管理系统概念与C/S架构1.1酒店管理系统简介在当今数字化时代,酒店管理系统是酒店运营不可或</div>
                    </li>
                    <li><a href="/article/1950027190192107520.htm"
                           title="Linux从入门到精通——基础篇" target="_blank">Linux从入门到精通——基础篇</a>
                        <span class="text-muted">weixin_30390075</span>

                        <div>一.关于Linux的简介1.什么是Linux?Linux这个词指的是Linux内核,它是用来驱动电脑里的硬件的,而Linux操作系统指的是Linux内核和GUN组织(GUN的全称为GUNisnotUnix)所编写的软件,有了这个内核和相应的软件,由“死”的机械硬件组成的计算机才变成了“活”的,需要注意的是,单纯的软件并不能代表Linux系统。2.Linux的特点和优势1.模块化程度高Linux的内</div>
                    </li>
                    <li><a href="/article/1950025045501865984.htm"
                           title="如何查看 Windows 电脑的处理器类型(x64 或 ARM64)" target="_blank">如何查看 Windows 电脑的处理器类型(x64 或 ARM64)</a>
                        <span class="text-muted">枫萏</span>
<a class="tag" taget="_blank" href="/search/Other/1.htm">Other</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>方法1:通过「设置」查看按Win+I打开「设置」进入系统→关于在设备规格部分,查看系统类型:①如果显示64位操作系统,基于x64的处理器→选择GitforWindows/x64Portable②如果显示64位操作系统,基于ARM的处理器→选择GitforWindows/ARM64Portable方法2:通过「任务管理器」查看按Ctrl+Shift+Esc打开「任务管理器」切换到性能选项卡查看CPU</div>
                    </li>
                    <li><a href="/article/1950024290082549760.htm"
                           title="配置环境变量(以 JDK 1.8为例)macOS Mojave" target="_blank">配置环境变量(以 JDK 1.8为例)macOS Mojave</a>
                        <span class="text-muted">夜色曾沁凉</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/1.htm">编程语言</a><a class="tag" taget="_blank" href="/search/%26amp%3B/1.htm">&</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/1.htm">程序设计</a><a class="tag" taget="_blank" href="/search/macOS/1.htm">macOS</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/1.htm">编程语言</a><a class="tag" taget="_blank" href="/search/%26amp%3Bamp%3Bamp%3B/1.htm">&amp;amp;</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/1.htm">程序设计</a>
                        <div>什么是环境变量环境变量(environmentvariables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,</div>
                    </li>
                    <li><a href="/article/1950020633253441536.htm"
                           title="Linux 逻辑卷管理实例详解" target="_blank">Linux 逻辑卷管理实例详解</a>
                        <span class="text-muted">ORA_无花果</span>
<a class="tag" taget="_blank" href="/search/os/1.htm">os</a><a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/%E9%80%BB%E8%BE%91%E5%8D%B7%E7%AE%A1%E7%90%86/1.htm">逻辑卷管理</a><a class="tag" taget="_blank" href="/search/lvm%E5%AE%9E%E4%BE%8B%E8%AF%A6%E8%A7%A3/1.htm">lvm实例详解</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>Linux逻辑卷管理(LVM)LVM(LogicalVolumeManager,逻辑卷管理器)是一种把硬盘空间划分成“弹性”逻辑卷的方法。这里的“弹性”体现在硬盘不必重新分区也能够被简单地重新划分大小。需要强调说明的是,LVM是Linux操作系统中一个磁盘管理子系统,而不是文件系统!1、LVM基本概念一般来说,一个分区大小是固定的。如果一个分区上没有空间时,我们只能重新分区以扩大相应分区的大小(这</div>
                    </li>
                    <li><a href="/article/1950019622518452224.htm"
                           title="datax数据抽取csv到mysql" target="_blank">datax数据抽取csv到mysql</a>
                        <span class="text-muted"></span>

                        <div>datax数据抽取执行pythondatax.py-rstreamreader-wstreamwriter命令得到job的json模板![在这里插入图片描述](https://img-blog.csdnimg.cn/893860a55d5f40778a5010c76bc8c81f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shado</div>
                    </li>
                    <li><a href="/article/1950013574671822848.htm"
                           title="在 Windows 系统 下直接使用了 Linux/macOS 的环境变量设置语法 PLATFORM=android" target="_blank">在 Windows 系统 下直接使用了 Linux/macOS 的环境变量设置语法 PLATFORM=android</a>
                        <span class="text-muted"></span>

                        <div>一、报错原因由于开发这个项目的同事,使用电脑的操作系统是macOS。所以才会出现这个错误,因为我是在Windows系统下直接使用了Linux/macOS的环境变量设置语法PLATFORM=android(项目根目录下的package.json文件,找到scripts部分,检查test:android的定义),而Windows不支持这种语法。二、解决方案cross-env是一个解决跨平台环境变量设置</div>
                    </li>
                    <li><a href="/article/1950005630261587968.htm"
                           title="【JSON】Json与Java对象的互相转化" target="_blank">【JSON】Json与Java对象的互相转化</a>
                        <span class="text-muted">林雨涵</span>
<a class="tag" taget="_blank" href="/search/Java%E5%9F%BA%E7%A1%80/1.htm">Java基础</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>目录一、常用方法1.导入依赖2.常用的方法1.Java字符串的转化Java字符串->Json数组Json字符串->Json对象Java字符串->Java对象Java字符串->Java对象集合2.Java对象的转化Java对象->Java字符串(Json样式)Java对象->Json对象3.Json对象的转化Json对象->Java字符串Json对象->Java对象二、实战一、常用方法官方文档:ht</div>
                    </li>
                    <li><a href="/article/1950000206854549504.htm"
                           title="[分享]钛极OS(TiJOS)物联网操作系统介绍" target="_blank">[分享]钛极OS(TiJOS)物联网操作系统介绍</a>
                        <span class="text-muted"></span>

                        <div>钛极OS(TiJOS)物联网操作系统介绍官方链接:http://dev.tijos.net/overview/TiJOS_overview/1.tijos_introduction/钛极OS(TiJOS)是一个支持使用Java开发嵌入式智能硬件应用的物联网操作系统,支持多种MCU芯片,为开发者提供高效、成熟的物联网应用开发平台,让智能硬件及IoT应用开发更快捷简单。钛极OS(TiJOS)可运行于低</div>
                    </li>
                    <li><a href="/article/1949995914462556160.htm"
                           title="什么是JSON,如何与Java对象转化" target="_blank">什么是JSON,如何与Java对象转化</a>
                        <span class="text-muted">doublez234</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a>
                        <div>JSON概念JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。它易于人阅读和编写,同时也易于机器解析和生成。JSON基于JavaScript(ECMAScript(欧洲计算机协会制定的js规范))编程语言的一个子集,但它是一种独立于语言的数据格式,被广泛应用于各种编程语言和平台之间的数据交换。JSON的主要特点:轻量级:JSON格式非常简洁,只包含必要的数据信</div>
                    </li>
                    <li><a href="/article/1949993268787867648.htm"
                           title="Vue3判断对象是否为空方法" target="_blank">Vue3判断对象是否为空方法</a>
                        <span class="text-muted">滿</span>
<a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                        <div>1、Object.keys()检查对象自身可枚举属性的数量:constisEmpty=Object.keys(obj).length===0;2、JSON.stringify()将对象转为JSON字符串判断:constisEmpty=JSON.stringify(obj)==='{}';3、Reflect.ownKeys()(包含Symbol属性)constisEmpty=Reflect.ownK</div>
                    </li>
                    <li><a href="/article/1949958843928735744.htm"
                           title="运维-资产梳理" target="_blank">运维-资产梳理</a>
                        <span class="text-muted"></span>

                        <div>资产梳理一、明确目标与范围1.1、确定梳理目的网络安全:缩小攻击面、识别风险点。资源配置:优化资源利用率、降低成本。合规要求:满足法律法规或行业标准(如等保、ISO27001)。1.2、界定资产范围物理资产:服务器、网络设备、终端设备、IoT设备等。数字资产:操作系统、数据库、应用程序、域名、IP地址、云资源、容器/K8s集群、SaaS应用。数据资产:敏感数据(如客户信息、财务数据)、业务数据、备</div>
                    </li>
                                <li><a href="/article/110.htm"
                                       title="强大的销售团队背后 竟然是大数据分析的身影" target="_blank">强大的销售团队背后 竟然是大数据分析的身影</a>
                                    <span class="text-muted">蓝儿唯美</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a>
                                    <div>Mark Roberge是HubSpot的首席财务官,在招聘销售职位时使用了大量数据分析。但是科技并没有挤走直觉。 
大家都知道数理学家实际上已经渗透到了各行各业。这些热衷数据的人们通过处理数据理解商业流程的各个方面,以重组弱点,增强优势。 
Mark Roberge是美国HubSpot公司的首席财务官,HubSpot公司在构架集客营销现象方面出过一份力——因此他也是一位数理学家。他使用数据分析 </div>
                                </li>
                                <li><a href="/article/237.htm"
                                       title="Haproxy+Keepalived高可用双机单活" target="_blank">Haproxy+Keepalived高可用双机单活</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/1.htm">负载均衡</a><a class="tag" taget="_blank" href="/search/keepalived/1.htm">keepalived</a><a class="tag" taget="_blank" href="/search/haproxy/1.htm">haproxy</a><a class="tag" taget="_blank" href="/search/%E9%AB%98%E5%8F%AF%E7%94%A8/1.htm">高可用</a>
                                    <div>我们的应用MyApp不支持集群,但要求双机单活(两台机器:master和slave): 
1.正常情况下,只有master启动MyApp并提供服务 
2.当master发生故障时,slave自动启动本机的MyApp,同时虚拟IP漂移至slave,保持对外提供服务的IP和端口不变 
 
F5据说也能满足上面的需求,但F5的通常用法都是双机双活,单活的话还没研究过 
 
 
服务器资源 
 
10.7</div>
                                </li>
                                <li><a href="/article/364.htm"
                                       title="eclipse编辑器中文乱码问题解决" target="_blank">eclipse编辑器中文乱码问题解决</a>
                                    <span class="text-muted">0624chenhong</span>
<a class="tag" taget="_blank" href="/search/eclipse%E4%B9%B1%E7%A0%81/1.htm">eclipse乱码</a>
                                    <div>使用Eclipse编辑文件经常出现中文乱码或者文件中有中文不能保存的问题,Eclipse提供了灵活的设置文件编码格式的选项,我们可以通过设置编码 格式解决乱码问题。在Eclipse可以从几个层面设置编码格式:Workspace、Project、Content Type、File 
本文以Eclipse 3.3(英文)为例加以说明: 
1. 设置Workspace的编码格式: 
Windows-&g</div>
                                </li>
                                <li><a href="/article/491.htm"
                                       title="基础篇--resources资源" target="_blank">基础篇--resources资源</a>
                                    <span class="text-muted">不懂事的小屁孩</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                                    <div>最近一直在做java开发,偶尔敲点android代码,突然发现有些基础给忘记了,今天用半天时间温顾一下resources的资源。 
 
String.xml    字符串资源   涉及国际化问题  

http://www.2cto.com/kf/201302/190394.html   
 
string-array</div>
                                </li>
                                <li><a href="/article/618.htm"
                                       title="接上篇补上window平台自动上传证书文件的批处理问卷" target="_blank">接上篇补上window平台自动上传证书文件的批处理问卷</a>
                                    <span class="text-muted">酷的飞上天空</span>
<a class="tag" taget="_blank" href="/search/window/1.htm">window</a>
                                    <div>  
@echo off
: host=服务器证书域名或ip,需要和部署时服务器的域名或ip一致  ou=公司名称, o=公司名称
set host=localhost      
set ou=localhost        
set o=localhost         
set password=123456
set validity=3650

set salias=s</div>
                                </li>
                                <li><a href="/article/745.htm"
                                       title="企业物联网大潮涌动:如何做好准备?" target="_blank">企业物联网大潮涌动:如何做好准备?</a>
                                    <span class="text-muted">蓝儿唯美</span>
<a class="tag" taget="_blank" href="/search/%E4%BC%81%E4%B8%9A/1.htm">企业</a>
                                    <div>物联网的可能性也许是无限的。要找出架构师可以做好准备的领域然后利用日益连接的世界。 
尽管物联网(IoT)还很新,企业架构师现在也应该为一个连接更加紧密的未来做好计划,而不是跟上闸门被打开后的集成挑战。“问题不在于物联网正在进入哪些领域,而是哪些地方物联网没有在企业推进,” Gartner研究总监Mike Walker说。 
Gartner预测到2020年物联网设备安装量将达260亿,这些设备在全</div>
                                </li>
                                <li><a href="/article/872.htm"
                                       title="spring学习——数据库(mybatis持久化框架配置)" target="_blank">spring学习——数据库(mybatis持久化框架配置)</a>
                                    <span class="text-muted">a-john</span>
<a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a>
                                    <div>Spring提供了一组数据访问框架,集成了多种数据访问技术。无论是JDBC,iBATIS(mybatis)还是Hibernate,Spring都能够帮助消除持久化代码中单调枯燥的数据访问逻辑。可以依赖Spring来处理底层的数据访问。 
mybatis是一种Spring持久化框架,要使用mybatis,就要做好相应的配置: 
1,配置数据源。有很多数据源可以选择,如:DBCP,JDBC,aliba</div>
                                </li>
                                <li><a href="/article/999.htm"
                                       title="Java静态代理、动态代理实例" target="_blank">Java静态代理、动态代理实例</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/Java%E9%9D%99%E6%80%81%E4%BB%A3%E7%90%86/1.htm">Java静态代理</a>
                                    <div>  
采用Java代理模式,代理类通过调用委托类对象的方法,来提供特定的服务。委托类需要实现一个业务接口,代理类返回委托类的实例接口对象。 
按照代理类的创建时期,可以分为:静态代理和动态代理。 
所谓静态代理: 指程序员创建好代理类,编译时直接生成代理类的字节码文件。 
所谓动态代理: 在程序运行时,通过反射机制动态生成代理类。 
  
一、静态代理类实例: 
1、Serivce.ja</div>
                                </li>
                                <li><a href="/article/1126.htm"
                                       title="Struts1与Struts2的12点区别" target="_blank">Struts1与Struts2的12点区别</a>
                                    <span class="text-muted">asia007</span>
<a class="tag" taget="_blank" href="/search/Struts1%E4%B8%8EStruts2/1.htm">Struts1与Struts2</a>
                                    <div>1) 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。Struts 2提供一个ActionSupport基类去实现常用的接口。即使Action接口不是必须实现的,只有一个包含execute方法的P</div>
                                </li>
                                <li><a href="/article/1253.htm"
                                       title="初学者要多看看帮助文档 不要用js来写Jquery的代码" target="_blank">初学者要多看看帮助文档 不要用js来写Jquery的代码</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a>
                                    <div>解析json数据的时候需要将解析的数据写到文本框中,  出现了用js来写Jquery代码的问题; 
  
1, JQuery的赋值  有问题 
   代码如下: data.username 表示的是:  网易 
  
         $("#use</div>
                                </li>
                                <li><a href="/article/1380.htm"
                                       title="经理怎么和员工搞好关系和信任" target="_blank">经理怎么和员工搞好关系和信任</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/%E5%9B%A2%E9%98%9F/1.htm">团队</a><a class="tag" taget="_blank" href="/search/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/1.htm">项目管理</a><a class="tag" taget="_blank" href="/search/%E7%AE%A1%E7%90%86/1.htm">管理</a>
                                    <div>        产品经理应该有坚实的专业基础,这里的基础包括产品方向和产品策略的把握,包括设计,也包括对技术的理解和见识,对运营和市场的敏感,以及良好的沟通和协作能力。换言之,既然是产品经理,整个产品的方方面面都应该能摸得出门道。这也不懂那也不懂,如何让人信服?如何让自己懂?就是不断学习,不仅仅从书本中,更从平时和各种角色的沟通</div>
                                </li>
                                <li><a href="/article/1507.htm"
                                       title="如何为rich:tree不同类型节点设置右键菜单" target="_blank">如何为rich:tree不同类型节点设置右键菜单</a>
                                    <span class="text-muted">sunjing</span>
<a class="tag" taget="_blank" href="/search/contextMenu/1.htm">contextMenu</a><a class="tag" taget="_blank" href="/search/tree/1.htm">tree</a><a class="tag" taget="_blank" href="/search/Richfaces/1.htm">Richfaces</a>
                                    <div>组合使用target和targetSelector就可以啦,如下: <rich:tree id="ruleTree" value="#{treeAction.ruleTree}" var="node" nodeType="#{node.type}"
    selectionChangeListener=&qu</div>
                                </li>
                                <li><a href="/article/1634.htm"
                                       title="【Redis二】Redis2.8.17搭建主从复制环境" target="_blank">【Redis二】Redis2.8.17搭建主从复制环境</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a>
                                    <div>开始使用Redis2.8.17 
Redis第一篇在Redis2.4.5上搭建主从复制环境,对它的主从复制的工作机制,真正的惊呆了。不知道Redis2.8.17的主从复制机制是怎样的,Redis到了2.4.5这个版本,主从复制还做成那样,Impossible is nothing! 本篇把主从复制环境再搭一遍看看效果,这次在Unbuntu上用官方支持的版本。   Ubuntu上安装Red</div>
                                </li>
                                <li><a href="/article/1761.htm"
                                       title="JSONObject转换JSON--将Date转换为指定格式" target="_blank">JSONObject转换JSON--将Date转换为指定格式</a>
                                    <span class="text-muted">白糖_</span>
<a class="tag" taget="_blank" href="/search/JSONObject/1.htm">JSONObject</a>
                                    <div>项目中,经常会用JSONObject插件将JavaBean或List<JavaBean>转换为JSON格式的字符串,而JavaBean的属性有时候会有java.util.Date这个类型的时间对象,这时JSONObject默认会将Date属性转换成这样的格式: 
  
{"nanos":0,"time":-27076233600000,</div>
                                </li>
                                <li><a href="/article/1888.htm"
                                       title="JavaScript语言精粹读书笔记" target="_blank">JavaScript语言精粹读书笔记</a>
                                    <span class="text-muted">braveCS</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a>
                                    <div>【经典用法】: 
  
//①定义新方法

Function .prototype.method=function(name, func){

              this.prototype[name]=func;

              return this;

}

 

//②给Object增加一个create方法,这个方法创建一个使用原对</div>
                                </li>
                                <li><a href="/article/2015.htm"
                                       title="编程之美-找符合条件的整数 用字符串来表示大整数避免溢出" target="_blank">编程之美-找符合条件的整数 用字符串来表示大整数避免溢出</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B9%8B%E7%BE%8E/1.htm">编程之美</a>
                                    <div>

import java.util.LinkedList;

public class FindInteger {

	/**
	 *  编程之美 找符合条件的整数 用字符串来表示大整数避免溢出
	 *  题目:任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0
	 *  
	 *  假设当前正在搜索由0,1组成的K位十进制数</div>
                                </li>
                                <li><a href="/article/2142.htm"
                                       title="读书笔记" target="_blank">读书笔记</a>
                                    <span class="text-muted">chengxuyuancsdn</span>
<a class="tag" taget="_blank" href="/search/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/1.htm">读书笔记</a>
                                    <div>1、Struts访问资源 
2、把静态参数传递给一个动作 
3、<result>type属性 
4、s:iterator、s:if c:forEach 
5、StringBuilder和StringBuffer 
6、spring配置拦截器 
 
1、访问资源 
(1)通过ServletActionContext对象和实现ServletContextAware,ServletReque</div>
                                </li>
                                <li><a href="/article/2269.htm"
                                       title="[通讯与电力]光网城市建设的一些问题" target="_blank">[通讯与电力]光网城市建设的一些问题</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E9%97%AE%E9%A2%98/1.htm">问题</a>
                                    <div> 
      信号防护的问题,前面已经说过了,这里要说光网交换机与市电保障的关系 
 
      我们过去用的ADSL线路,因为是电话线,在小区和街道电力中断的情况下,只要在家里用笔记本电脑+蓄电池,连接ADSL,同样可以上网........ 
 
    </div>
                                </li>
                                <li><a href="/article/2396.htm"
                                       title="oracle 空间RESUMABLE" target="_blank">oracle 空间RESUMABLE</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E7%A9%BA%E9%97%B4%E4%B8%8D%E8%B6%B3/1.htm">空间不足</a><a class="tag" taget="_blank" href="/search/RESUMABLE/1.htm">RESUMABLE</a><a class="tag" taget="_blank" href="/search/%E9%94%99%E8%AF%AF%E6%8C%82%E8%B5%B7/1.htm">错误挂起</a>
                                    <div>空间RESUMABLE操作  转 
 
 
 
Oracle从9i开始引入这个功能,当出现空间不足等相关的错误时,Oracle可以不是马上返回错误信息,并回滚当前的操作,而是将操作挂起,直到挂起时间超过RESUMABLE TIMEOUT,或者空间不足的错误被解决。 
 
这一篇简单介绍空间RESUMABLE的例子。 
 
 
 
第一次碰到这个特性是在一次安装9i数据库的过程中,在利用D</div>
                                </li>
                                <li><a href="/article/2523.htm"
                                       title="重构第一次写的线程池" target="_blank">重构第一次写的线程池</a>
                                    <span class="text-muted">dieslrae</span>
<a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B%E6%B1%A0+python/1.htm">线程池 python</a>
                                    <div>最近没有什么学习欲望,修改之前的线程池的计划一直搁置,这几天比较闲,还是做了一次重构,由之前的2个类拆分为现在的4个类. 
 
1、首先是工作线程类:TaskThread,此类为一个工作线程,用于完成一个工作任务,提供等待(wait),继续(proceed),绑定任务(bindTask)等方法 
 

#!/usr/bin/env python
# -*- coding:utf8 -*-

</div>
                                </li>
                                <li><a href="/article/2650.htm"
                                       title="C语言学习六指针" target="_blank">C语言学习六指针</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/c/1.htm">c</a>
                                    <div>初识指针,简单示例程序: 
/*
	指针就是地址,地址就是指针
	地址就是内存单元的编号
	指针变量是存放地址的变量
	指针和指针变量是两个不同的概念
	但是要注意: 通常我们叙述时会把指针变量简称为指针,实际它们含义并不一样
*/
# include <stdio.h>

int main(void)
{
	int * p;	// p是变量的名字, int * </div>
                                </li>
                                <li><a href="/article/2777.htm"
                                       title="yii2 beforeSave afterSave beforeDelete" target="_blank">yii2 beforeSave afterSave beforeDelete</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/delete/1.htm">delete</a>
                                    <div>public function afterSave($insert, $changedAttributes)
{
    parent::afterSave($insert, $changedAttributes);
    if($insert) {
        //这里是新增数据
    } else {
        //这里是更新数据
    }  
} 
 </div>
                                </li>
                                <li><a href="/article/2904.htm"
                                       title="timertask" target="_blank">timertask</a>
                                    <span class="text-muted">shuizhaosi888</span>
<a class="tag" taget="_blank" href="/search/timertask/1.htm">timertask</a>
                                    <div>java.util.Timer timer = new java.util.Timer(true); 
// true 说明这个timer以daemon方式运行(优先级低, 
// 程序结束timer也自动结束),注意,javax.swing 
// 包中也有一个Timer类,如果import中用到swing包, 
// 要注意名字的冲突。 

TimerTask task = new</div>
                                </li>
                                <li><a href="/article/3031.htm"
                                       title="Spring Security(13)——session管理" target="_blank">Spring Security(13)——session管理</a>
                                    <span class="text-muted">234390216</span>
<a class="tag" taget="_blank" href="/search/session/1.htm">session</a><a class="tag" taget="_blank" href="/search/Spring+Security/1.htm">Spring Security</a><a class="tag" taget="_blank" href="/search/%E6%94%BB%E5%87%BB%E4%BF%9D%E6%8A%A4/1.htm">攻击保护</a><a class="tag" taget="_blank" href="/search/%E8%B6%85%E6%97%B6/1.htm">超时</a>
                                    <div>session管理 
目录 
  
1.1     检测session超时 
1.2     concurrency-control 
1.3     session 固定攻击保护 
  
      </div>
                                </li>
                                <li><a href="/article/3158.htm"
                                       title="公司项目NODEJS实践0.3[ mongo / session ...]" target="_blank">公司项目NODEJS实践0.3[ mongo / session ...]</a>
                                    <span class="text-muted">逐行分析JS源代码</span>
<a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/session/1.htm">session</a><a class="tag" taget="_blank" href="/search/nodejs/1.htm">nodejs</a>
                                    <div>    
http://www.upopen.cn 
  
一、前言 
        书接上回,我们搭建了WEB服务端路由、模板等功能,完成了register 通过ajax与后端的通信,今天主要完成数据与mongodb的存取,实现注册 / 登录 /</div>
                                </li>
                                <li><a href="/article/3285.htm"
                                       title="pojo.vo.po.domain区别" target="_blank">pojo.vo.po.domain区别</a>
                                    <span class="text-muted">LiaoJuncai</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/VO/1.htm">VO</a><a class="tag" taget="_blank" href="/search/POJO/1.htm">POJO</a><a class="tag" taget="_blank" href="/search/javabean/1.htm">javabean</a><a class="tag" taget="_blank" href="/search/domain/1.htm">domain</a>
                                    <div>  POJO = "Plain Old Java Object",是MartinFowler等发明的一个术语,用来表示普通的Java对象,不是JavaBean, EntityBean 或者 SessionBean。POJO不但当任何特殊的角色,也不实现任何特殊的Java框架的接口如,EJB, JDBC等等。 
   
  即POJO是一个简单的普通的Java对象,它包含业务逻辑</div>
                                </li>
                                <li><a href="/article/3412.htm"
                                       title="Windows Error Code" target="_blank">Windows Error Code</a>
                                    <span class="text-muted">OhMyCC</span>
<a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a>
                                    <div>0 操作成功完成. 
1 功能错误. 
2 系统找不到指定的文件. 
3 系统找不到指定的路径. 
4 系统无法打开文件. 
5 拒绝访问. 
6 句柄无效. 
7 存储控制块被损坏. 
8 存储空间不足, 无法处理此命令. 
9 存储控制块地址无效. 
10 环境错误. 
11 试图加载格式错误的程序. 
12 访问码无效. 
13 数据无效. 
14 存储器不足, 无法完成此操作. 
15 系</div>
                                </li>
                                <li><a href="/article/3539.htm"
                                       title="在storm集群环境下发布Topology" target="_blank">在storm集群环境下发布Topology</a>
                                    <span class="text-muted">roadrunners</span>
<a class="tag" taget="_blank" href="/search/%E9%9B%86%E7%BE%A4/1.htm">集群</a><a class="tag" taget="_blank" href="/search/storm/1.htm">storm</a><a class="tag" taget="_blank" href="/search/topology/1.htm">topology</a><a class="tag" taget="_blank" href="/search/spout/1.htm">spout</a><a class="tag" taget="_blank" href="/search/bolt/1.htm">bolt</a>
                                    <div>storm的topology设计和开发就略过了。本章主要来说说如何在storm的集群环境中,通过storm的管理命令来发布和管理集群中的topology。 
  
1、打包 
打包插件是使用maven提供的maven-shade-plugin,详细见maven-shade-plugin。 
<plugin>
	<groupId>org.apache.maven.</div>
                                </li>
                                <li><a href="/article/3666.htm"
                                       title="为什么不允许代码里出现“魔数”" target="_blank">为什么不允许代码里出现“魔数”</a>
                                    <span class="text-muted">tomcat_oracle</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>  在一个新项目中,我最先做的事情之一,就是建立使用诸如Checkstyle和Findbugs之类工具的准则。目的是制定一些代码规范,以及避免通过静态代码分析就能够检测到的bug。     迟早会有人给出案例说这样太离谱了。其中的一个案例是Checkstyle的魔数检查。它会对任何没有定义常量就使用的数字字面量给出警告,除了-1、0、1和2。     很多开发者在这个检查方面都有问题,这可以从结果</div>
                                </li>
                                <li><a href="/article/3793.htm"
                                       title="zoj 3511 Cake Robbery(线段树)" target="_blank">zoj 3511 Cake Robbery(线段树)</a>
                                    <span class="text-muted">阿尔萨斯</span>
<a class="tag" taget="_blank" href="/search/%E7%BA%BF%E6%AE%B5%E6%A0%91/1.htm">线段树</a>
                                    <div> 题目链接:zoj 3511 Cake Robbery 
 题目大意:就是有一个N边形的蛋糕,切M刀,从中挑选一块边数最多的,保证没有两条边重叠。 
 解题思路:有多少个顶点即为有多少条边,所以直接按照切刀切掉点的个数排序,然后用线段树维护剩下的还有哪些点。 
#include <cstdio>
#include <cstring>
#include <vector&</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>