必赢网上注册-亚洲必赢官方登录

贯彻端到端的OC本田UR-V,字符编码笔记

日期:2019-10-08编辑作者:必赢网上注册

一旦在浏览器中写过事件监听addEventListener,那么您对这种事件公布/监听的格局迟早不目生。

那般单例格局才完全消除。上述措施相比较冗繁,有未有更加好的消除办法呢,有幸阅读过《effective java》那本书对于单例有更加好的解决办法。

第二个程序,也正是拿出三件事即多个卖票10张的职务分别分给多少个窗口,他们各做各的事各卖各的票各完结各的天职,因为MyThread承接Thread类,所以在newMyThread的时候在开立多少个对象的同期创设了多少个线程。

创设网络,最早锻练

先是定义生成一个batch的方式:

# 生成一个训练batchdef get_next_batch(batch_size=128): obj = gen_id_card() batch_x = np.zeros([batch_size, IMAGE_HEIGHT*IMAGE_WIDTH]) batch_y = np.zeros([batch_size, MAX_CAPTCHA*CHAR_SET_LEN]) for i in range(batch_size): image, text, vec = obj.gen_image() batch_x[i,:] = image.reshape((IMAGE_HEIGHT*IMAGE_WIDTH)) batch_y[i,:] = vec return batch_x, batch_y

用了Batch Normalization,个人还不是很精通,读者可自行百度,代码来源于参考博文

#Batch Normalization? 有空再理解,tflearn or slim都有封装## http://stackoverflow.com/a/34634291/2267819def batch_norm(x, beta, gamma, phase_train, scope='bn', decay=0.9, eps=1e-5): with tf.variable_scope: #beta = tf.get_variable(name='beta', shape=[n_out], initializer=tf.constant_initializer, trainable=True) #gamma = tf.get_variable(name='gamma', shape=[n_out], initializer=tf.random_normal_initializer(1.0, stddev), trainable=True) batch_mean, batch_var = tf.nn.moments(x, [0, 1, 2], name='moments') ema = tf.train.ExponentialMovingAverage(decay=decay) def mean_var_with_update(): ema_apply_op = ema.apply([batch_mean, batch_var]) with tf.control_dependencies([ema_apply_op]): return tf.identity(batch_mean), tf.identity(batch_var) mean, var = tf.cond(phase_train, mean_var_with_update, lambda: (ema.average(batch_mean), ema.average(batch_var))) normed = tf.nn.batch_normalization(x, mean, var, beta, gamma, eps) return normed

概念4层CNN和一层全连接层,卷积核分别是2层5x5、2层3x3,每层均使用tf.nn.relu非线性化,并行使max_pool,网络布局读者可自动调参优化

# 定义CNNdef crack_captcha_cnn(w_alpha=0.01, b_alpha=0.1): x = tf.reshape(X, shape=[-1, IMAGE_HEIGHT, IMAGE_WIDTH, 1]) # 4 conv layer w_c1 = tf.Variable(w_alpha*tf.random_normal([5, 5, 1, 32])) b_c1 = tf.Variable(b_alpha*tf.random_normal conv1 = tf.nn.bias_add(tf.nn.conv2d(x, w_c1, strides=[1, 1, 1, 1], padding='SAME'), b_c1) conv1 = batch_norm(conv1, tf.constant(0.0, shape=[32]), tf.random_normal(shape=[32], mean=1.0, stddev=0.02), train_phase, scope='bn_1') conv1 = tf.nn.relu conv1 = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') conv1 = tf.nn.dropout(conv1, keep_prob) w_c2 = tf.Variable(w_alpha*tf.random_normal([5, 5, 32, 64])) b_c2 = tf.Variable(b_alpha*tf.random_normal conv2 = tf.nn.bias_add(tf.nn.conv2d(conv1, w_c2, strides=[1, 1, 1, 1], padding='SAME'), b_c2) conv2 = batch_norm(conv2, tf.constant(0.0, shape=[64]), tf.random_normal(shape=[64], mean=1.0, stddev=0.02), train_phase, scope='bn_2') conv2 = tf.nn.relu conv2 = tf.nn.max_pool(conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') conv2 = tf.nn.dropout(conv2, keep_prob) w_c3 = tf.Variable(w_alpha*tf.random_normal([3, 3, 64, 64])) b_c3 = tf.Variable(b_alpha*tf.random_normal conv3 = tf.nn.bias_add(tf.nn.conv2d(conv2, w_c3, strides=[1, 1, 1, 1], padding='SAME'), b_c3) conv3 = batch_norm(conv3, tf.constant(0.0, shape=[64]), tf.random_normal(shape=[64], mean=1.0, stddev=0.02), train_phase, scope='bn_3') conv3 = tf.nn.relu conv3 = tf.nn.max_pool(conv3, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') conv3 = tf.nn.dropout(conv3, keep_prob) w_c4 = tf.Variable(w_alpha*tf.random_normal([3, 3, 64, 64])) b_c4 = tf.Variable(b_alpha*tf.random_normal conv4 = tf.nn.bias_add(tf.nn.conv2d(conv3, w_c4, strides=[1, 1, 1, 1], padding='SAME'), b_c4) conv4 = batch_norm(conv4, tf.constant(0.0, shape=[64]), tf.random_normal(shape=[64], mean=1.0, stddev=0.02), train_phase, scope='bn_4') conv4 = tf.nn.relu conv4 = tf.nn.max_pool(conv4, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') conv4 = tf.nn.dropout(conv4, keep_prob) # Fully connected layer w_d = tf.Variable(w_alpha*tf.random_normal([2*16*64, 1024])) b_d = tf.Variable(b_alpha*tf.random_normal dense = tf.reshape(conv4, [-1, w_d.get_shape().as_list dense = tf.nn.relu(tf.add(tf.matmul(dense, w_d), b_d)) dense = tf.nn.dropout(dense, keep_prob) w_out = tf.Variable(w_alpha*tf.random_normal([1024, MAX_CAPTCHA*CHAR_SET_LEN])) b_out = tf.Variable(b_alpha*tf.random_normal([MAX_CAPTCHA*CHAR_SET_LEN])) out = tf.add(tf.matmul(dense, w_out), b_out) return out

最终试行教练,使用sigmoid分类,每100回总括一次精确率,如果正确率当先百分之七十,则保留模型并终止磨练

# 训练def train_crack_captcha_cnn(): output = crack_captcha_cnn() # loss #loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=output, labels=Y)) loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=output, labels=Y)) # 最后一层用来分类的softmax和sigmoid有什么不同? # optimizer 为了加快训练 learning_rate应该开始大,然后慢慢衰 optimizer = tf.train.AdamOptimizer(learning_rate=0.002).minimize predict = tf.reshape(output, [-1, MAX_CAPTCHA, CHAR_SET_LEN]) max_idx_p = tf.argmax(predict, 2) max_idx_l = tf.argmax(tf.reshape(Y, [-1, MAX_CAPTCHA, CHAR_SET_LEN]), 2) correct_pred = tf.equal(max_idx_p, max_idx_l) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) saver = tf.train.Saver() with tf.Session() as sess: sess.run(tf.global_variables_initializer step = 0 while True: batch_x, batch_y = get_next_batch _, loss_ = sess.run([optimizer, loss], feed_dict={X: batch_x, Y: batch_y, keep_prob: 0.75, train_phase:True}) print(step, loss_) # 每100 step计算一次准确率 if step % 100 == 0 and step != 0: batch_x_test, batch_y_test = get_next_batch acc = sess.run(accuracy, feed_dict={X: batch_x_test, Y: batch_y_test, keep_prob: 1., train_phase:False}) print "第%s步,训练准确率为:%s" % (step, acc) # 如果准确率大80%,保存模型,完成训练 if acc > 0.8: saver.save(sess, "crack_capcha.model", global_step=step) break step += 1

施行结果,小编在差十分的少500次练习后,得到准确率84.3%的结果

图片 1image.png

粗粗磨练1500~2200次左右,准确率就能够达到规定的标准98%,打字与印刷前5条测验样本能够阅览,输出结果基本与label一致了

图片 2image.png

最后全部代码和字体能源文件托管在本人的Github下

小编在一齐头陶冶的时候图片大小是64 x 512的,操练的时候开采陶冶进度比很慢,并且磨练的loss不流失一贯保持在0.33左右,裁减图片为32 x 256后化解,不知底为何,估量要么是互连网层级非常不足,或许特征层数非常不够吗。

小目的实现后,为了最终指标的到位,后续或者尝试方法2,去辨别不定长的粤语字符图片,然则要先去明白LSTM互联网和 CTC模型了。

TensorFlow演练20: 使用深度学习破解字符验证码 Python2.x上运用freetype完成OpenCV2.x的国语输出端到端的OCOdyssey:基于CNN的落实

非 ASCII 码

setTimeout(function () { console.log;}, 2000);fs.readFile('./sample.txt', 'utf-8', function  { console.log;

对此饿汉形式,优点在于落到实处简单。然则存在三个难题就是 instance 只要 Singleton1被加载就能够被创设到static所在的静态方法区。如落到实处数据库连接池等状态,用这种办法一上来将要创建数据库的三番五次财富,实际系统中暂不使用。那就导致了资源的荒凉。由此,对于这种景色,出现了与之相应的懒汉形式。即一开头并不成立对象,待索要运用时再new。

程序1:

  1. 正文基于tensorflow框架实现,重视于tensorflow碰着,提议选择anaconda实行python包处理及条件管理
  2. 本文使用freetype-py 实行磨练集图片的实时变化,同有时间继续也可扩大为能生成汉语字符图片的陶冶集,提议利用pip安装

对于需求占用 n 字节的标志,它首先个字节的前 n 位规定为 1 ,第 n+1 位规定为 0 ,后边 n -1 个字节的前两位一律规定为 10 。比方,“严” 的 unicode 是 4E25(100111000100101),依照 utf-8 的落到实处格局, "严" 的 UTF-8 编码供给多个字节,即格式是 "1110xxxx 10xxxxxx 10xxxxxx " 。

能够见见,通过地点的改写格局,代码清晰了广大。该措施特轻松,具有自然的法力,不过贫乏通用性。

package com.dhb.builder.singleton;public class Singleton1 { private static Singleton1 instance = new Singleton1(); private Singleton1() { } public static Singleton1 getInstance() { return Singleton1.instance; }}
package z; class MyThread1 implementsRunnable{ privateintticket =10; publicvoidrun(){ for(inti = 0; i<500; i++){ if(this.ticket>0){ System.*out*.println(Thread.*currentThread*().getName()+ "卖票---->"+ (this.ticket--)); } } } } public classRunnableDemo { publicstaticvoidmain(String[] args) { // 设计三个线程 MyThread1 mt = newMyThread1(); Thread t1 = newThread(mt, "一号窗口"); Thread t2 = newThread(mt, "二号窗口"); Thread t3 = newThread(mt, "三号窗口"); t1.start(); t2.start(); t3.start(); } } 
 pip install numpy cv2

这时候 ISO 则发布了一款含有全部语言字符的多个字符集 unicode 。

const printData = async function  { let keyword = await readFile; let count = await queryDB; let data = await getData(res.length); console.log;printData('./sample.txt');

艺术二:《effective java》中还大概有一种更简便易行的写法,那正是枚举。也是《effective java》我最为器重的不二等秘书技。

程序2:

  1. 把OCCRUISER的难题看做三个多标签学习的主题材料。4个数字组合的验证码就也就是有4个标签的图纸识别难题(这里的竹签或然不改变的),用CNN来减轻。

  2. 把OC福特Explorer的主题材料作为一个语音识其他标题,语音识别是把一连的节奏转化为文本,验证码识别便是把接二连三的图纸转化为文本,用CNN+LSTM+CTC来消除。

那它是何等解决读的标题啊?化解方法如下

执行generator将会回去四个遍历器对象,用于遍历generator在那之中的景况。

在java中,单例方式的达成情势有如下两种:

一号窗口卖票---->10一号窗口卖票---->9一号窗口卖票---->8一号窗口卖票---->7一号窗口卖票---->6一号窗口卖票---->5一号窗口卖票---->4一号窗口卖票---->3一号窗口卖票---->2一号窗口卖票---->1

这边方法1首要用来缓慢解决固定长度标签的图样识别难点,而艺术2首要用来搞定不定长度标签的图片识别难题,本文达成模式1识别固定19个数字字符的身份ID号

ASCII 表中,各个字符仅占贰个字节,且字节的率先位固定位 0 ,因为 7 位就可见代表 128 个字符。如字母 A 对应的二进制方式是 0一千001 。

行使这种情势的兑现内需三个风云公布/监听的库。上边代码中选取node原生的events模块,当然你能够利用其他你欢愉的库。

com.dhb.builder.singleton.SingletonHolder@55c1b7a6com.dhb.builder.singleton.SingletonHolder@55c1b7a6com.dhb.builder.singleton.SingletonHolder@55c1b7a6com.dhb.builder.singleton.SingletonHolder@55c1b7a6com.dhb.builder.singleton.SingletonHolder@55c1b7a6com.dhb.builder.singleton.SingletonHolder@55c1b7a6com.dhb.builder.singleton.SingletonHolder@55c1b7a6com.dhb.builder.singleton.SingletonHolder@55c1b7a6com.dhb.builder.singleton.SingletonHolder@55c1b7a6com.dhb.builder.singleton.SingletonHolder@55c1b7a6

程序1:

怎么着是字符集?

注意,其中readFilequeryDBgetData方法都急需重返叁个Promise对象。那足以经过在第三有些Promise里提供的法子张开改写。

上述单例实际照旧存在难点,那正是类开端化还是须求时刻,借使还要又五个线程同一时间跻身getInstance方法,第二个线程锁定之后,第3个线程推断不为空,则一向运用instalce,借使那时候第一个线程对Singleton德姆o3对象还没实例化完毕,如该指标内部设有三个耗费时间的援引,假如是多少个数据库连接,则会导致第二个线程使用的指标不完全。出现空指针。由此越来越好的写法是加上volatile。以确认保证happen-before原则。

运营结果:

  1. 何况本文还借助于numpy和opencv等常用库

Unicode 字符集

asyncFunc1(opt,  => { asyncFunc2(opt,  => { asyncFunc3(opt,  => { asyncFunc4(opt,  => { // some operation }); }); });});

下面这种做法,确实消除了线程安全难题,但是带来了三个更为倒霉的难题,那便是每贰次呼吁都会加锁!那样会严重影响属性。更加好的做法是使用重复检查机制:

图片 3多线程.jpg

有图有实质,展现下最广泛的 ASCII 码表吧。

异步编制程序作为JavaScript中的一有的,具备比较重大的职责,它帮忙大家防止同步代码带来的线程阻塞的相同的时间,也为编码与阅读拉动了必然的繁多不便。过多的回调嵌套很轻松会让我们陷入“回调鬼世界”中,使代码形成一团乱麻。为了消除“回调鬼世界”,我们能够使用文中所述的那八种常用方法:

package com.dhb.builder.singleton;public class SingletonDemo4 { private volatile static SingletonDemo4 instance = null; private SingletonDemo4() { } /** * 增加双重检查机制,解决synchronized效率问题 * @return */ public static SingletonDemo4 getInstance() { if(instance == null) synchronized (SingletonDemo4.class) { if (instance == null) { instance = new SingletonDemo4(); } } return instance; }}

首个程序,也便是是拿出多个卖票10张得职务给四人去共同实现,newMyThread相当于创建四个义务,然后实例化八个Thread,创造八个线程即布置八个窗口去实行。

磨炼多少集生成

先是先造成磨炼多少集图片的变动,首要凭借于freetype-py库生成数字/汉语的图样。中间要专一的一点是就是生成图片的大小,本文经过再三品尝后,生成的图片是32 x 256大小的,若是图片太大,则大概形成演习不消退

浮动出来的演示图片如下:

图片 4image.png

gen_image()方法重临image_data:图片像素数量 label: 图片标签 二十二位数字字符 477081934151463759vec : 图片标签转成向量表示 代表每种数字所处的列,总县长度 18 * 10

#!/usr/bin/env python2# -*- coding: utf-8 -*-"""身份证文字+数字生成类@author: pengyuanjie"""import numpy as npimport freetypeimport copyimport randomimport cv2class put_chinese_text: def __init__(self, ttf): self._face = freetype.Face def draw_text(self, image, pos, text, text_size, text_color): ''' draw chinese text with ttf :param image: image(numpy.ndarray) to draw text :param pos: where to draw text :param text: the context, for chinese should be unicode type :param text_size: text size :param text_color:text color :return: image ''' self._face.set_char_size(text_size * 64) metrics = self._face.size ascender = metrics.ascender/64.0 #descender = metrics.descender/64.0 #height = metrics.height/64.0 #linegap = height - ascender + descender ypos = int if not isinstance(text, unicode): text = text.decode img = self.draw_string(image, pos[0], pos[1]+ypos, text, text_color) return img def draw_string(self, img, x_pos, y_pos, text, color): ''' draw string :param x_pos: text x-postion on img :param y_pos: text y-postion on img :param text: text  :param color: text color :return: image ''' prev_char = 0 pen = freetype.Vector() pen.x = x_pos << 6 # div 64 pen.y = y_pos << 6 hscale = 1.0 matrix = freetype.Matrix(int*0x10000L, int(0.2*0x10000L), int(0.0*0x10000L), int(1.1*0x10000L)) cur_pen = freetype.Vector() pen_translate = freetype.Vector() image = copy.deepcopy for cur_char in text: self._face.set_transform(matrix, pen_translate) self._face.load_char kerning = self._face.get_kerning(prev_char, cur_char) pen.x += kerning.x slot = self._face.glyph bitmap = slot.bitmap cur_pen.x = pen.x cur_pen.y = pen.y - slot.bitmap_top * 64 self.draw_ft_bitmap(image, bitmap, cur_pen, color) pen.x += slot.advance.x prev_char = cur_char return image def draw_ft_bitmap(self, img, bitmap, pen, color): ''' draw each char :param bitmap: bitmap :param pen: pen :param color: pen color e.g. - red :return: image ''' x_pos = pen.x >> 6 y_pos = pen.y >> 6 cols = bitmap.width rows = bitmap.rows glyph_pixels = bitmap.buffer for row in range: for col in range: if glyph_pixels[row*cols + col] != 0: img[y_pos + row][x_pos + col][0] = color[0] img[y_pos + row][x_pos + col][1] = color[1] img[y_pos + row][x_pos + col][2] = color[2]class gen_id_card: def __init__: #self.words = open('AllWords.txt', 'r').read().split self.number = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] self.char_set = self.number #self.char_set = self.words + self.number self.len = len(self.char_set) self.max_size = 18 self.ft = put_chinese_text('fonts/OCR-B.ttf') #随机生成字串,长度固定 #返回text,及对应的向量 def random_text: text = '' vecs = np.zeros((self.max_size * self.len)) #size = random.randint(1, self.max_size) size = self.max_size for i in range: c = random.choice(self.char_set) vec = self.char2vec text = text + c vecs[i*self.len:*self.len] = np.copy return text,vecs #根据生成的text,生成image,返回标签和图片元素数据 def gen_image: text,vec = self.random_text() img = np.zeros([32,256,3]) color_ = (255,255,255) # Write pos =  text_size = 21 image = self.ft.draw_text(img, pos, text, text_size, color_) #仅返回单通道值,颜色对于汉字识别没有什么意义 return image[:,:,2],text,vec #单字转向量 def char2vec: vec = np.zeros() for j in range: if self.char_set[j] == c: vec[j] = 1 return vec #向量转文本 def vec2text(self, vecs): text = '' v_len = len for i in range: if(vecs[i] == 1): text = text + self.char_set[i % self.len] return textif __name__ == '__main__': genObj = gen_id_card() image_data,label,vec = genObj.gen_image() cv2.imshow('image', image_data) cv2.waitKey

读取时,自动忽略那些定位的描述音信后,再查看 unicode 规定的字符标准,即可获得相应字符了。

能够见到,generator贯彻端到端的OC本田UR-V,字符编码笔记。函数有二个最大的性状,能够在内部实行的长河中交出程序的调节权,yield也就是起到了一个间断的功用;而当自然景况下,外界又将调整权再移交回来。

能够见到SingletonHolder类只实例化了三遍。这种格局很神奇地使用叁个之中类,相当的粗略的代码即落到实处了单例,并且是线程安全。

在其次种方式中,由于3个Thread对象共同试行二个Runnable对象中的代码,由此也许会招致线程的不安全,比方或者ticket会输出-1(借使大家System.out....语句前增进线程休眠操作,该意况将很有比较大概率出现)。

 pip install freetype-py

总括下就是,ASCII 只适用于阿拉伯语,而落实了 unicode 编码的 utf-8 适用于具有的言语符号,且包容 ASCII 码,所今后来全数关乎编码的难题,都钦点为 utf-8 哦。

然而,有的异步方法无法张开改动,只怕大家供给动用原生Promise,那就必要我们手动实香港行政局地退换。上面提供一种改换的不二等秘书诀。

package com.dhb.builder.singleton;public class SingletonDemo2 { private static SingletonDemo2 instance = null; private SingletonDemo2() { } /** * 增加同步机制,解决线程安全 * @return */ public static synchronized SingletonDemo2 getInstance() { if(instance == null) { instance = new SingletonDemo2(); } return instance; }}

抢先二分之一动静下,假如只想重写run() 方法,而不重写别的 Thread 方法,那么应运用 Runnable 接口。那很器重,因为独有程序猿筹划修改或增长类的中央表现,不然不应当为此类创制子类。

  1. 本文不现实介绍CNN 具体达成原理,不掌握的提出参照他事他说加以考察集智博文卷积:怎么样成为多少个相当的厉害的神经互连网,那篇小说写得很
  2. 正文落成思路很轻易通晓,便是把贰个不改变排列十九个数字组合的图纸作为三个多标签学习的题目,标签的长短能够Infiniti制改造,只要是原则性长度的,那么些训练方法都以适用的,当然现实中比比较多情状是急需识别不定长度的竹签的,这一部分就必要采用格局2(CNN+lSTM+CTC)来消除了。

对于非乌Crane语的国家,1三十多少个字符不恐怕代表他们的言语,那时候开头把后面闲置的一位也给用上了,倒是能化解部分主题素材。但要么非常不足用,例如汉语远远不仅256 个字符,那时候就要寻求越来越高等的字符集了。

异步编制程序在JavaScript中万分关键。过多的异步编制程序也带了回调嵌套的标题,本文子禽提供一些缓和“回调鬼世界”的方法。

package com.dhb.builder.singleton;import java.util.stream.IntStream;public class SingletonHolder { private SingletonHolder() { } private static class InstanceHolder{ private final static SingletonHolder INSTANCE = new SingletonHolder(); } public static SingletonHolder getInstance() { return InstanceHolder.INSTANCE; } public static void main(String[] args) { IntStream.rangeClosed.forEach(i -> new Thread(String.valueOf{ @Override public void run() { System.out.println(SingletonHolder.getInstance; } }.start; }}

1 通过持续Thread类,重写Thread的run()方法,将线程运维的逻辑放在中间

眼前在研讨OC奥迪Q3识别相关的事物,最后指标是能辨识居民身份证上的富有汉语汉字+数字,可是本文先设定三个小目的,先识别定长为18的身份ID号,当然本文的思绪也是足以复用来识别定长的验证码识别的。本文达成思路重要来源于Xlvector的博客,选择基于CNN完成端到端的OC兰德卡宴,上边援用博文介绍目前依赖深度学习的二种OCOdyssey识别方法:

接下来,从字符对应的末梢贰个二进制位开端,依次从后迈入填入格式中的 x,多出的位补 0 。所以,"严"的 UTF-8 编码是 "11100100 1011100010100101"。

本文由必赢网上注册发布于必赢网上注册,转载请注明出处:贯彻端到端的OC本田UR-V,字符编码笔记

关键词:

深深分析Java垃圾回收机制,Java源码剖判

引进垃圾回收 怎么样内部存款和储蓄器供给回收? 引用计数法 可达性深入分析 怎么回收 Marking 标记 Normal Deletion 清...

详细>>

【必赢网上注册】一言不和就和好写了个编制程

stringCollection .stream() .filter - s.startsWith .forEach(System.out::println); 理当如此感觉这么些知识点自身一度很掌握了,但近些...

详细>>

Web前端好书推荐,程序猿代码下的陈为军

雄心万丈算法就是那般的算法,它在每一步中都做出那时看起来最棒的选项,它总是做出局地最优选取进而完成最优...

详细>>

Java新手极简指北手册,十年学会编制程序

来源China Scala User Group 微信群的一段话,讲的很风趣,这里摘录一下: 之剑 2016.5.3 23:41:46 运维机制 Peter Norvig:十年学会编...

详细>>