善始善终

如何获取SAP BTP账户及BAS启用 返回到 Service Marketplace 点击SAP Business Application Studio 然后go to Application。进入子用户的OverView里面找到Entitlements添加SAP Business Application Studio。注意:在选购BTP免费环境的时候,使用人要选公司才可以成功。在完成上述操作后,就可以登陆Cockpit。这里有SAP官方的BTP试用的手顺链接。配置权限※我绑定的是登录时的邮箱。※过程中有问题可以在评论区讨论。 阅读详情

互斥锁的加锁解锁,动态内存的申请释放,都较难驾驭且容易出错。所幸我在Z和H公司所写的代码都有意或无意的避免了这两个问题。当时所涉及的是基于VxWorks的嵌入式编程,在进程调度方面系统控制层做了限制,每个进程处理完自己的消息任务后才会调度另一个进程运行,因此避免了进程并发的情况,也就无需对临界资源进行加锁。另一方面,嵌入式系统对实时性要求很高,系统中所需要的内存都在初始化时全部申请完成,并且一直不释放直到系统关机。我们称这样的内存为静态内存,因此也就绕开了动态申请和释放内存的情况。

但在应用系统中多线程编程不可避免,系统并发时需要对临界区访问进行控制。比如对一个公共列表中元素的插入和删除,如果不进行锁控制,当多线程并发对其操作时,可能造成对列表的破坏,最终导致程序异常。锁临界区时要把握以下几点:

  • 最小化原则

临界区的代码应该是最小化的。从加锁到解锁的这段代码,应该只包括必须的操作。任何多余的操作都要剔除到临界区外。

锁的粒度要准确,在需要针对某个对象加锁的地方,就不要使用针对类的锁(会锁住类的所有对象),这样会把更多的线程锁在外面,影响效率。

  • 所有异常分支都要解锁

加锁和解锁的操作要放在同一个函数里,这样易于维护。同时在每个异常分支return之前都需要解锁。当函数异常分支较多时,只要某个分支忘了解锁的操作,就会出现死锁,这是一个容易出错的地方。对于Java代码可以使用finally分支,因为函数在return之前,不管什么场景都会进入finally分支。

void  java_function ()

       lock.lock();

       try {

              //流程处理

       } catch (Exception e) {

              //异常处理

       }

       finally{

              lock.unlock(); ß在finally分支解锁,不会遗漏

       }

}

如果是C/C++,建议使用goto到函数末尾统一解锁,不要在中途return:

void  c_cplusplus_function ()

{

       lock(&mylock);

       err = get_some_thing();

       if (err) {

// spin_unlock(&mylock);

              // return;

              goto finish; ß不要return,goto到最后做解锁操作

       }



finish:

       spin_unlock(&mylock);

       return;

}

如果上述代码在每个异常分支都return的话,需要在每个分支都进行解锁,这样容易遗漏。

如果是C++程序,还有一种更简单的办法,只需要一行代码进行加锁,而且不需要解锁操作:

void  CPlusPlusFunction ()

{

       DoLock(mLiskLock);

       //进行程序处理,无需调用解锁函数

       return;

}

该方法的实现原理如下:第一行代码DoLock(mLiskLock)实际上构造了一个临时的锁管理对象,在该对象的构造函数中调用了mLiskLock的Enter函数进行加锁,同时在析构函数中调用mLiskLock的Leave函数进行解锁。当CPlusPlusFunction运行完成时,该临时对象会被销毁,其析构函数会被调用,从而程序保证了对解锁函数的调用。在示例程序LockDemo中给出了使用示例,你可以直接使用其中的lock.h,其代码如下:

#pragma once

#include <atlsync.h>



class CCriticalSectionLock

{

public:

       explicit CCriticalSectionLock(CCriticalSection &cs)

       {

              m_pCS=&cs;

              m_pCS->Enter();

       }

       ~CCriticalSectionLock()

       {

              m_pCS->Leave();

       }



protected:

       CCriticalSection* m_pCS;

};



#define DoLock(x)  CCriticalSectionLock x##_lock(x)  //构造临时锁管理对象
  • 避免强制结束线程

在我们的一个Windows应用系统中,有些锁是在线程中进行加锁的。由于某些业务场景的需要,在程序运行中会在上层直接kill这些线程(使用Windows API TerminateThread结束线程)。而如果在结束线程时,还没有进行相应的解锁操作,就会导致这些锁永远无法释放。当新的线程进行加锁时,就会永远被阻塞。改进的办法是,我们放弃了使用TerminateThread直接结束线程,而是通过退出标记让线程自己结束。因此在写涉及锁的程序时一定要留意系统及编程语言的特性,避免类似问题。

动态内存的申请和释放同样需要注意一下几个原则:

  • 谁申请谁释放

这里所说的“谁”是指模块。比如A模块申请了一片内存,就得A模块来释放。这样逻辑清晰便于管理。以前还碰到过类似的代码:

class CMyClass
{
public:
	~CMyClass()
	{
		delete this; 自己删除自己
	}
};

在析构函数中调用了delete this,相当于自己删除自己。首先任何对象都是由第三方模块创建的,肯定不会自己创建自己。这里的自己删除自己违反了谁申请谁释放的原则,同时非常难于维护。

  • 申请和释放相匹配

熟读API规范,内存的申请和释放函数需要相互匹配。比如C++里,new申请的内存用delete释放,malloc申请的内存用free释放。new []申请的数组要用delete []释放,否则同样会导致内存泄露[Scott Meyers]。

  • 留意GDI资源

Windows程序设计中GDI资源和内存申请一样,如果没有正确的释放GDI资源,同样会造成GDI资源泄露,严重时会影响整个操作系统。比如BeginPaint和EndPaint要配对使用:

hdc = BeginPaint (hwnd, &ps) ;
    [use GDI functions]
EndPaint (hwnd, &ps) ;

GetDC和ReleaseDC配对使用:

hdc = GetDC (hwnd) ;
    [use GDI functions]
ReleaseDC (hwnd, hdc) ;

CreateDC和DeleteDC配对使用:

hdcMem = CreateCompatibleDC (hdcEMF) ;
    [use GDI functions]
DeleteDC (hdcMem) ;

这类问题容易被忽视且难以发现。可以在Windows的任务管理器中把GDI对象勾上,这样可以在进程运行的过程中查看GDI对象的使用数量。如果该数量逐渐变大且没有变小的迹象,则很可能存在GDI资源泄露。此时你需要对代码进行排查了。

CMOS传输门实战:如何用模拟开关优化你的电路设计(附常见问题排查) 本文深入探讨了CMOS传输门在电路设计中的实战应用与优化策略。文章从核心参数选型入手,详细分析了导通电阻、电荷注入等关键特性对电路性能的影响,并提供了多路复用器构建、精密电路应用等实战架构。同时,重点分享了PCB布局、电源去耦的工程细节,以及开关不导通、信号失真、高频性能不足等常见问题的系统性排查指南,旨在帮助硬件工程师充分发挥CMOS模拟开关的效能,提升电路设计的可靠性与精度。 阅读详情

相关推荐

关于mos管的压降问题(项目遇到问题总结)

在研发过程中没有出现问题的板子,到了小批时竟出现雷达一直在触发???找了大几天,没有头绪。心中疑惑颇多,加上老板催促,自考等原因,真是压力山大。4月份自考,只有差不多一个月时间了吧,没有什么大的收获,反而在查找硬件问题的过程中,发现了一个自己忽视的一个问题,就是关于Mos管的压降问题。 备考的过程崎岖不平,工作又问题多多,孰轻孰重,如何取舍?从心理来说,不想取舍什么,只是有所得就可以,过不了就过不了呗,已经毕业十五年了,没这个本科文凭不也过来了吗?只是代表了自己在这一段时间的思考,自己兴趣吧,没什么大不了

guangod的博客 2万+

并发场景下同步代码块性能优化解析

使用并发编程的目标是为了提升系统性能,引入多线程后,其实会引入额外的开销,如线程之间的协调、增加的上下文切换,线程的创建和销毁,线程的调度等等。过度或不恰当的使用,可能会导致多线程程序性能甚至比单线程还要低。 影响性能的因素 上下文切换 是指CPU 从一个进程或线程切换到另一个进程或线程。一次上下文切换花费5000~10000个时钟周期,几微秒。在上下文切换过程中,CPU会停止处理当前运行的程序,...

xiaolyuh的专栏 690

【时序列】时序列数据如何一步步分解成趋势(trend)季节性(seasonality)和误差(residual)- 详细理解python sm.tsa.seasonal_decompose

【时序列】时序列数据如何一步步分解成趋势(trend)季节性(seasonality)和误差(residual)- 详细理解python sm.tsa.seasonal_decompose 在做时序列分析的时候,好多教程都告诉你要把时序列分解成趋势,季节性,残差,然后画图看一下有没有趋势变化,有没有季节性。像这样: import statsmodels.api as sm decomposition = sm.tsa.seasonal_decompose(train['Count'] ,model='add

weixin_47442572的博客 2万+

并发编程中需要谨记的规则(翻)

并发编程中需要谨记的规则   最小化临界区          Amdahl定律和Gustafson定律都将并行算法中的顺序执行的工作视为性能问题的头号敌人。两个执行代码区段中间的时间需要顺序执行,这就是众所周知的临界值。在图1-16的分析Gustafson定律的图表中有四个这样的临界区。   图 1-16            当你并行化你的任务的时候,为了实现最好的性能我们

无风听海 7207

Nengo神经工程框架:脉冲神经网络的实时编译与硬件部署

脉冲神经网络(SNN)作为类脑计算的核心范式,正从生物模拟走向工程落地。其本质是用离散脉冲建模神经动力学,关键在于实现可预测、可复现的神经行为而非单纯拟合函数。Nengo基于神经工程学框架(NEF),将动态系统理论与硬件约束深度融合,通过解析式权重计算、确定性时间步长(dt)和多后端编译能力,支撑从CPU仿真到Loihi/FPGA的端到端部署。它不替代深度学习框架,而是提供面向神经形态芯片的‘神经编译器’能力,使LIF神经元参数、突触动力学与硬件时序严格对齐,显著提升实时性、能效比与物理可解释性。

weixin_32533659的博客 636

Xilinx HydraMini试玩教程

HydraMini是Xilinx推出的基于Pynq-Z2开发板的自动驾驶开发小车,其有着简单易学、高灵活性、高扩展性、高性能等优良特性,是研究人员和学生进入自动驾驶领域的一个平台。本教程会通过最基础的讲解和步骤带领读者熟悉这个平台的基本开发流程。

qq_25762163的博客 1772

善始善终才能增加项目成功的机会

对于各个级别的管理人员来说,善始善终都是非常重要的——不管你现在是在负责一个耗资数千万美元的开发项目,还是在完成部门的业绩报告。 不能善始善终的管理人员不可避免的会在工作中遇到一系列的麻烦:项目出现问题、失去领导和下属的信任、浪费了公司的资金和时间、甚至还会遭到下岗或是被解雇的命运。 Larraine Segil是洛杉机的一名管理咨询顾问,她在加州技术学院教授管理教育课程,曾经同包括Sun、惠

软件开发资料汇总 383

RIGOL DS1102E示波器新手必看:从开机到捕获第一个波形的5分钟指南

本文为RIGOL DS1102E示波器新手提供了一份快速上手指南。内容涵盖从开机、探头校准到捕获第一个波形的完整流程,重点解析了触发设置、自动测量等核心操作,并指出了探头衰减比设置等常见误区,帮助用户快速掌握这款经典数字示波器的基本使用方法。

dream的博客 739

善始善终才能增加项目成功的机会 (转)

对于各个级别的管理人员来说,善始善终都是非常重要的——不管你现在是在负责一个耗资数千万美元的开发项目,还是在完成部门的业绩报告。 不能善始善终的管理人员不可避免的会在工作中遇到一系列的麻烦:项目出现问题、失去领导和下属的信任、浪...

ctb3518的博客 166

BP神经网络回归预测+SHAP可解释分析+新数据预测(MATLAB完整源码)

BP神经网络回归预测+SHAP可解释分析+新数据预测(MATLAB完整源码)

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 390

rk3568 rk628桥片 rgb2hdmi

RK628 是瑞芯微全新推出的视频桥接芯片,支持丰富的显示接口,支持高分辨率大屏产品转换需求。基于DRM、FB的显示框架易于使用。 输入信号支持:HDMI、RGB、BT.1120,输出信号支持 HDMI、GVI、Dual LVDS、Dual MIPI、MIPI-CSI、RGB、BT.1120,最高支持4K 60fps 输入/输出转换,并且支持输入到输出 1/4~4倍的缩放。

weixin_35723192的博客 450

CIO的四大技能教你如何让项目善始善终

很多管理人员没有做到善始善终是因为交流出现了问题。当项目的执行者同项目计划或目标的制定者不是同一个人时,这种情况就可能会出现...   对于各个级别的管理人员来说,善始善终都是非常重要的——不管你现在是在负责一个耗资数千万美元的开发项目,还是在完成部门的业绩报告。不能善始善终的管理人员不可避免的会在工作中遇到一系列的麻烦:项目出现问题、失去领导和下属的信任、浪费了公司的资金和时间、甚至还会遭到下岗...

S_king_的博客 446

避坑指南:新手爬百度图片3个致命错,改完批量保存本地(亲测有效)

新手爬百度图片的核心是“绕开静态HTML,抓准API接口+处理反爬+提取原图”,改完本文提到的3个核心错,就能稳定批量保存高清图片。这套思路可复用在其他图片网站(如必应图片、360图片),只需修改API接口和参数即可。如果想进一步优化,可添加代理IP池、多线程下载(新手不建议,容易触发反爬)、图片去重等功能!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1586

人人皆需善始善终,深度探讨善始善终的益处,事业和生活离不开。

在生活和修行中,善始善终是一种重要的品质和精神境界。元理先生认为每个人只有始终如一地坚持自己的目标,持之以恒地进行行动,不断完善自己,才能够最终实现自己的理想。同时,佛教理论中的"善始善终"也为我们提供了一种思考方式,指导我们在生活和修行中保持善良品德和行为,获得更多的福报和成果。在今后的生活和修行中,我们应该始终坚持"善始善终"的信念,不断地完善自己,实现自己的梦想。佛元善始善终令牌古今中外对“善始善终”的评论许多名人都曾经谈到过"善始善终",以下是一些例子:孔子:"学而时习之,不亦说乎?

johndvaison的博客 730

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

善始善终才能增加项目成功的机会 (转)

善始善终才能增加项目成功的机会对于各个级别的管理人员来说,善始善终都是非常重要的——不管你现在是在负责一个耗资数千万美元的开发项目,还是在完成部门的业绩报告。 不能善始善终的管理人员不可避免的会在工作中遇到一系列的麻烦...

cqwmy840702的博客 130

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

善始善终才能增加项目成功的机会(转)

善始善终才能增加项目成功的机会对于各个级别的管理人员来说,善始善终都是非常重要的——不管你现在是在负责一个耗资数千万美元的开发项目,还是在完成部门的业绩报告。 不能善始善终的管理人员不可避免的会在工作中遇到一系列的麻烦:...

cqwmy840702的博客 134

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

持之以恒,善始善终

今天刚开通了博客,心情有点小激动,感觉自己正在通往技术大牛的道路上,我昂首挺胸,大步向前。虽然现在的我,还是一只菜鸟中的菜鸟,但是大牛都回家耕地去了,这广阔的天空还是属于我们这些菜菜菜鸟的啊。           之所以萌生写博客的想法,是因为在这些新入职的这些日子里。在工作中遇到了很多的问题,比如在Xcode6.1中Cocoapods的使用,之前有了解过在Xcode5中引入Cocoap

Companion_1314的专栏 1139
上一篇: 命名
下一篇: 留意编译告警
林 文
博客等级 码龄18年 14粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值