C语言推荐书籍从入门到进阶

  categories:资料  author:

极客侠网站导航(全部书单资源导航页):https://pymlovelyq.github.io/archives/

前言:技术书阅读方法论总结

一.速读一遍(最好在1~2天内完成)

人的大脑记忆力有限,在一天内快速看完一本书会在大脑里留下深刻印象,对于之后复习以及总结都会有特别好的作用。
对于每一章的知识,先阅读标题,弄懂大概讲的是什么主题,再去快速看一遍,不懂也没有关系,但是一定要在不懂的地方做个记号,什么记号无所谓,但是要让自己后面再看的时候有个提醒的作用,看看第二次看有没有懂了些。

二.精读一遍(在2周内看完)

有了前面速读的感觉,第二次看会有慢慢深刻了思想和意识的作用,具体为什么不要问我,去问30年后的神经大脑专家,现在人类可能还没有总结出为什么大脑对记忆的完全方法论,但是,就像我们专业程序员,打代码都是先实践,然后就渐渐懂了过程,慢慢懂了原理,所以第二遍读的时候稍微慢下来,2周内搞定。记住一句话:没看完一个章节后,总结一下这个章节讲了啥。很关键。

三.实践(在整个过程中都要)

实践的时候,要注意不用都去实践,最好看着书,敲下代码,把重点的内容敲一遍有个肌肉记忆就很不错了。
以及到自己做过的项目中去把每个有涉及的原理的代码,研究一遍,就可以了

一共四个系列整整32本电子书,找了好久终于齐了,如果都能看完看懂且科学的总结外加合理的实践,相信未来你的技术路会更好走,当然阿里巴巴,腾讯,阿里这些的Offer不将是梦,除了多看点技术书,你觉得还有什么能拿出来和985,211的朋友比呢?
最后 附上这32本书的电子版链接:

所有资源百度网盘链接:https://pan.baidu.com/s/1C0RDhilrwlmEIZ811oAZoA
提取码:s9si
复制这段内容后打开百度网盘手机App,操作更方便哦
备注:里面已经顺便整理压缩好,需要下载后才可以打开,网盘直接打开会显示损坏。

资源图示(下载链接如上):
0.png

以下是每本书的推荐语,清楚自己缺的是什么,就下定决心去补吧,一个好工作意味着高收入,投资自己的时间换来更宝贵的东西。

一.C语言入门,初学,编程基础系列

1.《C语言程序设计:现代方法》(第2版)

1.jpg

推荐理由:时至今日, C语言仍然是计算机领域的通用语言之一,但今天的 C语言已经和最初的时候大不相同了。本书最主要的一个目的就是通过一种“现代方法”来介绍 C语言,书中强调标准 C,强调软件工程,不再强调“手工优化”。这一版中紧密结合了 C99标准,并与 C89标准进行对照,补充了 C99中的最新特性。本书分为 C语言的基础特性、 C语言的高级特性、 C语言标准库和参考资料 4个部分。每章末尾都有一个“问与答”小节给出一系列与该章内容相关的问题及答案,此外还包含适量的习题。
本书是为大学本科阶段的 C语言课程编写的教材,同时也非常适合作为其他课程的辅助用书。

2.《C语言程序设计》(第2版)谭浩强版本

2.jpg

这本书堪称经典之作初学者学习可以看看,这个就是零基础入门学习C语言的,上手快。但也要坚持上机,要是只看书,不在电脑上运行一下看看,是永远学不会的。关键在实践!坚持!

不过这本书被诟病的地方也不少,可以看完上面那本再看这本,很多东西就懂了。

阅读全文

C语言的编译链接过程的介绍

  categories:资料  author:

在Ignite上运行微服务

  categories:资料  author:

在Ignite上运行微服务

从本文开始,会通过一个系列的篇幅来介绍使用Apache Ignite内存数据组织平台来构建容错、可扩展的基于微服务的解决方案。

详细信息参考:https://liyuj.gitee.io/doc/java/ServiceGrid.html

介绍

当前,很多公司都会将自己的应用或者解决方案构建于微服务架构之上,这样做的主要好处是,可以将一个解决方案拆分为一组松耦合的软件组件(微服务)。这些软件组件可能有自己的版本以及生命周期,甚至有自己的开发团队。此外,这些软件还可能使用不同的语言和技术来开发和维护。但是因为所有的微服务都会是更大的构件(软件或者解决方案)的一部分,所以它们至少需要一个机制来进行彼此的交互和数据交换。

同时,基于微服务的解决方案也会用于高负载或者需要处理快速增长的数据的场景,因此和不是基于微服务的应用和解决方案一样,它也会面临同样的问题和困难。

  • 面向磁盘的数据库已经无法跟上快速增长的数据量,这些数据需要以并行的方式进行存储和处理,数据库正在成为整个应用或者解决方案的性能瓶颈;
  • 软件的高可用性保证作为一个好功能已经成为过去式,当前,应用的高可用性已经成为事实上的标配。

从本文开始,会通过一个系列的篇幅来一步步地介绍使用Apache Ignite内存数据组织平台来构建容错、可扩展的基于微服务的解决方案。

使用Apache Ignite的基于微服务的解决方案

下图会描述整个解决方案的主要构成,之后会深入,一个一个定义它们的角色。

1

Ignite集群层

集群有两个作用:

首先,作为主要的数据存储,它直接在内存中保存数据集。因为数据离CPU更近,一个微服务不需要从磁盘上获取数据,这显著地提升了整体的性能。从上图来看,我们指定了一个特定的集群组(数据节点)来专门处理这个问题。

一个数据节点是一个Ignite服务端节点,它持有数据集的一部分,并且可以执行查询和计算。另外,有赖于基于对象序列化的二进制格式化技术,一个数据节点不需要部署模型对象和计算的支撑类,这个叫做对等类加载机制,它可以管理从应用逻辑节点(服务节点)预加载的计算类。

其次,集群管理微服务的生命周期,并且为微服务配备所有必要的API,比如与其他服务或者数据节点进行通信的API。要达到这一点,一个基于Ignite集群的解决方案需要包含前述的服务节点,这些节点部署有微服务,并且应用逻辑也在这里执行。一个服务节点可以部署一个或者多个微服务,这个取决于具体的应用以及负载情况。每个微服务都需要实现Ignite的Service接口,它直接就有了容错和访问其他微服务的能力。

Ignite会处理在服务节点范围内,一个微服务的一个或者多个副本的部署,并且会自动地进行容错和负载平衡。在上述的图1中,这类微服务被命名为MS<N>(MS1,MS2等)。在多个服务和数据节点间传播负载的好处是,如果MS1微服务改变,不需要重启整个集群,所有需要做的就是在部署有MS1微服务的服务节点上更新MS1的相关类,因此只有所有节点的一个子集需要重启。

所有的节点(服务和数据节点)都是相互连接的,这使得部署在一个服务节点上的MS1可以与部署在任何其他的或者自身服务节点上的微服务进行通信,也可以向任何数据节点获取和发送数据以及计算。

持久化存储层

这一层是可选的,可以用于如下的场景:

  • 在内存中持有所有的数据是不必要或者不可行的;
  • 需要从基于磁盘的副本中恢复数据集的能力,这时整个集群需要停机或者需要重启。

要启用持久化存储层,只需要简单地提供一个实现了CacheStore接口的Ignite数据缓存就可以了。在默认支持的实现中,有RDBMS,MongoDB以及Cassandra。

外部应用层

这是微服务架构应用的”用户”,基本上来说,这是一个触发调用一个一个微服务的各种执行流程的层次。

这个层可以使用具体到每个微服务的外部协议来与微服务进行通信(而在内部,微服务间相互通信可以使用Ignite服务,或者使用Ignite客户端连接进行连接),这方面都很大的灵活性以及多样化的选择。

—-

作为一个系统,一个可能的架构由如下层次组成:

  • Ignite集群层
  • 持久化存储层
  • 外部应用层

1

本文中会关注第一层(Ignite集群层),可以参考一个GitHub项目,他包含了日常中实现拟议的微服务架构所必须的构建块,尤其是要覆盖如下部分:

  • 配置和启动数据节点;
  • 使用Ignite的服务API的典型服务实现;
  • 配置和启动驻有Ignite服务的服务节点;
阅读全文

ignite-架构概述

  categories:资料  author:

为了更好地理解Apache Ignite和用例的功能,理解它的体系结构和拓扑结构非常重要。通过更好地理解Ignite的体系结构,可以决定拓扑或缓存模式,以解决企业体系结构场景中的不同问题,并从内存计算中获得最大的益处。与主从设计不同,Ignite使用了一个完全对等的架构。ignite集群中的每个节点都可以接受读写,无论数据在哪里写入。本章主要内容:

  • 功能概述
  • 不同的集群拓扑
  • 集群拓扑结构
  • 缓存策略
  • 集群划分
  • 数据模型
  • 多数据中心复制
  • 异步支持
  • SQL查询如何在Ignite中工作
  • 弹性

功能概述

Ignite体系结构具有足够的灵活性和高级特性,可用于大量不同的体系结构模式和风格。您可以将Ignite看作是一组独立的、集成良好的内存中组件的集合,以提高应用程序的性能和可伸缩性。下面的示意图表示Apache Ignite的基本功能:

Ignite是以模块化的方式进行组织,并为每个功能提供一个jar(库)。您只需将所需的库应用到项目中,就可以使用Ignite。

集群拓扑

Ignite的设计表明整个系统本身就具有固有的可用性和可扩展性。ignite节点间通信允许所有节点接收更新,无需一个快速的主协调器。节点可以不受干扰地添加或删除,以增加可用RAM的数量。
Ignite数据结构具有完全的弹性,允许对单个服务器或多个服务器进行无干扰的自动检测和恢复。

客户端和服务端

Apache Ignite具有一个可选的服务概念,并提供了两种类型的节点:客户端和服务器节点。

  • Server 包含数据、缓存、计算和流,并且可以是内存中的Map-Reduce任务的一部分。
  • Client 提供远程连接服务器以将元素放入/获取到缓存的能力。它还可以存储部分数据(近缓存),这是一个较小的本地缓存,存储最近和最频繁访问的数据。

    还可以将服务器节点分组到一个集群中执行工作。在集群中,可以限制作业执行、服务部署、流和其他任务只在集群组中运行。
    你可以基于任何谓词创建一个集群组。例如,您可以从一组节点创建一个集群组,其中所有节点负责为testCache缓存数据。默认情况下,所有节点都作为服务节点启动。客户端模式需要显式启用。注意,您不能物理地将数据节点与计算节点分离。在Apache Ignite中,包含数据的服务器也用于执行计算。Apache Ignite客户机节点也参与作业执行。乍一看,这个概念似乎很复杂,但让我们试着澄清这个概念。服务器节点总是存储数据,默认情况下可以参与任何计算任务。另一方面,客户端节点可以操作服务器缓存、存储本地数据并参与计算任务。通常,客户端节点用于从缓存中放置或检索数据。这种混合客户端节点在开发具有多个节点的大型Ignite网格时提供了灵活性。客户端和服务器节点都位于一个网格中,在某些情况下(例如,数据节点中的大容量acid事务),您不希望在数据节点上执行任何计算。在这种情况下,您可以通过创建相应的集群组来选择只在客户端节点上执行作业。通过这种方式,您可以在一个网格中将数据节点与计算节点分开。可以使用以下伪代码对客户端进行计算:

ClusterGroup clientGroup = ignite.cluster().forClients(); IgniteCompute clientCompute = ignite.compute(clientGroup);
// Execute 
阅读全文

Ignite的集群部署

  categories:资料  author:

Ignite的集群部署

Ignite具有非常先进的集群能力,本文针对和集群有关的技术点做一个简短的介绍,然后针对实际应用的可能部署形式做了说明和对比,从中我们可以发现,Ignite平台在部署的灵活性上,具有很大的优势。

Ignite的设计表明整个系统本身就具有固有的可用性和可扩展性。ignite节点间通信允许所有节点接收更新,无需一个快速的主协调器。节点可以不受干扰地添加或删除,以增加可用RAM的数量。
Ignite数据结构具有完全的弹性,允许对单个服务器或多个服务器进行无干扰的自动检测和恢复。

客户端和服务端

Apache Ignite具有一个可选的服务概念,并提供了两种类型的节点:客户端和服务器节点。

  • Server 包含数据、缓存、计算和流,并且可以是内存中的Map-Reduce任务的一部分。
  • Client 提供远程连接服务器以将元素放入/获取到缓存的能力。它还可以存储部分数据(近缓存),这是一个较小的本地缓存,存储最近和最频繁访问的数据。

    还可以将服务器节点分组到一个集群中执行工作。在集群中,可以限制作业执行、服务部署、流和其他任务只在集群组中运行。
    你可以基于任何谓词创建一个集群组。例如,您可以从一组节点创建一个集群组,其中所有节点负责为testCache缓存数据。默认情况下,所有节点都作为服务节点启动。客户端模式需要显式启用。注意,您不能物理地将数据节点与计算节点分离。在Apache Ignite中,包含数据的服务器也用于执行计算。Apache Ignite客户机节点也参与作业执行。乍一看,这个概念似乎很复杂,但让我们试着澄清这个概念。服务器节点总是存储数据,默认情况下可以参与任何计算任务。另一方面,客户端节点可以操作服务器缓存、存储本地数据并参与计算任务。通常,客户端节点用于从缓存中放置或检索数据。这种混合客户端节点在开发具有多个节点的大型Ignite网格时提供了灵活性。客户端和服务器节点都位于一个网格中,在某些情况下(例如,数据节点中的大容量acid事务),您不希望在数据节点上执行任何计算。在这种情况下,您可以通过创建相应的集群组来选择只在客户端节点上执行作业。通过这种方式,您可以在一个网格中将数据节点与计算节点分开。可以使用以下伪代码对客户端进行计算:

ClusterGroup clientGroup = ignite.cluster().forClients(); IgniteCompute clientCompute = ignite.compute(clientGroup);
// Execute computation on the client nodes. clientCompute.broadcast(() -> System.out.println("sum of: " + (2+2)));

这种方法有一个缺点。使用这种方法,数据将被分配给独立的节点,并且为了计算这些数据,所有的客户端节点都需要从服务器节点检索数据。它可以产生大量的网络连接并产生延迟。但是,您可以在一个主机上单独的JVM上运行客户机和服务器节点,以减少网络延迟。从部署的角度来看,Apache Ignite服务器可以分为以下几个组:

  • 内置应用程序
阅读全文

shade插件解决打包后无法加载spring xsd文件办法

  categories:资料  author:

有时候,需要将复杂的项目, 包括各种xml文件属性文件, 类, jar等等打包到一个可以执行的jar包中, 然后用java -jar  xxx.jar 来运行项目, 这样简单方便, 特别是在编写一些测试工具时,尤为重要。

但是经常发现打包后的项目无法启动, 其中一大类是您项目有问题, 但是这个相对好解决, 毕竟自己的项目可以在windows下的ide中做各种调试,测试都测试好了, 在打包一般程序问题的概率就低得多了。

但是另外一类问题就是spring 需要在加载的时候获取spring的xsd文件, 通常这些文件都是可以动态从网络下载的, 因此在网络畅通情况下, 还是不是问题的。

问题是, 当您的系统部署到服务器时, 可能会有问题, 通常我们的生产环境的内部服务器一般都是限制访问外部网络的, 因此这个时候, 您就发现无法加载spring的 xsd文件了, 因此您的项目或者工具也无法使用了。

在您本地开发环境偶尔也可能有这个问题。

通常解决的办法是采用maven的shade插件进行打包, 并且在打包时设置一下spring xsd文件的处理方式, 一般就可以解决。

另外采用maven打包中还有jar差距, 和另外一个插件打包, 这两个方式的解决就比较麻烦了, 也许新版的相关差距会好些。下面摘录了 相关的从网络上获取的资料。因为有资料了就不在重复写了,贴到这里。

————-

问题的产生:有个Java项目(Jar文件),每半小时重启一次,对外提供服务。

阅读全文

树莓派3 之 安装Mysql服务

  categories:资料  author:

需求

在树莓派上 安装Mysql 服务,并开启远程访问

步骤

安装 mysql server

1
sudo apt-get install mysql-server

我以为中间会让我提示输入 数据库root的密码,没想到一帆风顺,直接完成,我要疯了,密码到底是什么了。通过搜索发现,可以使用如下命令,空密码登录

1
sudo mysql -u root

设置root密码

1
2
3
4
5
use mysql;
update user set plugin='mysql_native_password' where user='root';
UPDATE 
阅读全文

Apache Phoenix介绍

  categories:资料  author:

http://phoenix.apache.org/

1. Phoenix定义
Phoenix最早是saleforce的一个开源项目,后来成为Apache基金的顶级项目。

Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs而不是HBase客户端APIs来创建表,插入数据和对HBase数据进行查询。

put the SQL back in NoSQL

Phoenix完全使用Java编写,作为HBase内嵌的JDBC驱动。Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫描,并编排执行以生成标准的JDBC结果集。直接使用HBase API、协同处理器与自定义过滤器,对于简单查询来说,其性能量级是毫秒,对于百万级别的行数来说,其性能量级是秒。

HBase的查询工具有很多,如:Hive、Tez、Impala、Spark SQL、Phoenix等。

Phoenix通过以下方式使我们可以少写代码,并且性能比我们自己写代码更好:

  • 将SQL编译成原生的HBase scans。
  • 确定scan关键字的最佳开始和结束
  • 让scan并行执行

使用Phoenix的公司

Paste_Image.png

2. 历史演进

  • 3.0/4.0 release

ARRAY Type. 支持标准的JDBC数组类型

Sequences. 支持 CREATE/DROP SEQUENCE, NEXT VALUE FOR, … 阅读全文

算法–递推策略

  categories:资料  author:

递推法是一种重要的数学方法,在数学的各个领域中都有广泛的运用,也是计算机用于数值计算的一个重要算法。这种算法特点是:一个问题的求解需一系列的计算,在已知条件和所求问题之间总存在着某种相互联系的关系,在计算时,如果可以找到前后过程之间的数量关系(即递推式),那么,从问题出发逐步推到已知条件,此种方法叫逆推。无论顺推还是逆推,其关键是要找到递推式。这种处理问题的方法能使复杂运算化为若干步重复的简单运算,充分发挥出计算机擅长于重复处理的特点。

递推算法的首要问题是得到相邻的数据项间的关系(即递推关系)。递推算法避开了求通项公式的麻烦,把一个复杂的问题的求解,分解成了连续的若干步简单运算。一般说来,可以将递推算法看成是一种特殊的迭代算法。

引例:Fibonacci数列

Fibonacci数列的代表问题是由意大利著名数学家Fibonacci于1202年提出的“兔子繁殖问题”(又称“Fibonacci问题”)。

问题:

一个数列的第0项为0,第1项为1,以后每一项都是前两项的和,这个数列就是著名的裴波那契数列,求裴波那契数列的第N项。

算法:

f[0]:=0; f[1]:=1;

for i:=2 to n do f[i]:=f[i–1]+f[i–2];

总结:

从这个问题可以看出,在计算裴波那契数列的每一项目时,都可以由前两项推出。这样,相邻两项之间的变化有一定的规律性,我们可以将这种规律归纳成如下简捷的递推关系式:Fn=g(Fn-1),这就在数的序列中,建立起后项和前项之间的关系。然后从初始条件(或是最终结果)入手,按递推关系式递推,直至求出最终结果(或初始值)。很多问题就是这样逐步求解的。

对一个试题,我们要是能找到后一项与前一项的关系并清楚其起始条件(或最终结果),问题就可以递推了,接下来便是让计算机一步步了。让高速的计算机从事这种重复运算,真正起到“物尽其用”的效果。

递推概念

给定一个数的序列H0,H1,…,Hn,…若存在整数n0,使当n>n0时,可以用等号(或大于号、小于号)将Hn与其前面的某些项Hi(0<i<n)联系起来,这样的式子就叫做递推关系。
  • 如何建立递推关系
  • 递推关系有何性质
  • 如何求解递推关系

解决递推问题的一般步骤

  • 建立递推关系式
  • 确定边界条件
  • 递推求解

递推的两种形式

顺推法和倒推法

递推的应用分类

阅读全文

Ignite SQL Getting Started

  categories:资料  author:

Getting Started

Ignite SQL Getting Started

Overview

Today, SQL is still a very popular language for data definition, data manipulation and querying in

阅读全文


快乐成长 每天进步一点点      京ICP备18032580号-1