人工博客开张了

https://www.94rg.com/article/1

" title="" style="font-size: inherit; color: inherit; line-height: inherit; padding: 0px; display" title="" style="font-size: inherit; color: inherit; line-height: inherit; padding: 0px; display" title="" style="font-size: inherit; color: inherit; line-height: inherit; padding: 0px; display" title="" style="font-size: inherit; color: inherit; line-height: inherit; padding: 0px; display" title="" style="font-size: inherit; color: inherit; line-height: inherit; padding: 0px; display

完整摘要

查看全部

×

人工搜索

1、背景

总希望自己的成长能留下一些足迹;总希望能够系统地整理下自己的知识。所以这个博客出现了。

2、使命

让思维更开阔,让进步更明显

3、愿景

让百万程序员遇到更好的自己

人工博客
人工博客

人工博客
人工博客

人工博客
人工博客

人工博客
人工博客

人工博客
人工博客

人工博客
人工博客

人工博客
人工博客

5、我喜欢的博客

  • 张戈博客
  • 三太子敖丙

Google引爆大数据时代的三篇论文

https://www.94rg.com/article/1770

margin: 0px; padding: 0px; text-decoration: none; color: rgb(30, 107, 184); overflow-wrap: break-word;">" title="" style="font-size: inherit; color: inherit; line-height: inherit; padding: 0px; display" title="" style="font-size: inherit; color: inherit; line-height: inherit; padding: 0px; display" title="" style="font-size: inherit; color: inherit; line-height: inherit; padding: 0px; display" title="" style="font-size: inherit; color: inherit; line-height: inherit; padding: 0px; display

完整摘要

查看全部

×

人工搜索

郑重声明: 本文首发于人工博客

谈到Hadoop的起源,就不得不提Google的三驾马车:Google FS、MapReduce、BigTable。虽然Google没有公布这三个产品的源码,但是他发布了这三个产品的详细设计论文,奠定了风靡全球的大数据算法的基础!

1、GFS—-2003

2003年,Google发布Google File System论文,这是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,提供容错功能。从根本上说:文件被分割成很多块,使用冗余的方式储存于商用机器集群上。

人工博客
人工博客

GFS由一个master和大量的chunkserver构成。Google设置一个master来保存目录和索引信息,这是为了简化系统结果,提高性能来考虑的,但是这就会造成主成为单点故障或者瓶颈。为了消除主的单点故障Google把每个chunk设置的很大(64M),这样,由于代码访问数据的本地性,application端和master的交互会减少,而主要数据流量都是Application和chunkserver之间的访问。

人工博客
人工博客

另外,master所有信息都存储在内存里,启动时信息从chunkserver中获取。提高了master的性能和吞吐量,也有利于master当掉后,很容易把后备j机器切换成master。客户端和chunkserver都不对文件数据单独做缓存,只是用linux文件系统自己的缓存。

人工博客
人工博客

从上图可以看出,Google的后面两篇论文——MapReduce 和 BigTable都是以GFS为基础。三大基础核心技术构建出了完整的分布式运算架构。

2、MapReduce—-2004

紧随其后的就是2004年公布的 MapReduce论文,论文描述了大数据的分布式计算方式,主要思想是将任务分解然后在多台处理能力较弱的计算节点中同时处理,然后将结果合并从而完成大数据处理。

传说中,Google使用它计算他们的搜索索引。而Mikio L. Braun认为其工作模式应该是:Google把所有抓取的页面都放置于他们的集群上,然后每天使用MapReduce来重算。

人工博客
人工博客

人工博客
人工博客

Mapreduce是针对分布式并行计算的一套编程模型。

讲到并行计算,就不能不谈到微软的Herb Sutter在2005年发表的文章” The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software”,主要意思是通过提高cpu主频的方式来提高程序的性能很快就要过去了,cpu的设计方向也主要是多核、超线程等并发上。但是以前的程序并不能自动的得到多核的好处,只有编写并发程序,才能真正获得多核的好处。分布式计算也是一样。

Mapreduce由Map和reduce组成,来自于Lisp,Map是影射,把指令分发到多个worker上去,reduce是规约,把Map的worker计算出来的结果合并。Mapreduce使用GFS存储数据。

人工博客
人工博客

3、 BigTable—-2006

Bigtable发布于2006年,启发了无数的NoSQL数据库,比如:Cassandra、HBase等等。Cassandra架构中有一半是模仿Bigtable,包括了数据模型、SSTables以及提前写日志(另一半是模仿Amazon的Dynamo数据库,使用点对点集群模式)。

人工博客
人工博客

BigTable 是建立在 GFS 和 MapReduce 之上的。每个Table都是一个多维的稀疏图

为了管理巨大的Table,把Table根据行分割,这些分割后的数据统称为:Tablets。每个Tablets大概有 100-200 MB,每个机器存储100个左右的 Tablets。底层的架构是:GFS。

由于GFS是一种分布式的文件系统,采用Tablets的机制后,可以获得很好的负载均衡。比如:可以把经常响应的表移动到其他空闲机器上,然后快速重建。

论文中英文版下载https://pan.baidu.com/s/1NYGlPJrAL40JsTorU9AI1w

人工博客
人工博客


版权声明:本文为人工博客的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
本文链接:https://www.94rg.com/article/1770

常见jvm垃圾回收算法解读

https://www.94rg.com/article/1765

" title="" style="font-size: inherit; color: inherit; line-height: inherit; padding: 0px; display; padding: 0px; margin-top: 10px; text-align: center; color: rgb(153, 153, 153); font-size: 0.7em;">" title="" style="font-size: inherit; color: inherit; line-height: inherit; padding: 0px; display" title="" style="font-size: inherit; color: inherit; line-height: inherit; padding: 0px; display" title="" style="font-size: inherit; color: inherit; line-height: inherit; padding: 0px; display

完整摘要

查看全部

×

人工搜索

1、为什么要进行垃圾收集

受当前物理机器硬件发展的限制,java程序能够使用的内存是有上限的。如果没有垃圾回收这一机制,java程序运行过程中不断的创建对象,内存的使用必然是持续上涨。最终出现内存不足。
java虚拟机内置垃圾回收一来解决了垃圾回收这一复杂问题的重复开发问题,提高开发效率;再者保护了java程序的完整性。避免了程序员失误而引起的程序崩溃。
缺点是程序员失去了对java程序主动垃圾回收的控制权

2、垃圾收集算法

垃圾回收算法必须要做的两件事。检测和回收
区分垃圾和活动对象的两个方法引用计数和跟踪

3、引用计数收集器

对象创建的时候,该对象的引用计算被设置为1。新的的对象被赋值为这个对象的时候,计数加一,值被赋值为新的对象的时候,计算减1。计数为0的对象判定为垃圾。优点是运行周期短,缺点是无法检测循环引用的场景以及增加了额外的开销

4、跟踪收集器

追踪过程中为遇到的对象打上标记,标记可存在对象本身,也可以是独立的标记位图。追踪结束,未打上标记的对象判定为垃圾。

人工博客
人工博客

5、压缩收集器

将内存中的活动对象进行整理移动到内存的一端这个过程需要更新原始的对象的引用,不过可以通过嫁接一个对象引用层来简化工作。对象不是直接引用,而是通过对象引用层来寻址映射的,这样的话只需改变对象引用层的句柄内容就好了。

人工博客
人工博客

6、拷贝收集器

内存被划分为大小相同的两部分,始终有一端是空闲的,当其中的一端慢慢的内存被消耗殆尽,触发垃圾回收,将满的一端的活动对象进行整理,移动到另一空白区,然后释放原始的内存区。然后周而复始。
缺点是需要两倍的内存区。每次需要来回拷贝生命周期比较长的对象。

人工博客
人工博客

7、按代收集的收集器

内存区被划分为几个区域,对象的创建默认在年轻代中,经过几次垃圾回收依然存活的对象会被移动到下个代中

人工博客
人工博客

8、自适应收集器

根据不同的情况自动调整不同的垃圾算法。在不同的代中使用不同的算法

9、火车算法

火车算法最大的好处是它可以保证大的循环结构可以被完全收集,因为成为垃圾的循环结构中的对象,无论多大,都会被移入同一列火车,最终一起被收集。还有一个好处是这种算法在大多数情况下可以保证一次垃圾收集所耗时间在一定限度之内,因为一次垃圾回收只收集一个车厢,而车厢的大小是有限度的。

springboot注解使用问题总结

https://www.94rg.com/article/1757

郑重声明: 本文首发于

strong> method的名称

<em>人</em><em>工</em><em>博</em><em>客</em>


版权声明:本文为的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

完整摘要

查看全部

×

人工搜索

郑重声明: 本文首发于人工博客

1、导读

springboot遵循约定大于配置的原则。大大的简化了我们开发的成本。但同时也屏蔽了很多技术细节。如果不是了解很透彻的话,遇到了问题也会很难突破的。这里我记录一下自己平时使用过程中的一些问题。以备日后温故而知新。

2、bean

 @Bean
public RgSystemConfig rgSystemConfigx() {
return new RgSystemConfig();
}

这里注入的bean的名称是啥?rgSystemConfigx?还是rgSystemConfig?
答案是:rgSystemConfigx method的名称

人工博客


版权声明:本文为人工博客的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
本文链接:https://www.94rg.com/article/1757

IDEA快捷键突然无效怎么办

https://www.94rg.com/article/1772

style="font-size: inherit; line-height: inherit; color: rgb(30, 107, 184); overflow-wrap: break-word;">inherit; line-height: inherit;"><em>人</em><em>工</em><em>博</em><em>客</em>;">

版权声明:本文为的原创文章

完整摘要

查看全部

×

人工搜索

郑重声明: 本文首发于人工博客

在使用IDEA时,发现一些快捷键无法使用或者效果莫名其妙,列举2个,其他的查找问题的思路类似(就是跟其他快捷键冲突)

IDEA中Ctrl+Shift+F快捷键无效

输入法的问题,我用的是搜狗输入法,它有着自己的快捷键,对于Ctrl+Shift+F就是简体繁体切换的快捷键,找到快捷键设置,去掉即可。

Alt+向左方向键快捷键,导致idea显示翻转

其实是跟图形显示的快捷键冲突

解决方法:屏幕右键——图形选项——快捷键——禁用

人工博客
人工博客


版权声明:本文为人工博客的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
本文链接:https://www.94rg.com/article/1772

NB的程序员,亮瞎了你的眼吗?

https://www.94rg.com/article/1724

郑重声明: 本文首发于

[](http://www.romancortes.com/ficheros/rose-surface-drawing-4.gif) 好,现在这看起来更像玫瑰花瓣的形状。[](http://www.romancortes.com/ficheros/rose-z-buffer.jpg) 这是可视化的z缓冲的玫瑰,与黑色的相机远,白色接近它。[](http://www.romancortes.com/ficheros/rose-tube2.jpg) #### 3.6 蒙特卡洛取样 我在文章中使用了基于时间间隔的抽样。


版权声明:本文为的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

完整摘要

查看全部

×

人工搜索

郑重声明: 本文首发于人工博客

1、导读

你能想象到1K的代码能写出什么样的功能强大、效果炫酷的作品吗?来吧,今天小编带领大家认识下下面这位大神的作品。

西班牙程序员Roman Cortes用纯JavaScript脚本编写的玫瑰花。
这才是牛逼程序员送给女友的最好情人节礼物呢!(提示:在不同浏览器下观看效果、速度会有很大的不同)

2、先来张效果图

rose

在线预览
预览效果1:

预览效果2

3、原理解读

3.1 蒙特卡罗方法

蒙特卡罗方法是令人难以置信的强大的工具。我用他们所有的时间,对于很多类型的函数优化和抽样问题,他们几乎像魔法一样当你有更多的CPU时间比设计和编码算法。在上升的情况下,它是非常有用的代码大小的优化。
如果你不知道很多关于蒙特卡罗方法,你可以读到他们在这个优秀的维基百科文章。

3.2 明确的表面和采样/绘图

定义的形状玫瑰我使用多个explicit-defined表面。我使用一个共有31表面:24花瓣,萼片4(周围的薄叶花瓣),2叶和1的玫瑰。
这些显式的表面如此,它们是如何工作的?它是很容易的,我要提供一个二维的例子:
首先我定义明确的表面功能:
```

function surface(a, b) { // I'm using a and b as parameters ranging from 0 to 1.
return {
x: a50,
y: b
50
};
// this surface will be a square of 50x50 units of size
}

然后,画它的代码:

var canvas = document.body.appendChild(document.createElement("canvas")),
context = canvas.getContext("2d"),
a, b, position;

// Now I'm going to sample the surface at .1 intervals for a and b parameters:

for (a = 0; a < 1; a += .1) {
for (b = 0; b < 1; b += .1) {
position = surface(a, b);
context.fillRect(position.x, position.y, 1, 1);
}
}


结果:
![人工博客](http://www.romancortes.com/ficheros/rose-surface-drawing-1.gif)
现在,让我们尝试更多密集采样间隔(比间隔=更稠密采样):
![人工博客](http://www.romancortes.com/ficheros/rose-surface-drawing-2.gif)
正如你所看到的,当你样品越来越密集,点越来越近,到密度时的距离从一个点到他们的邻居比像素更小,表面是完全填充在屏幕上(见0.01)。之后,让它更密集的视觉差异,不会引起太大,你只会画的区域已经(0.01和0.001)的比较结果。
好的,现在让我们重新定义表面函数画一个圆。有多种方法,但是我会使用这个公式:(x-x0) ^ 2 + (y-y0) ^ 2 <半径^ 2,(x0, y0)是圆的中心:

function surface(a, b) {
var x = a 100,
y = b
100,
radius = 50,
x0 = 50,
y0 = 50;

if ((x - x0) * (x - x0) + (y - y0) * (y - y0) < radius * radius) {
// inside the circle
return {
x: x,
y: y
};
} else {
// outside the circle
return null;
}

}

if (position = surface(a, b)) {
context.fillRect(position.x, position.y, 1, 1);
}


结果:
![人工博客](http://www.romancortes.com/ficheros/rose-surface-drawing-3.gif)
就像我说的,有不同的方法来定义一个圆,他们中的一些人不需要采样的拒绝。我将展示一个方法,但是,正如报告;我不会继续使用它在本文后面:

function surface(a, b) {
// Circle using polar coordinates
var angle = a Math.PI 2,
radius = 50,
x0 = 50,
y0 = 50;

return {
x: Math.cos(angle) * radius * b + x0,
y: Math.sin(angle) * radius * b + y0
};

}


![人工博客](http://www.romancortes.com/ficheros/rose-surface-drawing-3.gif)
(这个方法需要一个密度采样来填补这个比上一个圈)
好,现在让变形圆所以它看起来更像一个花瓣:

function surface(a, b) {
var x = a 100,
y = b
100,
radius = 50,
x0 = 50,
y0 = 50;

if ((x - x0) * (x - x0) + (y - y0) * (y - y0) < radius * radius) {
return {
x: x,
y: y * (1 + b) / 2 // deformation
};
} else {
return null;
}

}


结果:
![人工博客](http://www.romancortes.com/ficheros/rose-surface-drawing-4.gif)
好,现在这看起来更像玫瑰花瓣的形状。我建议你玩有点变形。你可以使用任何你想要的数学函数,加、减、乘、除,罪恶,因为,战俘…任何东西。只是实验有点修改功能,大量的形状会出现(一些更有趣,更少)。
现在我想添加一些颜色,所以我要将颜色数据添加到表面:

function surface(a, b) {
var x = a 100,
y = b
100,
radius = 50,
x0 = 50,
y0 = 50;

if ((x - x0) * (x - x0) + (y - y0) * (y - y0) < radius * radius) {
return {
x: x,
y: y * (1 + b) / 2,
r: 100 + Math.floor((1 - b) * 155), // this will add a gradient
g: 50,
b: 50
};
} else {
return null;
}

}

for (a = 0; a < 1; a += .01) {
for (b = 0; b < 1; b += .001) {
if (point = surface(a, b)) {
context.fillStyle = "rgb(" + point.r + "," + point.g + "," + point.b + ")";
context.fillRect(point.x, point.y, 1, 1);
}
}
}


结果:
![人工博客](http://www.romancortes.com/ficheros/rose-surface-drawing-5.jpg)
#### 3.3 3D曲面和透视投影
定义3d曲面很简单:只需向surface函数添加一个z属性

function surface(a, b) {
var angle = a Math.PI 2,
radius = 100,
length = 400;

return {
x: Math.cos(angle) * radius,
y: Math.sin(angle) * radius,
z: b * length - length / 2, // by subtracting length/2 I have centered the tube at (0, 0, 0)
r: 0,
g: Math.floor(b * 255),
b: 0
};

}


现在,添加透视投影,首先我们必须定义一个相机:
结果:
![人工博客](http://www.romancortes.com/ficheros/rose-camera.gif)
我将我的相机放在(0,0,cameraZ),我将调用“透视图”的距离,从相机到画布。我将考虑我的画布在x/y平面上,以(0,0,cameraZ + perspective)为中心。现在,每个采样点将被投影到画布:

var pX, pY, // projected on canvas x and y coordinates
perspective = 350,
halfHeight = canvas.height / 2,
halfWidth = canvas.width / 2,
cameraZ = -700;

for (a = 0; a < 1; a += .001) {
for (b = 0; b < 1; b += .01) {
if (point = surface(a, b)) {
pX = (point.x perspective) / (point.z - cameraZ) + halfWidth;
pY = (point.y
perspective) / (point.z - cameraZ) + halfHeight;
context.fillStyle = "rgb(" + point.r + "," + point.g + "," + point.b + ")";
context.fillRect(pX, pY, 1, 1);
}
}
}


结果如下:
![人工博客](http://www.romancortes.com/ficheros/rose-tube1.jpg)
#### 3.4 Z-buffer
z-buffer是计算机图形学中很常见的一种技术,它可以在距离摄像机较近的点上绘制距离摄像机较远的点。它的工作原理是保持一个数组与每像素画近z的图像。
![人工博客](http://www.romancortes.com/ficheros/rose-z-buffer.jpg)
这是可视化的z缓冲的玫瑰,与黑色的相机远,白色接近它。
实现:

var zBuffer = [],
zBufferIndex;

for (a = 0; a < 1; a += .001) {
for (b = 0; b < 1; b += .01) {
if (point = surface(a, b)) {
pX = Math.floor((point.x perspective) / (point.z - cameraZ) + halfWidth);
pY = Math.floor((point.y
perspective) / (point.z - cameraZ) + halfHeight);
zBufferIndex = pY * canvas.width + pX;
if ((typeof zBuffer[zBufferIndex] === "undefined") || (point.z < zBuffer[zBufferIndex])) {
zBuffer[zBufferIndex] = point.z;
context.fillStyle = "rgb(" + point.r + "," + point.g + "," + point.b + ")";
context.fillRect(pX, pY, 1, 1);
}
}
}
}


#### 3.5旋转这个圆柱体
你可以使用任何向量旋转方法。对于玫瑰,我使用了欧拉旋转。让我们实现一个绕Y轴的旋转:

function surface(a, b) {
var angle = a Math.PI 2,
radius = 100,
length = 400,
x = Math.cos(angle) radius,
y = Math.sin(angle)
radius,
z = b length - length / 2,
yAxisRotationAngle = -.4, // in radians!
rotatedX = x
Math.cos(yAxisRotationAngle) + z Math.sin(yAxisRotationAngle),
rotatedZ = x
-Math.sin(yAxisRotationAngle) + z * Math.cos(yAxisRotationAngle);

return {
x: rotatedX,
y: y,
z: rotatedZ,
r: 0,
g: Math.floor(b * 255),
b: 0
};

}


![人工博客](http://www.romancortes.com/ficheros/rose-tube2.jpg)
#### 3.6 蒙特卡洛取样
我在文章中使用了基于时间间隔的抽样。它需要为每个表面设置一个适当的间隔。如果间隔很大,渲染速度会很快,但最终会在表面留下一些没有填充的洞。另一方面,如果间隔太短,则呈现增量的时间会达到无法接受的数量。
那么,让我们切换到蒙特卡罗抽样:

var i;

window.setInterval(function () {
for (i = 0; i < 10000; i++) {
if (point = surface(Math.random(), Math.random())) {
pX = Math.floor((point.x perspective) / (point.z - cameraZ) + halfWidth);
pY = Math.floor((point.y
perspective) / (point.z - cameraZ) + halfHeight);
zBufferIndex = pY * canvas.width + pX;
if ((typeof zBuffer[zBufferIndex] === "undefined") || (point.z < zBuffer[zBufferIndex])) {
zBuffer[zBufferIndex] = point.z;
context.fillStyle = "rgb(" + point.r + "," + point.g + "," + point.b + ")";
context.fillRect(pX, pY, 1, 1);
}
}
}
}, 0);

```

现在,a和b参数被设置为两个随机值。采样足够的点,表面就会以这种方式完全填充。我每次画10000个点然后让屏幕根据间隔更新。

另外,只有在伪随机数发生器质量良好的情况下,才能保证曲面的完全填充。在一些浏览器中,数学。随机是用一个线性同余发生器实现的,这可能会导致一些曲面的问题。如果你需要一个好的PRNG采样,你可以使用高质量的像Mersenne Twister(它有JS实现),或者在一些浏览器中可用的加密随机生成器。使用低差异序列也是非常明智的。

人工博客

4、总结

完成玫瑰,玫瑰的每一部分,每一个表面,都是同时呈现的。我为函数添加了第三个参数,该函数选择玫瑰的部分来返回一个点。数学上它是一个分段函数,每一块都代表玫瑰的一部分。在花瓣的例子中,我使用旋转和拉伸/变形来创建所有的花瓣。所有的工作都是通过混合本文中暴露的概念来完成的。

虽然通过采样显式表面是一种非常著名的方法,也是最古老的3d图形方法之一,但我的分段/蒙特卡罗/z-buffer方法可能很少像我这样用于艺术目的。虽然不是非常具有创新性,在实际场景中也不是很有用,但是它非常适合js1k的环境,在这种环境中,简单性和最小的大小都是需要的。

通过这篇文章,我真的希望能够激励那些对计算机图形感兴趣的读者去尝试和享受不同的渲染方法。在图形领域有一个完整的世界,研究和使用它是令人惊奇的。


版权声明:本文为人工博客的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
本文链接:https://www.94rg.com/article/1724

达尔优键盘指南

https://www.94rg.com/article/1776

inherit; color: inherit; line-height: inherit;"><em>人</em><em>工</em><em>博</em><em>客</em>

完整摘要

查看全部

×

人工搜索

达尔优键盘指南

人工博客
人工博客

工欲善其事必先利其器,程序员专用键盘,你值得拥有

阿里云优惠券领取

https://www.94rg.com/article/13

userCode=up4l93vp

<em>人</em><em>工</em><em>博</em><em>客</em>

版权声明:本文为的原创文章,遵循 CC 4.0 BY+SA 版权协议,转载请附上原文出处链接及本声明。

完整摘要

查看全部

×

人工搜索

阿里云限时红包领取,云产品通用红包,可叠加官网常规优惠,最高1888

内部链接 https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=up4l93vp

人工博客

版权声明:本文为人工博客的原创文章,遵循 CC 4.0 BY+SA 版权协议,转载请附上原文出处链接及本声明。
本文链接:https://www.94rg.com/article/13

git常用的操作

https://www.94rg.com/article/14

checkout -b 本地分支名 远程分支名

<em>人</em><em>工</em><em>博</em><em>客</em>


版权声明:本文为的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

完整摘要

查看全部

×

人工搜索

1、回归合并代码的请求

git checkout . && git clean -xdf

2、强制删除本地的代码分支

git branch -D branchName

3、检出代码到本地

git checkout -b 本地分支名 远程分支名

人工博客


版权声明:本文为人工博客的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
本文链接:https://www.94rg.com/article/14

分享到微博、QQ、QQ空间的接口说明

https://www.94rg.com/article/1726

郑重声明: 本文首发于

;title={{DESC}}&pic={{IMAGE}}&appkey={{WEIBOKEY}}

版权声明:本文为的原创文章

完整摘要

查看全部

×

人工搜索

郑重声明: 本文首发于人工博客

QZone

http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url={{URL}}&title={{TITLE}}&desc={{DESC}}&summary={{SUMMARY}}&site={{SOURCE}}&pics={{IMAGE}}

QQ

http://connect.qq.com/widget/shareqq/index.html?url={{URL}}&title={{TITLE}}&source={{SOURCE}}&desc={{DESC}}&pics={{IMAGE}}&summary={{SUMMARY}}

新浪微博

http://service.weibo.com/share/mobile.php?url={{URL}}&title={{DESC}}&pic={{IMAGE}}&appkey={{WEIBOKEY}}

版权声明:本文为人工博客的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
本文链接:https://www.94rg.com/article/1726