ES6(二十):ES2017中的async函数

前面的话


ES2017标准引入了async 函数,使得异步操作变得更加方便。本文将详细介绍async函数

概述

async 函数是Generator函数的语法糖

使用Generator函数,依次读取两个文件代码如下

var fs = require('fs');
var readFile = function (fileName) {
  return new Promise(function (resolve, reject) {
    fs.readFile(fileName, function(error, data) {      
      if (error) return reject(error);
      resolve(data);
    });
  });
};
var gen = function* () {
  var f1 = yield readFile('/etc/fstab');  
  var f2 = yield readFile('/etc/shells');
  console.log(f1.toString());
  console.log(f2.toString());
};

写成async函数,就是下面这样

var asyncReadFile = async function () {
  var f1 = await readFile('/etc/fstab');  
  var f2 = await readFile('/etc/shells');
  console.log(f1.toString());
  console.log(f2.toString());
};
  • async函数就是将 Generator 函数的星号(*)替换成async,将yield替换成await,仅此而已

  • async函数对 Generator 函数的改进,体现在以下四点

1、内置执行器

Generator 函数的执行必须靠执行器,所以才有了co模块,而async函数自带执行器。也就是说,async函数的执行,与普通函数一模一样,只要一行

var result = asyncReadFile();
  • 上面的代码调用了asyncReadFile函数,然后它就会自动执行,输出最后结果。这完全不像 Generator函数,需要调用next方法,或者用co模块,才能真正执行,得到最后结果

2、更好的语义

asyncawait,比起星号和yield,语义更清楚了。async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果

3、更广的适用性

co模块约定,yield命令后面只能是 Thunk 函数或 Promise对象,而async函数的await命令后面,可以是Promise 对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操作)

4、返回值是 Promise

async函数的返回值是 Promise 对象,这比Generator函数的返回值是Iterator 对象方便多了。可以用then方法指定下一步的操作。
进一步说,async函数完全可以看作多个异步操作,包装成的一个Promise 对象,而await命令就是内部then命令的语法糖

基本用法

async函数返回一个Promise对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句

async function getStockPriceByName(name) {
  var symbol = await getStockSymbol(name);
  var stockPrice = await getStockPrice(symbol);
  return stockPrice;
}
getStockPriceByName('goog').then(function (result) {
  console.log(result);
});
  • 上面代码是一个获取股票报价的函数,函数前面的async关键字,表明该函数内部有异步操作。调用该函数时,会立即返回一个Promise对象

  • 下面是另一个例子,指定多少毫秒后输出一个值

function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}
async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value);
}
asyncPrint('hello world', 50);
  • 上面代码指定50毫秒以后,输出hello world

  • 由于async函数返回的是Promise对象,可以作为await命令的参数。所以,上面例子也可写成下面形式

async function timeout(ms) {
  await new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}
async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value);
}
asyncPrint('hello world', 50);
  • async 函数有多种使用形式
// 函数声明
async function foo() {}
// 函数表达式
const foo = async function () {};
// 对象的方法
let obj = { 
  async foo() {} 
};
obj.foo().then(...)
// Class 的方法
class Storage {
  constructor() {    
    this.cachePromise = caches.open('avatars');
  }
  async getAvatar(name) {
    const cache = await this.cachePromise;    
    return cache.match(`/avatars/${name}.jpg`);
  }
}
const storage = new Storage();
storage.getAvatar('jake').then(…);
// 箭头函数
const foo = async () => {};

语法

【返回 Promise 对象】

async函数返回一个 Promise对象

async函数内部return语句返回的值,会成为then方法回调函数的参数

async function f() {
  return 'hello world';
}f().then(v => console.log(v))// "hello world"
  • 上面代码中,函数f内部return命令返回的值,会被then方法回调函数接收到

  • async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到

async function f() {
  throw new Error('出错了');
}
f().then(
  v => console.log(v),
  e => console.log(e)
)// Error: 出错了

【Promise 对象的状态变化】

async函数返回的 Promise对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数

async function getTitle(url) {
  let response = await fetch(url);
  let html = await response.text();
  return html.match(/([\s\S]+)<\/title>/i)[1];
}
getTitle('https://tc39.github.io/ecma262/').then(console.log)
// "ECMAScript 2018 Language Specification"
</code></pre> 
 <ul> 
  <li>上面代码中,函数<code>getTitle</code>内部有三个操作:抓取网页、取出文本、匹配页面标题。只有这三个操作全部完成,才会执行<code>then</code>方法里面的<code>console.log</code> </li> 
 </ul> 
 <p><strong>【<code>await</code>命令】</strong></p> 
 <blockquote> 
  <p>正常情况下,<code>await</code>命令后面是一个 <code>Promise</code> 对象。如果不是,会被转成一个立即<code>resolve</code>的 <code>Promise</code>对象</p> 
 </blockquote> 
 <pre><code>async function f() {
  return await 123;
}
f().then(v => console.log(v)) // 123
</code></pre> 
 <ul> 
  <li><p>上面代码中,<code>await</code>命令的参数是数值<code>123</code>,它被转成 <code>Promise</code>对象,并立即<code>resolve</code>。</p></li> 
  <li><p><code>await</code>命令后面的<code>Promise</code>对象如果变为<code>reject</code>状态,则<code>reject</code>的参数会被<code>catch</code>方法的回调函数接收到</p></li> 
 </ul> 
 <pre><code>async function f() {
  await Promise.reject('出错了');
}
f().then(v => console.log(v)).catch(e => console.log(e))// 出错了
</code></pre> 
 <ul> 
  <li>上面代码中,<code>await</code>语句前面没有<code>return</code>,但是<code>reject</code>方法的参数依然传入了<code>catch</code>方法的回调函数。这里如果在<code>await</code>前面加上<code>return</code>,效果是一样的<br> 只要一个<code>await</code>语句后面的 Promise 变为<code>reject</code>,那么整个<code>async</code>函数都会中断执行</li> 
 </ul> 
 <pre><code>async function f() { 
  await Promise.reject('出错了');
  await Promise.resolve('hello world'); // 不会执行
}
</code></pre> 
 <ul> 
  <li>上面代码中,第二个<code>await</code>语句是不会执行的,因为第一个<code>await</code>语句状态变成了<code>reject</code>。有时,希望即使前一个异步操作失败,也不要中断后面的异步操作。这时可以将第一个<code>await</code>放在<code>try...catch</code>结构里面,这样不管这个异步操作是否成功,第二个<code>await</code>都会执行</li> 
 </ul> 
 <pre><code>async function f() {
  try { 
    await Promise.reject('出错了');
  } catch(e) {

  }  
  return await Promise.resolve('hello world');
}
f().then(v => console.log(v))// hello world
</code></pre> 
 <ul> 
  <li>另一种方法是<code>await</code>后面的 <code>Promise</code> 对象再跟一个<code>catch</code>方法,处理前面可能出现的错误</li> 
 </ul> 
 <pre><code>async function f() {
  await Promise.reject('出错了')
  .catch(e => console.log(e));
  return await Promise.resolve('hello world');
}
f().then(v => console.log(v))// 出错了// hello world
</code></pre> 
 <p><strong>【错误处理】</strong></p> 
 <blockquote> 
  <p>如果<code>await</code>后面的异步操作出错,那么等同于<code>async</code>函数返回的 <code>Promise</code> 对象被<code>reject</code></p> 
 </blockquote> 
 <pre><code>async function f() {
  await new Promise(function (resolve, reject) {
    throw new Error('出错了');
  });
}
f().then(v => console.log(v)).catch(e => console.log(e))// Error:出错了
</code></pre> 
 <ul> 
  <li>上面代码中,<code>async</code>函数<code>f</code>执行后,<code>await</code>后面的<code>Promise</code>对象会抛出一个错误对象,导致<code>catch</code>方法的回调函数被调用,它的参数就是抛出的错误对象<br> 防止出错的方法,也是将其放在<code>try...catch</code>代码块之中</li> 
 </ul> 
 <pre><code>async function f() {try {
  await new Promise(function (resolve, reject) {
    throw new Error('出错了');
  });
} catch(e) {

}  
return await('hello world');
}
</code></pre> 
 <ul> 
  <li>如果有多个<code>await</code>命令,可以统一放在<code>try...catch</code>结构中</li> 
 </ul> 
 <pre><code>async function main() {
  try {var val1 = await firstStep();
  var val2 = await secondStep(val1);
  var val3 = await thirdStep(val1, val2);
  console.log('Final: ', val3);
}  catch (err) {
  console.error(err);
  }
}
</code></pre> 
 <ul> 
  <li>下面的例子使用<code>try...catch</code>结构,实现多次重复尝试</li> 
 </ul> 
 <pre><code>const superagent = require('superagent');
const NUM_RETRIES = 3;
async function test() {
  let i;
  for (i = 0; i < NUM_RETRIES; ++i) {    
    try {
      await superagent.get('http://google.com/this-throws-an-error');      
      break;
    } catch(err) {}
  }
  console.log(i); // 3
}
test();
</code></pre> 
 <ul> 
  <li>上面代码中,如果<code>await</code>操作成功,就会使用<code>break</code>语句退出循环;如果失败,会被<code>catch</code>语句捕捉,然后进入下一轮循环</li> 
 </ul> 
 <p><strong>【注意事项】</strong></p> 
 <p>1、<code>await</code>命令后面的<code>Promise</code>对象,运行结果可能是<code>rejected</code>,所以最好把<code>await</code>命令放在<code>try...catch</code>代码块中</p> 
 <pre><code>async function myFunction() {try {
  await somethingThatReturnsAPromise();
  } catch (err) {
    console.log(err);
  }
}
// 另一种写法
async function myFunction() {
  await somethingThatReturnsAPromise()
  .catch(function (err) {
    console.log(err);
  });
}
</code></pre> 
 <p>2、多个<code>await</code>命令后面的异步操作,如果不存在继发关系,最好让它们同时触发</p> 
 <pre><code>let foo = await getFoo();
let bar = await getBar();
</code></pre> 
 <ul> 
  <li>上面代码中,<code>getFoo</code>和<code>getBar</code>是两个独立的异步操作(即互不依赖),被写成继发关系。这样比较耗时,因为只有<code>getFoo</code>完成以后,才会执行<code>getBar</code>,完全可以让它们同时触发</li> 
 </ul> 
 <pre><code>// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);
// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;
</code></pre> 
 <ul> 
  <li>上面两种写法,<code>getFoo</code>和<code>getBar</code>都是同时触发,这样就会缩短程序的执行时间</li> 
 </ul> 
 <p>3、<code>await</code>命令只能用在<code>async</code>函数之中,如果用在普通函数,就会报错</p> 
 <pre><code>async function dbFuc(db) {
  let docs = [{}, {}, {}];// 报错
  docs.forEach(function (doc) {
    await db.post(doc);
  });
}
</code></pre> 
 <ul> 
  <li>上面代码会报错,因为<code>await</code>用在普通函数之中了。但是,如果将<code>forEach</code>方法的参数改成<code>async</code>函数,也有问题</li> 
 </ul> 
 <pre><code>function dbFuc(db) { 
  //这里不需要 async
  let docs = [{}, {}, {}];// 可能得到错误结果
  docs.forEach(async function (doc) {
    await db.post(doc);
  });
}
</code></pre> 
 <ul> 
  <li>上面代码可能不会正常工作,原因是这时三个<code>db.post</code>操作将是并发执行,也就是同时执行,而不是继发执行。正确的写法是采用<code>for</code>循环</li> 
 </ul> 
 <pre><code>async function dbFuc(db) {
  let docs = [{}, {}, {}];for (let doc of docs) {
    await db.post(doc);
  }
}
</code></pre> 
 <ul> 
  <li>如果确实希望多个请求并发执行,可以使用<code>Promise.all</code>方法。当三个请求都会<code>resolved</code>时,下面两种写法效果相同</li> 
 </ul> 
 <pre><code>async function dbFuc(db) {
  let docs = [{}, {}, {}];
  let promises = docs.map((doc) => db.post(doc));
  let results = await Promise.all(promises);
  console.log(results);
}
// 或者使用下面的写法
async function dbFuc(db) {
  let docs = [{}, {}, {}];
  let promises = docs.map((doc) => db.post(doc));
  let results = [];for (let promise of promises) {
    results.push(await promise);
  }
  console.log(results);
}
</code></pre> 
 <h3>实现原理</h3> 
 <blockquote> 
  <p><code>async</code>函数的实现原理,就是将 <code>Generator</code>函数和自动执行器,包装在一个函数里</p> 
 </blockquote> 
 <pre><code>async function fn(args) {
  // ...
}
// 等同于
function fn(args) {
  return spawn(function* () {
    // ... 
  });
}
</code></pre> 
 <ul> 
  <li>所有的<code>async</code>函数都可以写成上面的第二种形式,其中的<code>spawn</code>函数就是自动执行器。<br> 下面给出<code>spawn</code>函数的实现,基本就是前文自动执行器的翻版</li> 
 </ul> 
 <pre><code>function spawn(genF) {
  return new Promise(function(resolve, reject) {    
    var gen = genF();
    function step(nextF) {
      try {
        var next = nextF();
      } catch(e) {        
        return reject(e);
      }
      if(next.done) {        
        return resolve(next.value);
      }
      Promise.resolve(next.value).then(function(v) {
        step(function() { 
          return gen.next(v); 
        });
      }, function(e) {
        step(function() { 
          return gen.throw(e); 
        });
      });
    }
    step(function() { 
      return gen.next(undefined); 
    });
  });
}
</code></pre> 
 <h3>异步比较</h3> 
 <blockquote> 
  <p>通过一个例子,来看 <code>async</code>函数与 <code>Promise</code>、<code>Generator</code> 函数的比较。</p> 
 </blockquote> 
 <blockquote> 
  <p>假定某个 <code>DOM</code>元素上面,部署了一系列的动画,前一个动画结束,才能开始后一个。如果当中有一个动画出错,就不再往下执行,返回上一个成功执行的动画的返回值</p> 
 </blockquote> 
 <p><strong>【Promise】</strong></p> 
 <blockquote> 
  <p>首先是<code>Promise</code> 的写法</p> 
 </blockquote> 
 <pre><code>function chainAnimationsPromise(elem, animations) {
  // 变量ret用来保存上一个动画的返回值
  var ret = null;  
  // 新建一个空的Promise
  var p = Promise.resolve();
  // 使用then方法,添加所有动画
  for(var anim of animations) {
    p = p.then(function(val) {
      ret = val;return anim(elem);
    });
  }
  // 返回一个部署了错误捕捉机制的Promise
  return p.catch(function(e) {    
    /* 忽略错误,继续执行 */ 
  }).then(function() {    
    return ret;
  });
}
</code></pre> 
 <ul> 
  <li>虽然 <code>Promise</code> 的写法比回调函数的写法大大改进,但是一眼看上去,代码完全都是 <code>Promise</code> 的 <code>API</code>(<code>then</code>、<code>catch</code>等等),操作本身的语义反而不容易看出来</li> 
 </ul> 
 <p><strong>【Generator】</strong></p> 
 <blockquote> 
  <p>接着是 <code>Generator</code> 函数的写法</p> 
 </blockquote> 
 <pre><code>function chainAnimationsGenerator(elem, animations) {
  return spawn(function*() {    
    var ret = null;    
    try {
      for(var anim of animations) {
        ret = yield anim(elem);
      }
    } catch(e) {      
      /* 忽略错误,继续执行 */ 
    }
    return ret;
  });
}
</code></pre> 
 <ul> 
  <li>上面代码使用 <code>Generator</code>函数遍历了每个动画,语义比<code>Promise</code>写法更清晰,用户定义的操作全部都出现在<code>spawn</code>函数的内部。这个写法的问题在于,必须有一个任务运行器,自动执行<code>Generator</code> 函数,上面代码的<code>spawn</code>函数就是自动执行器,它返回一个 <code>Promise</code>对象,而且必须保证<code>yield</code>语句后面的表达式,必须返回一个 <code>Promise</code> </li> 
 </ul> 
 <p><strong>【async】</strong></p> 
 <blockquote> 
  <p>最后是<code>async</code> 函数的写法</p> 
 </blockquote> 
 <pre><code>async function chainAnimationsAsync(elem, animations) {
  var ret = null;  try {
    for(var anim of animations) {
      ret = await anim(elem);
    }
  } catch(e) {    
    /* 忽略错误,继续执行 */ 
  }
  return ret;
}
</code></pre> 
 <ul> 
  <li>可以看到<code>Async</code>函数的实现最简洁,最符合语义,几乎没有语义不相关的代码。它将<code>Generator</code>写法中的自动执行器,改在语言层面提供,不暴露给用户,因此代码量最少。如果使用<code>Generator</code>写法,自动执行器需要用户自己提供</li> 
 </ul> 
 <h3>实例</h3> 
 <blockquote> 
  <p>实际开发中,经常遇到一组异步操作,需要按照顺序完成。比如,依次远程读取一组 <code>URL</code>,然后按照读取的顺序输出结果</p> 
 </blockquote> 
 <p><strong>【Promise】</strong></p> 
 <blockquote> 
  <p><code>Promise</code>的写法如下</p> 
 </blockquote> 
 <pre><code>function logInOrder(urls) {
  // 远程读取所有URL
  const textPromises = urls.map(url => {
    return fetch(url).then(response => response.text());
  });
  // 按次序输出
  textPromises.reduce((chain, textPromise) => {
    return chain.then(() => textPromise)
    .then(text => console.log(text));
  }, Promise.resolve());
}
</code></pre> 
 <ul> 
  <li>上面代码使用<code>fetch</code>方法,同时远程读取一组 <code>URL</code>。每个<code>fetch</code>操作都返回一个 Promise 对象,放入<code>textPromises</code>数组。然后,<code>reduce</code>方法依次处理每个<code>Promise</code>对象,然后使用<code>then</code>,将所有 <code>Promise</code> 对象连起来,因此就可以依次输出结果</li> 
 </ul> 
 <p><strong>【async】</strong></p> 
 <blockquote> 
  <p>上面这种写法不太直观,可读性比较差。下面是 <code>async</code>函数实现</p> 
 </blockquote> 
 <pre><code>async function logInOrder(urls) {
  for (const url of urls) {
    const response = await fetch(url);
    console.log(await response.text());
  }
}
</code></pre> 
 <ul> 
  <li>上面代码确实大大简化,问题是所有远程操作都是继发。只有前一个<code>URL</code>返回结果,才会去读取下一个<code>URL</code>,这样做效率很差,非常浪费时间。我们需要的是并发发出远程请求</li> 
 </ul> 
 <pre><code>async function logInOrder(urls) {
  // 并发读取远程URL
  const textPromises = urls.map(async url => {
    const response = await fetch(url);
    return response.text();
  });
  // 按次序输出
  for (const textPromise of textPromises) {
    console.log(await textPromise);
  }
}
</code></pre> 
 <ul> 
  <li>上面代码中,虽然<code>map</code>方法的参数是<code>async</code>函数,但它是并发执行的,因为只有<code>async</code>函数内部是继发执行,外部不受影响。后面的<code>for..of</code>循环内部使用了<code>await</code>,因此实现了按顺序输出</li> 
 </ul> 
 <h2>其他章节</h2> 
 <ul> 
  <li><strong>ES6-数字扩展</strong></li> 
  <li><strong>ES6-字符串拓展</strong></li> 
  <li><strong>ES6-模板字面量</strong></li> 
  <li><strong>ES6-关于Unicode的相关扩展</strong></li> 
  <li><strong>ES6-正则表达式扩展</strong></li> 
  <li><strong>ES6-函数扩展</strong></li> 
  <li><strong>ES6-对象扩展</strong></li> 
  <li><strong>ES6-Symbol</strong></li> 
  <li><strong>ES6-Set和Map集合</strong></li> 
  <li><strong>ES6-数组扩展</strong></li> 
  <li><strong>ES6-定型数组</strong></li> 
  <li><strong>ES6-块级作用域</strong></li> 
  <li><strong>ES6-解构赋值</strong></li> 
  <li><strong>ES6-类</strong></li> 
  <li><strong>ES6-代理(Proxy)和反射(Reflection)</strong></li> 
  <li><strong>ES6-ES6中的模块</strong></li> 
  <li><strong>ES6-ES2017中的修饰器Decorator</strong></li> 
  <li><strong>ES6-迭代器(Iterator)和生成器(Generator)</strong></li> 
  <li><strong>ES6-Promise和异步编程</strong></li> 
  <li><strong>ES6-ES2017中的async</strong></li> 
 </ul> 
</article>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1277076865848197120"></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">你可能感兴趣的:(ES6(二十):ES2017中的async函数)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1940476525480570880.htm"
                           title="设计模式精讲 Day 20:状态模式(State Pattern)" target="_blank">设计模式精讲 Day 20:状态模式(State Pattern)</a>
                        <span class="text-muted">在未来等你</span>
<a class="tag" taget="_blank" href="/search/23%E7%A7%8D%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E7%B2%BE%E8%AE%B2/1.htm">23种设计模式精讲</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F/1.htm">状态模式</a><a class="tag" taget="_blank" href="/search/Java%E5%BC%80%E5%8F%91/1.htm">Java开发</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%AE%BE%E8%AE%A1/1.htm">面向对象设计</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84/1.htm">软件架构</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%AE%9E%E6%88%98/1.htm">设计模式实战</a><a class="tag" taget="_blank" href="/search/Java%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91/1.htm">Java应用开发</a>
                        <div>【设计模式精讲Day20】状态模式(StatePattern)文章标签设计模式,状态模式,Java开发,面向对象设计,软件架构,设计模式实战,Java应用开发文章简述状态模式是行为型设计模式中的重要一员,用于管理对象在不同状态下的行为变化。在实际项目中,状态模式能够有效解耦状态逻辑,提升系统的可维护性和扩展性。本文作为“设计模式精讲”系列的第20天,深入讲解了状态模式的核心思想、实现方式和实际应用</div>
                    </li>
                    <li><a href="/article/1940475265159327744.htm"
                           title="基于MATLAB平台设计并实现自适应噪声抵消器(Adaptive Noise Canceller, ANC)" target="_blank">基于MATLAB平台设计并实现自适应噪声抵消器(Adaptive Noise Canceller, ANC)</a>
                        <span class="text-muted">AI Dog</span>
<a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E6%8E%A7%E5%88%B6/1.htm">自动控制</a><a class="tag" taget="_blank" href="/search/matlab/1.htm">matlab</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E9%80%82%E5%BA%94%E5%99%AA%E5%A3%B0%E6%8A%B5%E6%B6%88%E5%99%A8/1.htm">自适应噪声抵消器</a><a class="tag" taget="_blank" href="/search/ANC/1.htm">ANC</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E5%8F%B7%E5%8E%BB%E5%99%AA/1.htm">信号去噪</a>
                        <div>本课题旨在基于MATLAB平台设计并实现自适应噪声抵消器(AdaptiveNoiseCanceller,ANC),以有效去除信号中的背景噪声,提升语音、医疗或通信系统中的信噪比。系统采用自适应滤波算法,如最小均方误差(LMS)或归一化LMS(NLMS)算法,通过参考噪声信号估计并抵消主通道信号中的噪声成分,实现动态降噪。研究内容包括信号采集与仿真建模、自适应滤波器结构设计、算法参数调整及降噪性能评</div>
                    </li>
                    <li><a href="/article/1940475137061089280.htm"
                           title="22-4 SQL注入攻击 - post 基于报错的注入" target="_blank">22-4 SQL注入攻击 - post 基于报错的注入</a>
                        <span class="text-muted">技术探索</span>
<a class="tag" taget="_blank" href="/search/Web%E5%AE%89%E5%85%A8%E6%94%BB%E9%98%B2%E5%85%A8%E8%A7%A3%E6%9E%90/1.htm">Web安全攻防全解析</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>1、post基于错误单引号注入回显分析注入点位置已经发生变化。在浏览器中,无法直接查看和修改注入点。不过,可以通过使用相应的插件来完成修改任务。修改方法:(一般是网站前端做了限制,我们才需要用到bp绕开限制)要修改Less11注入点的请求,可以使用BurpSuite工具来捕获请求包,并使用其中的"Repeater"功能来进行修改。具体操作步骤如下:首先打开BurpSuite并设置代理,然后在浏览器</div>
                    </li>
                    <li><a href="/article/1940475137858007040.htm"
                           title="Oracle查询超时问题,聊聊思路!" target="_blank">Oracle查询超时问题,聊聊思路!</a>
                        <span class="text-muted">bug菌¹</span>
<a class="tag" taget="_blank" href="/search/%E5%85%A8%E6%A0%88Bug%E8%B0%83%E4%BC%98%28%E5%AE%9E%E6%88%98%E7%89%88%29/1.htm">全栈Bug调优(实战版)</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/CSDN%E9%97%AE%E7%AD%94%E8%A7%A3%E6%83%91%28%E5%85%A8%E6%A0%88%E7%89%88%29/1.htm">CSDN问答解惑(全栈版)</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/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!问题描述  Oracle在查询超过6秒的sql都会报Socketreadtimedout。我也根据网上的一些资料,在oracleurl后拼接了oracle.net.CONNECT_T</div>
                    </li>
                    <li><a href="/article/1940473389823094784.htm"
                           title="鸿蒙开发必备技能:六种数据存储方式全解析+实战代码" target="_blank">鸿蒙开发必备技能:六种数据存储方式全解析+实战代码</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/harmonyos/1.htm">harmonyos</a>
                        <div>摘要在当前多设备互联的时代,移动端应用不再局限于单一设备,而是需要在多个终端上保持状态一致、数据同步与持久管理。鸿蒙系统提供了多种数据存储机制,从轻量级状态存储到复杂的数据持久化方案,满足不同场景下的需求。本文将结合实战案例,深入讲解鸿蒙系统中的六大数据存储方式,并配有可运行的代码,帮助开发者快速掌握数据管理方法。引言随着鸿蒙系统的不断发展,越来越多的开发者开始构建面向多设备、多用户、多场景的智能</div>
                    </li>
                    <li><a href="/article/1940473391131717632.htm"
                           title="Golang基础笔记八之函数" target="_blank">Golang基础笔记八之函数</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AFgo%E5%87%BD%E6%95%B0%E9%97%AD%E5%8C%85/1.htm">后端go函数闭包</a>
                        <div>本文首发于公众号:Hunter后端原文链接:Golang基础笔记八之函数本篇笔记介绍Golang里函数相关的内容,以下是本篇笔记目录:函数的定义语法函数返回值可变参数函数匿名函数闭包1、函数的定义语法函数的定义格式如下:func函数名(参数列表)(返回值列表){函数体}比如下面是一个两数相加返回其和的函数:funcadd(a,bint)int{  returna+b}调用的话,直接传参调用即可:s</div>
                    </li>
                    <li><a href="/article/1940473119558922240.htm"
                           title="【如何衡量相机标定结果的精度】相机标定评价函数" target="_blank">【如何衡量相机标定结果的精度】相机标定评价函数</a>
                        <span class="text-muted">王尼莫啊</span>
<a class="tag" taget="_blank" href="/search/%E7%9B%AE%E6%A0%87%E8%A7%A3%E7%AE%97/1.htm">目标解算</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%A0%81%E7%9B%B8%E6%9C%BA/1.htm">数码相机</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/1.htm">计算机视觉</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E8%A7%89%E6%A3%80%E6%B5%8B/1.htm">视觉检测</a>
                        <div>相关博客:【鱼眼+普通相机】相机标定【opencv】图像畸变校正一、简介常用的衡量相机标定结果精度的评价标准:畸变矫正效果:标定过程中会估计畸变系数,畸变矫正的效果可以通过比较矫正前后的图像来评估。如果畸变得到有效矫正,说明标定过程较为成功。重投影误差(ReprojectionError):这是最常用的评估相机标定精度的指标。它指的是在标定图像中检测到的特征点与通过相机参数投影得到的相应世界坐标点</div>
                    </li>
                    <li><a href="/article/1940472612694061056.htm"
                           title="教育技术学读计算机论文的提示词" target="_blank">教育技术学读计算机论文的提示词</a>
                        <span class="text-muted">东方-教育技术博主</span>
<a class="tag" taget="_blank" href="/search/%E5%AD%A6%E6%9C%AF%E5%AD%A6%E4%B9%A0%E7%9B%B8%E5%85%B3/1.htm">学术学习相关</a><a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a>
                        <div>角色:你是一位经验丰富的计算机专业教授,擅长用通俗易懂的语言向初学者解释复杂概念。我现在正在学习阅读计算机科学领域的算法论文,但我的基础比较薄弱(了解编程基础如变量、循环、函数,了解一点数据结构和算法概念如数组、链表、排序,但对高级术语和数学证明不熟悉)。同时又是一个教育技术学教授。任务:请帮我解释以下论文内容中我不理解的部分。如果遇到初学者可能不懂的地方,我需要你用最清晰、最简洁、最易懂的方式解</div>
                    </li>
                    <li><a href="/article/1940471598377136128.htm"
                           title="java依赖注入方法" target="_blank">java依赖注入方法</a>
                        <span class="text-muted">hqxstudying</span>
<a class="tag" taget="_blank" href="/search/log4j/1.htm">log4j</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/ioc/1.htm">ioc</a><a class="tag" taget="_blank" href="/search/%E4%BE%9D%E8%B5%96/1.htm">依赖</a>
                        <div>依赖注入主要有以下几种方式,每种方式各有特点,适用于不同场景:构造函数注入方式:通过类的构造函数将依赖对象传入。示例:publicclassUserService{privatefinalUserRepositoryuserRepository;publicUserService(UserRepositoryuserRepository){this.userRepository=userRepos</div>
                    </li>
                    <li><a href="/article/1940471219807645696.htm"
                           title="Vue3.3 + TypeScript ,自主打造媲美 ElementPlus 的组件库之学习笔记" target="_blank">Vue3.3 + TypeScript ,自主打造媲美 ElementPlus 的组件库之学习笔记</a>
                        <span class="text-muted">怪我冷i</span>
<a class="tag" taget="_blank" href="/search/%E5%A4%A7%E5%89%8D%E7%AB%AF/1.htm">大前端</a><a class="tag" taget="_blank" href="/search/typescript/1.htm">typescript</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>Vue3.3+TS4,自主打造媲美ElementPlus的组件库第1章课程介绍1-1课程导学1-2代码库使用注意事项1-3项目演示地址:http://element.vikingship.xyz/第2章Typescript基础知识2-1什么是Typescript为什么要学习它2-2安装Typescript2-3原始数据类型和Any类型2-4数组和元组2-5Interface-接口初探2-6函数2-</div>
                    </li>
                    <li><a href="/article/1940470589093376000.htm"
                           title="IT 行业深度洞察:从技术革命到产业重构的全景图谱" target="_blank">IT 行业深度洞察:从技术革命到产业重构的全景图谱</a>
                        <span class="text-muted">XQR.小白</span>
<a class="tag" taget="_blank" href="/search/%E9%87%8D%E6%9E%84/1.htm">重构</a>
                        <div>摘要本文系统梳理IT行业的发展脉络,深入剖析云计算、人工智能、大数据、物联网等核心技术的演进逻辑与协同效应,揭示IT产业在数字化转型浪潮中的生态重构与价值创造。通过典型案例分析与数据支撑,探讨行业面临的技术挑战、伦理困境与全球化竞争格局,展望IT技术如何持续驱动社会变革与产业升级。全文结合2025年最新技术动态与市场趋势,为从业者、投资者与研究者提供兼具理论深度与实践指导的行业参考。目录摘要一、I</div>
                    </li>
                    <li><a href="/article/1940470083159650304.htm"
                           title="深度学习流体力学【干货】" target="_blank">深度学习流体力学【干货】</a>
                        <span class="text-muted">人工智能交叉前沿技术,</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a>
                        <div>深度学习作为一种新兴的机器学习技术,为流体科学的研究提供了新的思路和方法。通过对大量数据的学习和分析,深度学习模型可以自动提取特征和模式,为流体科学中的复杂问题提供解决方案。然而,深度学习在流体科学中的应用还面临一些挑战,需要进一步研究和探索。未来,深度学习与传统流体力学方法的结合将成为流体科学研究的重要方向,多模态数据的融合、模型的可解释性、实时预测和控制等将是深度学习在流体科学中发展的重点。相</div>
                    </li>
                    <li><a href="/article/1940467686031028224.htm"
                           title="python基础知识(二)" target="_blank">python基础知识(二)</a>
                        <span class="text-muted"></span>

                        <div>目录1.list和tuple1.1.list1.2.tuple2.dict和set2.1.dict2.2.set3.条件3.1.if3.2.if...else3.3.语法糖4.循环4.1.for...in4.2.while1.list和tuple1.1.listPython内置的一种数据类型是列表:list。list是一种有序的集合,可以添加和删除其中的元素。例如:>>>names=['liyan</div>
                    </li>
                    <li><a href="/article/1940467054712778752.htm"
                           title="【Linux】环境变量——干货讲解" target="_blank">【Linux】环境变量——干货讲解</a>
                        <span class="text-muted">代码程序猿RIP</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、环境变量核心概念1.什么是环境变量?2.环境变量的存储结构3.常见环境变量及作用二、环境变量管理命令1.查看环境变量2.设置环境变量3.删除环境变量4.变量操作技巧三、环境变量在编程中的应用1.C语言获取环境变量的三种方式方法1:main函数参数方法2:extern声明environ方法3:getenv获取特定变量2.环境</div>
                    </li>
                    <li><a href="/article/1940466299192799232.htm"
                           title="python键盘输入转换为列表_Python键盘输入转换为列表的实例" target="_blank">python键盘输入转换为列表_Python键盘输入转换为列表的实例</a>
                        <span class="text-muted">云云众生w</span>
<a class="tag" taget="_blank" href="/search/python%E9%94%AE%E7%9B%98%E8%BE%93%E5%85%A5%E8%BD%AC%E6%8D%A2%E4%B8%BA%E5%88%97%E8%A1%A8/1.htm">python键盘输入转换为列表</a>
                        <div>Python键盘输入转换为列表的实例发布时间:2020-08-1912:58:38来源:脚本之家阅读:92作者:清泉影月Python输入字符串转列表是为了方便后续处理,这种操作在考试的时候比较多见。1.在Python3.0以后,键盘输入使用input函数eg1.>>>x=input>>>123123在命令行没有任何显示,输入123后直接赋值给x,并打印。eg2.>>>x=input("请输入...</div>
                    </li>
                    <li><a href="/article/1940466047052214272.htm"
                           title="Python中的语法糖介绍" target="_blank">Python中的语法糖介绍</a>
                        <span class="text-muted">硅星纯牛码</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>
                        <div>Python中的语法糖介绍1.魔法方法(magicmethods)基础魔法方法属性相关的魔法方法2.装饰器(decorators)内置装饰器@property:让方法变为虚拟属性@classmenthod:定义类方法@staticmethod:定义静态方法functools中的装饰器functoolswraps:保留元数据functoolslru_cache:缓存计算结果3.推导式(compreh</div>
                    </li>
                    <li><a href="/article/1940464028375642112.htm"
                           title="Swift concurrency 10 — AsyncStream 和 AsyncThrowingStream:用异步流优雅处理事件" target="_blank">Swift concurrency 10 — AsyncStream 和 AsyncThrowingStream:用异步流优雅处理事件</a>
                        <span class="text-muted">技术拾光</span>
<a class="tag" taget="_blank" href="/search/Swift/1.htm">Swift</a><a class="tag" taget="_blank" href="/search/Concurrency/1.htm">Concurrency</a><a class="tag" taget="_blank" href="/search/swift/1.htm">swift</a><a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/AsyncStream/1.htm">AsyncStream</a>
                        <div>SwiftConcurrency带来了现代化的异步编程体验。在处理异步事件流时,AsyncStream和AsyncThrowingStream提供了优雅的方式来消费和控制异步值序列。本文将全面讲解这两个API的用途、用法、底层机制和实战场景。什么是AsyncStream与AsyncThrowingStream?类型描述AsyncStream产生异步值序列,不支持抛出错误AsyncThrowingS</div>
                    </li>
                    <li><a href="/article/1940463649009233920.htm"
                           title="Swift中常用的关键字" target="_blank">Swift中常用的关键字</a>
                        <span class="text-muted">~废弃回忆 �༄</span>
<a class="tag" taget="_blank" href="/search/swift/1.htm">swift</a><a class="tag" taget="_blank" href="/search/swift/1.htm">swift</a><a class="tag" taget="_blank" href="/search/Swift%E4%B8%AD%E5%B8%B8%E7%94%A8%E7%9A%84%E5%85%B3%E9%94%AE%E5%AD%97/1.htm">Swift中常用的关键字</a>
                        <div>1.@autoclosure允许你将一个表达式自动包装成闭包,从而延迟表达式的求值.在传参的过程中他可以将函数变成字符串类型.//定义一个接受自动闭包的函数funcmeasurePerformance(_task:@autoclosure()->Void){letstartTime=CFAbsoluteTimeGetCurrent()task()letendTime=CFAbsoluteTimeG</div>
                    </li>
                    <li><a href="/article/1940463650296885248.htm"
                           title="Swift - 基础面试题" target="_blank">Swift - 基础面试题</a>
                        <span class="text-muted">赑屃王者</span>
<a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">面试题</a><a class="tag" taget="_blank" href="/search/swift/1.htm">swift</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a>
                        <div>面试题目录一、类和结构体的区别是什么二、写时拷贝机制三、模式匹配四、协议五、泛型六、运算符、下标、字面量协议、尾随闭包七、Optional、变量常量、类型检查、扩展八、函数式编程九、响应式编程十、swift和OC的区别?一、类和结构体的区别是什么类是引用类型,结构体是值类型,拷贝赋值时,结构体是值拷贝,对象赋值时指针拷贝。结构体保存在栈区,类对象保存在堆区,类对象指针一般在栈区,指向堆区的对象。结</div>
                    </li>
                    <li><a href="/article/1940463269579911168.htm"
                           title="DAY 40 训练和测试的规范写法" target="_blank">DAY 40 训练和测试的规范写法</a>
                        <span class="text-muted">acstdm</span>
<a class="tag" taget="_blank" href="/search/python%E6%89%93%E5%8D%A160%E5%A4%A9/1.htm">python打卡60天</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a>
                        <div>目录一、单通道图片的规范写法图像任务中的张量形状NLP任务中的张量形状1.Flatten操作2.view/reshape操作总结二、彩色图片的规范写法知识点回顾:彩色和灰度图片测试和训练的规范写法:封装在函数中展平操作:除第一个维度batchsize外全部展平dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropout昨天我们介绍了图像数据的格式以及模型定义的过程,发现和之前</div>
                    </li>
                    <li><a href="/article/1940458482687864832.htm"
                           title="【QT字符串】QString相关的接口" target="_blank">【QT字符串】QString相关的接口</a>
                        <span class="text-muted">墨月白</span>
<a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>QString的相关函数1.把十进制的数字转换成十进制字符串QDateTimecurrentDateTime=QDateTime::currentDateTime();ui->yearLE->setText(QString::number(currentDateTime.date().year()));2.uint8_t转换成Qstring的十六进制字符串,限定1个字节,怎么转QString("%</div>
                    </li>
                    <li><a href="/article/1940455711913865216.htm"
                           title="6,FreeRTOS临界区代码保护与任务调度器的挂起与恢复" target="_blank">6,FreeRTOS临界区代码保护与任务调度器的挂起与恢复</a>
                        <span class="text-muted">自激振荡器</span>
<a class="tag" taget="_blank" href="/search/FreeRTOS%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">FreeRTOS学习笔记</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a><a class="tag" taget="_blank" href="/search/stm32/1.htm">stm32</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a><a class="tag" taget="_blank" href="/search/freeRTOS/1.htm">freeRTOS</a><a class="tag" taget="_blank" href="/search/FreeRTOS/1.htm">FreeRTOS</a>
                        <div>一、临界区代码保护如果我们想在执行某段代码时不被中断打断,此时需要进行临界区代码保护。在临界区内关闭中断,临界区结束后开启中断。需要注意的是临界区的进入和退出需要成对出现,如果进入两次,那么需要退出两次才可以成功开启中断。注:本实验基于正点原子FreeRTOS教程的学习总结。1..所需API函数介绍taskENTER_CRITICAL函数用来进入临界区。在任务中调用。#definetaskENTE</div>
                    </li>
                    <li><a href="/article/1940455459697782784.htm"
                           title="4,STM32CubeMX配置UART串口工程" target="_blank">4,STM32CubeMX配置UART串口工程</a>
                        <span class="text-muted"></span>

                        <div>1,前言单片机型号:STM32F407编程环境:STM32CubeMX+Keilv5硬件连接:PF9--->LED0,PF10--->LED1注:本工程在1,STM32CubeMX工程基础(配置Debug、时钟树)基础上完成。2,STM32CubeMX配置UART串口在Connectivity(1)中选择USART1(2)进行配置串口1,在Mode中下拉选择异步通信方式Asynchronous(3</div>
                    </li>
                    <li><a href="/article/1940453947701522432.htm"
                           title="Android 中 函数实现多个返回值的几种方式" target="_blank">Android 中 函数实现多个返回值的几种方式</a>
                        <span class="text-muted"></span>

                        <div>在编程中,函数通常只能返回一个值。但通过使用对象封装、Pair、Triple、数组、列表或Bundle方式,可以轻松地返回多个值。1、对象封装方式创建数据类来封装需要返回的多个值。dataclassResult(valcode:Int,valmessage:String)fungetMultiValues():Result{returnResult(1,"success")}//调用方式valre</div>
                    </li>
                    <li><a href="/article/1940452939948683264.htm"
                           title="Vue 3 中 h 方法详解" target="_blank">Vue 3 中 h 方法详解</a>
                        <span class="text-muted">yqcoder</span>
<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><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>在Vue3中,h方法是一个用于创建虚拟DOM节点的函数,它是创建渲染函数的核心工具。一、引入h方法import{h}from"vue";constMyComponent={render(){returnh("div","Hello,Vue3!");},};二、语法h(type,props?,children?)1.type必填参数,表示要创建的节点类型。字符串:表示HTML标签名,如'div'、'</div>
                    </li>
                    <li><a href="/article/1940450419742404608.htm"
                           title="yolov算法详解_yolo 目标检测算法个人总结(yolov1)" target="_blank">yolov算法详解_yolo 目标检测算法个人总结(yolov1)</a>
                        <span class="text-muted">CHAO JIANG</span>
<a class="tag" taget="_blank" href="/search/yolov%E7%AE%97%E6%B3%95%E8%AF%A6%E8%A7%A3/1.htm">yolov算法详解</a>
                        <div>yolo目标检测算法个人总结目前yolo目标检测有两个版本,分别为v1和v2。因工作需要用yolo算法检测人物,所以这段时间重点看了这两篇论文,并实现了对应的tensorflow代码。这里记录下在论文阅读过程中的一些细节信息,留给自己,同时也希望各位能指出本人理解错误的地方,谢谢!一:yolov1关于yolov1算法的详解在网上已经非常多了,在这里我大概叙述下算法的流程,以及在开发过程中遇到的一些</div>
                    </li>
                    <li><a href="/article/1940449412002148352.htm"
                           title="使用vue-template-loader将模板编译成渲染函数的Webpack配置技巧" target="_blank">使用vue-template-loader将模板编译成渲染函数的Webpack配置技巧</a>
                        <span class="text-muted">前端布洛芬</span>
<a class="tag" taget="_blank" href="/search/%E5%A4%A7%E7%99%BD%E8%AF%9D%E5%89%8D%E7%AB%AF%E5%85%AB%E8%82%A1/1.htm">大白话前端八股</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>大白话使用vue-template-loader将模板编译成渲染函数的Webpack配置技巧引言:被模板编译逼疯的周三下午你是否也经历过这样的场景:deadline前的周三下午,咖啡因已经失效,屏幕上却跳出Templatecompilationfailed的红色报错。Vue单文件组件(SFC)的.vue格式用腻了,想试试把模板抽成单独的.html文件,结果webpack配置直接给你脸色看。作为每天</div>
                    </li>
                    <li><a href="/article/1940446136082952192.htm"
                           title="D-FINE使用pth权重批量推理可视化图片" target="_blank">D-FINE使用pth权重批量推理可视化图片</a>
                        <span class="text-muted">悠悠海风</span>
<a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%A0%81%E8%B0%83%E8%AF%95/1.htm">代码调试</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/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><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/1.htm">目标检测</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/1.htm">计算机视觉</a>
                        <div>关于D-FINE相关的内容可参考下面这篇博客:论文解读:ICLR2025|D-FINE_d-fine:redefineregressiontaskindetrsasfine--CSDN博客文章浏览阅读949次,点赞18次,收藏28次。D-FINE是一款功能强大的实时物体检测器,它将DETRs中的边界框回归任务重新定义为细粒度分布细化(FDR),并引入了全局最优定位自蒸馏(GO-LSD),在不引入额</div>
                    </li>
                    <li><a href="/article/1940444370654261248.htm"
                           title="Swift 小技巧:用单边区间优雅处理模糊范围" target="_blank">Swift 小技巧:用单边区间优雅处理模糊范围</a>
                        <span class="text-muted">狼_夏天</span>
<a class="tag" taget="_blank" href="/search/Swift/1.htm">Swift</a><a class="tag" taget="_blank" href="/search/Tips/1.htm">Tips</a><a class="tag" taget="_blank" href="/search/swift/1.htm">swift</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/ios/1.htm">ios</a>
                        <div>进入正题之前先科普一下Swift区间的知识。Swift中的区间有两种类型:闭区间和半开区间。闭区间:用a...b表示,包含a和b。半开区间:用a..=0&&number=2.0&&score=3.5&&score<=5.0{print("好评")}else{print("评分超出范围")}3.用单边区间优雅处理letscore=4.2guard(0.0...5.0).contains(score)</div>
                    </li>
                    <li><a href="/article/1940442604411875328.htm"
                           title="数据结构day2" target="_blank">数据结构day2</a>
                        <span class="text-muted">LZA185</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a>
                        <div>目录一、Makefile二、检测内存泄漏工具:valgrind2.1valgrind介绍2.2具体使用:valgrind./a.out三、顺序存储的优缺点3.1优点3.2缺点四、线性表的链式存储:4.1链式存储简介4.2关于单向链表的c语言描述4.3单项列表的功能函数一、Makefile关于makefile介绍请查看这篇文章:https://blog.csdn.net/weixin_7208634</div>
                    </li>
                                <li><a href="/article/50.htm"
                                       title="java封装继承多态等" target="_blank">java封装继承多态等</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/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/encapsulatopn/1.htm">encapsulatopn</a>
                                    <div>       最近一段时间看了很多的视频却忘记总结了,现在只能想到什么写什么了,希望能起到一个回忆巩固的作用。 
    1、final关键字 
      译为:最终的 
       &</div>
                                </li>
                                <li><a href="/article/177.htm"
                                       title="F5与集群的区别" target="_blank">F5与集群的区别</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/weblogic/1.htm">weblogic</a><a class="tag" taget="_blank" href="/search/%E9%9B%86%E7%BE%A4/1.htm">集群</a><a class="tag" taget="_blank" href="/search/F5/1.htm">F5</a>
                                    <div>        http请求配置不是通过集群,而是F5;集群是weblogic容器的,如果是ejb接口是通过集群。 
        F5同集群的差别,主要还是会话复制的问题,F5一把是分发http请求用的,因为http都是无状态的服务,无需关注会话问题,类似</div>
                                </li>
                                <li><a href="/article/304.htm"
                                       title="LeetCode[Math] - #7 Reverse Integer" target="_blank">LeetCode[Math] - #7 Reverse Integer</a>
                                    <span class="text-muted">Cwind</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E9%A2%98%E8%A7%A3/1.htm">题解</a><a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a><a class="tag" taget="_blank" href="/search/LeetCode/1.htm">LeetCode</a><a class="tag" taget="_blank" href="/search/Algorithm/1.htm">Algorithm</a>
                                    <div>原题链接:#7 Reverse Integer 
  
要求: 
按位反转输入的数字 
例1: 输入 x = 123, 返回 321 
例2: 输入 x = -123, 返回 -321 
  
难度:简单 
  
分析: 
对于一般情况,首先保存输入数字的符号,然后每次取输入的末位(x%10)作为输出的高位(result = result*10 + x%10)即可。但</div>
                                </li>
                                <li><a href="/article/431.htm"
                                       title="BufferedOutputStream" target="_blank">BufferedOutputStream</a>
                                    <span class="text-muted">周凡杨</span>

                                    <div>     首先说一下这个大批量,是指有上千万的数据量。 
     例子: 
     有一张短信历史表,其数据有上千万条数据,要进行数据备份到文本文件,就是执行如下SQL然后将结果集写入到文件中! 
     select t.msisd</div>
                                </li>
                                <li><a href="/article/558.htm"
                                       title="linux下模拟按键输入和鼠标" target="_blank">linux下模拟按键输入和鼠标</a>
                                    <span class="text-muted">被触发</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                                    <div>查看/dev/input/eventX是什么类型的事件, cat /proc/bus/input/devices 
设备有着自己特殊的按键键码,我需要将一些标准的按键,比如0-9,X-Z等模拟成标准按键,比如KEY_0,KEY-Z等,所以需要用到按键 模拟,具体方法就是操作/dev/input/event1文件,向它写入个input_event结构体就可以模拟按键的输入了。 
 
linux/in</div>
                                </li>
                                <li><a href="/article/685.htm"
                                       title="ContentProvider初体验" target="_blank">ContentProvider初体验</a>
                                    <span class="text-muted">肆无忌惮_</span>
<a class="tag" taget="_blank" href="/search/ContentProvider/1.htm">ContentProvider</a>
                                    <div>ContentProvider在安卓开发中非常重要。与Activity,Service,BroadcastReceiver并称安卓组件四大天王。 
在android中的作用是用来对外共享数据。因为安卓程序的数据库文件存放在data/data/packagename里面,这里面的文件默认都是私有的,别的程序无法访问。 
如果QQ游戏想访问手机QQ的帐号信息一键登录,那么就需要使用内容提供者COnte</div>
                                </li>
                                <li><a href="/article/812.htm"
                                       title="关于Spring MVC项目(maven)中通过fileupload上传文件" target="_blank">关于Spring MVC项目(maven)中通过fileupload上传文件</a>
                                    <span class="text-muted">843977358</span>
<a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a><a class="tag" taget="_blank" href="/search/spring+mvc/1.htm">spring mvc</a><a class="tag" taget="_blank" href="/search/%E4%BF%AE%E6%94%B9%E5%A4%B4%E5%83%8F/1.htm">修改头像</a><a class="tag" taget="_blank" href="/search/%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6/1.htm">上传文件</a><a class="tag" taget="_blank" href="/search/upload/1.htm">upload</a>
                                    <div>Spring MVC 中通过fileupload上传文件,其中项目使用maven管理。 
  
1.上传文件首先需要的是导入相关支持jar包:commons-fileupload.jar,commons-io.jar 
因为我是用的maven管理项目,所以要在pom文件中配置(每个人的jar包位置根据实际情况定) 
<!-- 文件上传 start by zhangyd-c --&g</div>
                                </li>
                                <li><a href="/article/939.htm"
                                       title="使用svnkit api,纯java操作svn,实现svn提交,更新等操作" target="_blank">使用svnkit api,纯java操作svn,实现svn提交,更新等操作</a>
                                    <span class="text-muted">aigo</span>
<a class="tag" taget="_blank" href="/search/svnkit/1.htm">svnkit</a>
                                    <div> 原文:http://blog.csdn.net/hardwin/article/details/7963318 
  
import java.io.File;  
  
import org.apache.log4j.Logger;  
import org.tmatesoft.svn.core.SVNCommitInfo;  
import org.tmateso</div>
                                </li>
                                <li><a href="/article/1066.htm"
                                       title="对比浏览器,casperjs,httpclient的Header信息" target="_blank">对比浏览器,casperjs,httpclient的Header信息</a>
                                    <span class="text-muted">alleni123</span>
<a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/crawler/1.htm">crawler</a><a class="tag" taget="_blank" href="/search/header/1.htm">header</a>
                                    <div>		@Override
		protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
		{
			String type=req.getParameter("type");
			Enumeration es=re</div>
                                </li>
                                <li><a href="/article/1193.htm"
                                       title="java.io操作 DataInputStream和DataOutputStream基本数据流" target="_blank">java.io操作 DataInputStream和DataOutputStream基本数据流</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/%E6%B5%81/1.htm">流</a>
                                    <div>1,java中如果不保存整个对象,只保存类中的属性,那么我们可以使用本篇文章中的方法,如果要保存整个对象  先将类实例化  后面的文章将详细写到 
  
  
2,DataInputStream 是java.io包中一个数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。</div>
                                </li>
                                <li><a href="/article/1320.htm"
                                       title="车辆保险理赔案例" target="_blank">车辆保险理赔案例</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/%E8%BD%A6%E9%99%A9/1.htm">车险</a>
                                    <div>理赔案例: 
一货运车,运输公司为车辆购买了机动车商业险和交强险,也买了安全生产责任险,运输一车烟花爆竹,在行驶途中发生爆炸,出现车毁、货损、司机亡、炸死一路人、炸毁一间民宅等惨剧,针对这几种情况,该如何赔付。 
赔付建议和方案: 
客户所买交强险在这里不起作用,因为交强险的赔付前提是:“机动车发生道路交通意外事故”; 
如果是交通意外事故引发的爆炸,则优先适用交强险条款进行赔付,不足的部分由商业</div>
                                </li>
                                <li><a href="/article/1447.htm"
                                       title="学习Spring必学的Java基础知识(5)—注解" target="_blank">学习Spring必学的Java基础知识(5)—注解</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                    <div>        文章来源:http://www.iteye.com/topic/1123823,整理在我的博客有两个目的:一个是原文确实很不错,通俗易懂,督促自已将博主的这一系列关于Spring文章都学完;另一个原因是为免原文被博主删除,在此记录,方便以后查找阅读。 
  
        有必要对</div>
                                </li>
                                <li><a href="/article/1574.htm"
                                       title="【Struts2一】Struts2 Hello World" target="_blank">【Struts2一】Struts2 Hello World</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/Hello+world/1.htm">Hello world</a>
                                    <div>Struts2 Hello World应用的基本步骤 
创建Struts2的Hello World应用,包括如下几步: 
1.配置web.xml 
2.创建Action 
3.创建struts.xml,配置Action 
4.启动web server,通过浏览器访问 
  配置web.xml 
<?xml version="1.0" encoding="</div>
                                </li>
                                <li><a href="/article/1701.htm"
                                       title="【Avro二】Avro RPC框架" target="_blank">【Avro二】Avro RPC框架</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/rpc/1.htm">rpc</a>
                                    <div>1. Avro RPC简介 1.1. RPC 
 
 RPC逻辑上分为二层,一是传输层,负责网络通信;二是协议层,将数据按照一定协议格式打包和解包 
 从序列化方式来看,Apache Thrift 和Google的Protocol Buffers和Avro应该是属于同一个级别的框架,都能跨语言,性能优秀,数据精简,但是Avro的动态模式(不用生成代码,而且性能很好)这个特点让人非常喜欢,比较适合R</div>
                                </li>
                                <li><a href="/article/1828.htm"
                                       title="lua set get cookie" target="_blank">lua set get cookie</a>
                                    <span class="text-muted">ronin47</span>
<a class="tag" taget="_blank" href="/search/lua+cookie/1.htm">lua cookie</a>
                                    <div>lua:
local access_token = ngx.var.cookie_SGAccessToken
if access_token then
    ngx.header["Set-Cookie"] = "SGAccessToken="..access_token.."; path=/;Max-Age=3000"
end</div>
                                </li>
                                <li><a href="/article/1955.htm"
                                       title="java-打印不大于N的质数" target="_blank">java-打印不大于N的质数</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>

public class PrimeNumber {

	/**
	 * 寻找不大于N的质数
	 */
	public static void main(String[] args) {
		int n=100;
		PrimeNumber pn=new PrimeNumber();
		pn.printPrimeNumber(n);
		System.out.print</div>
                                </li>
                                <li><a href="/article/2082.htm"
                                       title="Spring源码学习-PropertyPlaceholderHelper" target="_blank">Spring源码学习-PropertyPlaceholderHelper</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                    <div>今天在看Spring 3.0.0.RELEASE的源码,发现PropertyPlaceholderHelper的一个bug 
当时觉得奇怪,上网一搜,果然是个bug,不过早就有人发现了,且已经修复: 
详见: 
http://forum.spring.io/forum/spring-projects/container/88107-propertyplaceholderhelper-bug 
 
</div>
                                </li>
                                <li><a href="/article/2209.htm"
                                       title="[逻辑与拓扑]布尔逻辑与拓扑结构的结合会产生什么?" target="_blank">[逻辑与拓扑]布尔逻辑与拓扑结构的结合会产生什么?</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E6%8B%93%E6%89%91/1.htm">拓扑</a>
                                    <div> 
   如果我们已经在一个工作流的节点中嵌入了可以进行逻辑推理的代码,那么成百上千个这样的节点如果组成一个拓扑网络,而这个网络是可以自动遍历的,非线性的拓扑计算模型和节点内部的布尔逻辑处理的结合,会产生什么样的结果呢? 
 
   是否可以形成一种新的模糊语言识别和处理模型呢?  大家有兴趣可以试试,用软件搞这些有个好处,就是花钱比较少,就算不成</div>
                                </li>
                                <li><a href="/article/2336.htm"
                                       title="ITEYE 都换百度推广了" target="_blank">ITEYE 都换百度推广了</a>
                                    <span class="text-muted">cuisuqiang</span>
<a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a><a class="tag" taget="_blank" href="/search/AdSense/1.htm">AdSense</a><a class="tag" taget="_blank" href="/search/%E7%99%BE%E5%BA%A6%E6%8E%A8%E5%B9%BF/1.htm">百度推广</a><a class="tag" taget="_blank" href="/search/%E5%B9%BF%E5%91%8A/1.htm">广告</a><a class="tag" taget="_blank" href="/search/%E5%A4%96%E5%BF%AB/1.htm">外快</a>
                                    <div>以前ITEYE的广告都是谷歌的Google AdSense,现在都换成百度推广了。 
  
为什么个人博客设置里面还是Google AdSense呢? 
  
都知道Google AdSense不好申请,这在ITEYE上也不是讨论了一两天了,强烈建议ITEYE换掉Google AdSense。至少,用一个好申请的吧。 
  
什么时候能从ITEYE上来点外快,哪怕少点</div>
                                </li>
                                <li><a href="/article/2463.htm"
                                       title="新浪微博技术架构分析" target="_blank">新浪微博技术架构分析</a>
                                    <span class="text-muted">dalan_123</span>
<a class="tag" taget="_blank" href="/search/%E6%96%B0%E6%B5%AA%E5%BE%AE%E5%8D%9A/1.htm">新浪微博</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a>
                                    <div>新浪微博在短短一年时间内从零发展到五千万用户,我们的基层架构也发展了几个版本。第一版就是是非常快的,我们可以非常快的实现我们的模块。我们看一下技术特点,微博这个产品从架构上来分析,它需要解决的是发表和订阅的问题。我们第一版采用的是推的消息模式,假如说我们一个明星用户他有10万个粉丝,那就是说用户发表一条微博的时候,我们把这个微博消息攒成10万份,这样就是很简单了,第一版的架构实际上就是这两行字。第</div>
                                </li>
                                <li><a href="/article/2590.htm"
                                       title="玩转ARP攻击" target="_blank">玩转ARP攻击</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/r/1.htm">r</a>
                                    <div>我写这片文章只是想让你明白深刻理解某一协议的好处。高手免看。如果有人利用这片文章所做的一切事情,盖不负责。 网上关于ARP的资料已经很多了,就不用我都说了。 用某一位高手的话来说,“我们能做的事情很多,唯一受限制的是我们的创造力和想象力”。 ARP也是如此。 以下讨论的机子有 一个要攻击的机子:10.5.4.178 硬件地址:52:54:4C:98</div>
                                </li>
                                <li><a href="/article/2717.htm"
                                       title="PHP编码规范" target="_blank">PHP编码规范</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83/1.htm">编码规范</a>
                                    <div>一、文件格式 
1. 对于只含有 php 代码的文件,我们将在文件结尾处忽略掉 "?>" 。这是为了防止多余的空格或者其它字符影响到代码。例如:<?php$foo = 'foo';2. 缩进应该能够反映出代码的逻辑结果,尽量使用四个空格,禁止使用制表符TAB,因为这样能够保证有跨客户端编程器软件的灵活性。例</div>
                                </li>
                                <li><a href="/article/2844.htm"
                                       title="linux 脱机管理(nohup)" target="_blank">linux 脱机管理(nohup)</a>
                                    <span class="text-muted">eksliang</span>
<a class="tag" taget="_blank" href="/search/linux+nohup/1.htm">linux nohup</a><a class="tag" taget="_blank" href="/search/nohup/1.htm">nohup</a>
                                    <div>脱机管理 nohup 
转载请出自出处:http://eksliang.iteye.com/blog/2166699 
nohup可以让你在脱机或者注销系统后,还能够让工作继续进行。他的语法如下 
nohup [命令与参数]   --在终端机前台工作
nohup [命令与参数] & --在终端机后台工作 
  
但是这个命令需要注意的是,nohup并不支持bash的内置命令,所</div>
                                </li>
                                <li><a href="/article/2971.htm"
                                       title="BusinessObjects Enterprise Java SDK" target="_blank">BusinessObjects Enterprise Java SDK</a>
                                    <span class="text-muted">greemranqq</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/BO/1.htm">BO</a><a class="tag" taget="_blank" href="/search/SAP/1.htm">SAP</a><a class="tag" taget="_blank" href="/search/Crystal+Reports/1.htm">Crystal Reports</a>
                                    <div>最近项目用到oracle_ADF  从SAP/BO 上调用 水晶报表,资料比较少,我做一个简单的分享,给和我一样的新手 提供更多的便利。 
  
首先,我是尝试用JAVA JSP 去访问的。 
  
官方API:http://devlibrary.businessobjects.com/BusinessObjectsxi/en/en/BOE_SDK/boesdk_ja</div>
                                </li>
                                <li><a href="/article/3098.htm"
                                       title="系统负载剧变下的管控策略" target="_blank">系统负载剧变下的管控策略</a>
                                    <span class="text-muted">iamzhongyong</span>
<a class="tag" taget="_blank" href="/search/%E9%AB%98%E5%B9%B6%E5%8F%91/1.htm">高并发</a>
                                    <div>假如目前的系统有100台机器,能够支撑每天1亿的点击量(这个就简单比喻一下),然后系统流量剧变了要,我如何应对,系统有那些策略可以处理,这里总结了一下之前的一些做法。 
1、水平扩展 
这个最容易理解,加机器,这样的话对于系统刚刚开始的伸缩性设计要求比较高,能够非常灵活的添加机器,来应对流量的变化。 
2、系统分组 
假如系统服务的业务不同,有优先级高的,有优先级低的,那就让不同的业务调用提前分组</div>
                                </li>
                                <li><a href="/article/3225.htm"
                                       title="BitTorrent DHT 协议中文翻译" target="_blank">BitTorrent DHT 协议中文翻译</a>
                                    <span class="text-muted">justjavac</span>
<a class="tag" taget="_blank" href="/search/bit/1.htm">bit</a>
                                    <div>前言 
做了一个磁力链接和BT种子的搜索引擎 {Magnet & Torrent},因此把 DHT 协议重新看了一遍。 
 
 BEP: 5Title: DHT ProtocolVersion: 3dec52cb3ae103ce22358e3894b31cad47a6f22bLast-Modified: Tue Apr 2 16:51:45 2013 -070</div>
                                </li>
                                <li><a href="/article/3352.htm"
                                       title="Ubuntu下Java环境的搭建" target="_blank">Ubuntu下Java环境的搭建</a>
                                    <span class="text-muted">macroli</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a>
                                    <div>配置命令: 
  $sudo apt-get install ubuntu-restricted-extras 
  再运行如下命令: 
  $sudo apt-get install sun-java6-jdk 
  待安装完毕后选择默认Java. 
  $sudo update- alternatives --config java 
  安装过程提示选择,输入“2”即可,然后按回车键确定。 </div>
                                </li>
                                <li><a href="/article/3479.htm"
                                       title="js字符串转日期(兼容IE所有版本)" target="_blank">js字符串转日期(兼容IE所有版本)</a>
                                    <span class="text-muted">qiaolevip</span>
<a class="tag" taget="_blank" href="/search/TO/1.htm">TO</a><a class="tag" taget="_blank" href="/search/Date/1.htm">Date</a><a class="tag" taget="_blank" href="/search/String/1.htm">String</a><a class="tag" taget="_blank" href="/search/IE/1.htm">IE</a>
                                    <div>	/**
	 * 字符串转时间(yyyy-MM-dd HH:mm:ss)
	 * result (分钟)
	 */
	stringToDate : function(fDate){
		var fullDate = fDate.split(" ")[0].split("-");
		var fullTime = fDate.split("</div>
                                </li>
                                <li><a href="/article/3606.htm"
                                       title="【数据挖掘学习】关联规则算法Apriori的学习与SQL简单实现购物篮分析" target="_blank">【数据挖掘学习】关联规则算法Apriori的学习与SQL简单实现购物篮分析</a>
                                    <span class="text-muted">superlxw1234</span>
<a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98/1.htm">数据挖掘</a><a class="tag" taget="_blank" href="/search/%E5%85%B3%E8%81%94%E8%A7%84%E5%88%99/1.htm">关联规则</a>
                                    <div>关联规则挖掘用于寻找给定数据集中项之间的有趣的关联或相关关系。 
关联规则揭示了数据项间的未知的依赖关系,根据所挖掘的关联关系,可以从一个数据对象的信息来推断另一个数据对象的信息。 
例如购物篮分析。牛奶 ⇒ 面包 [支持度:3%,置信度:40%]  支持度3%:意味3%顾客同时购买牛奶和面包。   置信度40%:意味购买牛奶的顾客40%也购买面包。   规则的支持度和置信度是两个规则兴</div>
                                </li>
                                <li><a href="/article/3733.htm"
                                       title="Spring 5.0 的系统需求,期待你的反馈" target="_blank">Spring 5.0 的系统需求,期待你的反馈</a>
                                    <span class="text-muted">wiselyman</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                    <div>        
       Spring 5.0将在2016年发布。Spring5.0将支持JDK 9。 
  
       Spring 5.0的特性计划还在工作中,请保持关注,所以作者希望从使用者得到关于Spring 5.0系统需求方面的反馈。 
 </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>