面向完全型小白,只要你会在电脑上打字,那你就可以看懂。
本章主要讲解【编程的原理】~
想自学的小伙伴,从这里开始吧~
简书连接:http://www.jianshu.com/p/c4fb64a14fd6
豆瓣连接:https://www.douban.com/note/637531498/
欢迎大家提意见~
如果有看不懂的地方,记得告诉我~
同步更新在这里:http://www.jianshu.com/nb/15462599
作者:咖喱py
[查看全文]
面向完全型小白,只要你会在电脑上打字,那你就可以看懂。
本章主要讲解一些初学者常常会【纠结】的问题,比如语言的选择,电脑的选择等~
想自学的小伙伴,从这里开始吧~
简书连接:http://www.jianshu.com/p/8a3d0b9484c3
豆瓣连接:https://www.douban.com/note/637475221/
欢迎大家提意见~
如果有看不懂的地方,记得告诉我~
同步更新在这里:http://www.jianshu.com/nb/15462599
作者:咖喱py
[查看全文]
话不多说线上效果,做的视频我有发到b站。用标点符号打开《PPAP》 本来上附上几张做好的ascii码动图,,结果明明才3m不都不如上传。。干脆不弄了。。好气。。
[查看全文]
本帖最后由 Jack_Criss 于 2015-8-1 15:27 编辑
演示视频:http://www.bilibili.com/video/av2654162
官方网站:http://www.jackeriss.com/companions.htm
[查看全文]
本帖最后由 山海不可平 于 2016-10-18 11:06 编辑
这次我们来学做一款高仿的“斗鱼”APP!
还不会swift的同学可以先看看内附的swift基础视频
~36@
9月12日第一次更新
第二篇玩转【斗鱼直播APP】系列之界面分析
第三篇玩转【斗鱼直播APP】系列之项目部署
第四篇玩转【斗鱼直播APP】系列之获取APP图片资源
第五篇玩转【斗鱼直播APP】系列之基本设置
第六篇玩转【斗鱼直播APP】系列之框架搭建
9月14日第二次更新
第七篇玩转【斗鱼直播APP】系列之首页导航栏设置
第八篇玩转【斗鱼直播APP】系列之首页布局分析&实现
9月18日第三次更新
第九篇玩转【斗鱼直播APP】系列之布局推荐界面
第十篇玩转【斗鱼直播APP】系列之利用青花瓷抓取数据
第十一篇玩转【斗鱼直播APP】系列之请求展示推荐数据
9月21日第四次更新
第十二篇玩转【斗鱼直播APP】系列之实现无限轮播
第十三篇玩转【斗鱼直播APP】系列之游戏推荐展示
10月8日更新内容
第十四篇玩转【斗鱼直播APP】系列之Swift3.0适配
第十五篇玩转【斗鱼直播APP】系列之游戏界面实现
10月11日更新内容
第十六篇玩转【斗鱼直播APP】系列之内容简介
第十七篇玩转【斗鱼直播APP】系列之娱乐基本展示
第十八篇玩转【斗鱼直播APP】系列之娱乐菜单展示
10月14日最新更新内容
第十九篇玩转【斗鱼直播APP】系列之内容简介
第二十篇玩转【斗鱼直播APP】系列之“趣玩”界面展示
第二十一篇玩转【斗鱼直播APP】系列之加载数据动画
第二十二篇玩转【斗鱼直播APP】系列之弹出房间界面
[查看全文]
发福利!
发福利啦~
李南江大神最新出的HTML5+React Native跨平台开发教程
网盘包我会发在下楼,有需要的同学快去下载
由于视频正在连载,所以同学们要耐心等待他更完~
教程内容包括:HTML5+CSS+JavaScript+React Native
●01-HTML基础知识
●02-认识HTML
●03-基础标签
●04-列表标签
●05-表格标签
●06-表单标签
●07-多媒体标签
●08-CSS体验
●09-CSS常见属性
●10-CSS选择器
●11-CSS三大特性
●12-元素显示模式
●13-背景相关属性
●14-盒模型
[查看全文]
此教程为搬运,个人进行了一点加工。
我比较笨,自己自学配置Hadoop集群走了不少弯路,好几次都通宵(为此心态还崩过)。在此时此刻终于配置完成,迫不及待地就来分享教程了。
建议先学Linux基础再来配置!
又不会的可以回复,有空会看。
本帖最后由 玩不坏的小黑 于 2016-5-10 10:25 编辑
RecyclerView使用教程前两个星期用到只学习了使用方法,没完全理解,这次用就做个教程用于学习第一步:引用Recyclerview 包在gradle文件里面添加<span style="line-height: 1.5; background-color: rgb(255, 255, 255);">dependencies {</span><span style="line-height: 1.5; background-color: rgb(255, 255, 255);"> compile'com.android.support:recyclerview-v7:23.1.1'</span>
<span style="line-height: 1.5; background-color: rgb(255, 255, 255);">}</span>
第二步:在XMl里面添加Recyclerview<android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerview"android:layout_width="match_parent"android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
第三步:在activity里面findViewById()recyclerView.findViewById(R.id.recyclerview);第四步:设置布局管理器,布局管理器待会再详细研究recyclerView.setLayoutManager(new LinearLayoutManager(this));第五步:新建一个适配器package com.xiaohei.recyclerview;import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
/**
* Created by xiaohei on 2016/5/5.
*/
public class RecyclerviewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
List *本站禁止HTML标签噢* Items;
public RecyclerviewAdapter() {
Items = new ArrayList<>();
for(int i = 0 ; i<100;i++){
Items.add("小黑 " + i);
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item,null);
RecyclerView.ViewHolder holder= new xiaoheiHolder(view);
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
xiaoheiHolder XHolder = (xiaoheiHolder) holder;
XHolder.mTextView.setText(Items.get(position));
}
@Override
public int getItemCount() {
return Items.size();
}
class xiaoheiHolder extends RecyclerView.ViewHolder{
TextView mTextView;
public xiaoheiHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.item_id);
}
}
}
recyclerview的适配器流程是这样的首先:getCount 获取到元素个数然后创建view{创建view的时候要用parent获取到item的view,然后new一个Holderitem的view要写一个新的layout文件@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item,null);
RecyclerView.ViewHolder holder= new xiaoheiHolder(view);
return holder;
}
然后return holder}然后再绑定{绑定的时候就是填充数据第六步:在activity里面给recyclerview设置适配器recyclerView.setAdapter(new RecyclerviewAdapter());然后运行就可以看到这个界面:
基础部分就先记这么多
recyclerview的灵活性远不止这样
找时间记录下布局管理器和然后还有一个ViewType的使用
[查看全文]
Description
小六是个吃货,现在是冬天,但是小六想吃西瓜了,没关系,小六是个小女巫,她有办法变出西瓜。但作为一个有追求的女巫,小六对西瓜的要求也是很高的,小六要吃的西瓜形状可以各异,但是西瓜皮的体积一定要够(小六爱吃西瓜皮)。现在有一个西瓜,请你先帮小六看看,她会不会吃这个西瓜。
Input
分3行输入;
第一行:小六最少要吃的西瓜皮的体积V;
第二行:一个字母,代表西瓜外壳的形状(b:球体,c:立方体)一个正数r(形状为b时,代表球体半径;形状为立方体时,代表立方体边长);
第三行:一个字母,代表西瓜内瓤的形状(b:球体,c:立方体)一个正数r(形状为b时,代表球体半径;形状为立方体时,代表立方体边长);
Output
如果西瓜皮的的体积大于V,则输出“YES”,否则输出“NO”;
Sample Input
13
c 3
c 2
Sample Output
YES
HINT
建议数据用double型
[查看全文]
本帖最后由 断乱 于 2018-2-27 00:03 编辑
如题#km今天遇到一个奇葩问题绞尽脑汁都想不出来,求各位路过的大神帮帮忙,【复式消费】是什么意思!!!!!!!!!![查看全文]
public class Change {
public String change(String m){
StringBuffer re=new StringBuffer("");
int i=0;
int j=0;
i=m.lastIndexOf(".");
if(i==-1) i=m.length();
String b=m.substring(0, i);
char[] c=b.toCharArray();
StringBuffer s=null;
for(i=c.length-1,j=0;
i>=0;i--,j++){
s=new StringBuffer("");
if(i!=c.length-1 && c[i+1]!='0') s.append(changeNum(c));
if(c!='0'){
switch (j%4){
case 1:s.append("拾");
break;
case 2:s.append("佰");
break;
case 3:s.append("仟");
break;
default :break;
}
}
if(j!=0 && j%8==0) s.append("亿");
else if (j!=0 && j%4==0){
s.append("万");
}
re=s.append(re);
}
re.append("元");
i=m.lastIndexOf(".");
String d=null;
if(i!=-1){
d=m.substring(i+1,m.length());
char[] e=d.toCharArray();
if(e.length==1) if(e[0]!='0')
re.append("零").append(changeNum(e[0])).append("角").toString();
if(e.length==2) if(e[0]!='0' || e[1]!='0')
re.append("零");
if(e[0]!='0')
re.append(changeNum(e[0])).append("角").toString();
if(e[1]!='0')
re.append(changeNum(e[1])).append("分").toString();
}
return re.toString();
}
public String changeNum(char c){
String[] n={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"}; return n[c-'0'];
}
public static void main(String[] args) {
Change c=new Change(); System.out.print(c.change("123458.78"));
}
}
[查看全文]
之前没有学过c语言,突然需要写c语言程序。一头雾水,跪求大神帮忙!!!!!!!
1.已知一个字母组成的字符串密钥,明文密文均为英文字母,且不分大小写。试编写C语言程序(或伪代码),实现单表密码加密。输入明文,输出密文。
2.已知一个字母组成的字符串密钥,明文密文均为英文字母,且不分大小写。试编写C语言程序(或伪代码),实现置换密码加密。输入明文,输出密文。
[查看全文]
C#与C++的对比今天我用C++和C#同时写了计算长方体的体积 同时也反应了C++与C#的区别
C#
Console.WriteLine("by skyler qq206268322");
Console.WriteLine("请输入长方形的长:");
int Length = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入长方形的宽:");
int Width = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入长方形的高:");
int Height = Convert.ToInt32(Console.ReadLine());
int S = Length * Width * Height;
Console.WriteLine("长方形的体积为:{0}", S);
Console.ReadKey();
C++的代码
#include <stdio.h>
int V(int Length,int Width,int Height);
int main()
{
int m_length,m_width,m_height,result,qq;
printf ("by skyler QQ206268322\n");
printf("请输入长方体的长:\n");
scanf("%d",&m_length);
printf("请输入长方体的宽:\n");
scanf("%d",&m_width);
printf("请输入长方体的高:\n");
scanf("%d",&m_height);
result=V(m_length,m_width,m_height);
printf("长方形的体积为:\n");
printf("%d\n",result);
printf ("by skyler QQ206268322");
scanf("%d",qq);
return 0;
}
int V(int Length,int Width,int Height)
{
int result;
result=Length*Width*Height;
return result;
}
[查看全文]
序
本篇总结为我认为几种比较简单的装机方法,其中也包含了一些基础的理论知识,本文以Windows10×64为例。
很多人都要去外面找别人装系统,即使会装系统,苦恼之余也不会自己来做一个好的PE环境。那么接下来 请大家做好以下几点工作:
1 U盘(容量大于8G,且最好为USB3.0标准);
2 MSDN原版ISO镜像。(https://msdn.itellyou.cn);
3 PE装机工具软件 WePE (自己百度下载);
制作U盘启动系统
[color=rgba(0, 0, 0, 0.870588)]打开已经下载的WePE,插上U盘,在打开界面的右下角选择将PE安装到U盘。
[color=rgba(0, 0, 0, 0.870588)]
[color=rgba(0, 0, 0, 0.870588)]
[color=rgba(0, 0, 0, 0.870588)]WePE会自动发现已经插入的U盘,并智能选择安装方式,具体参数如图。
[color=rgba(0, 0, 0, 0.870588)]
[color=rgba(0, 0, 0, 0.870588)]配置完毕后,点击立即安装进U盘。大概一两分钟后会提示安装完成。
下载镜像注:由于WePE比较干净,所以写入完毕后打开U盘目录无任何文件。校验是否安装成功需要在磁盘管理中查看U盘是否有文件系统为FAT16的EFI分区[color=rgba(0, 0, 0, 0.870588)]下载Windows10的ISO镜像,并放入U盘根目录,如果放在U盘子目录就要确保路径名不含中文字符。
进入BIOS[color=rgba(0, 0, 0, 0.870588)] 各品牌主板进入BIOS的按键有所不同,可能是ESC、F2、F8、F9、F10、DELETE等,一般会在按开机键后的主板自检页面告知,按开机键后,迅速点按对应的BIOS设置快捷键,进入BIOS。目标是装Win10系统,那么需要检查主板中Boot中Boot Mode是否为UEFI启动,并且在Security选项卡将Secure boot设置为Disabled。
UEFI是一种新的主板引导初始化的标注设置,具有启动速度快、安全性高和支持大容量硬盘等特点,目前的Win8、Win10系统启动模式都要改为UEFI启动。而Legacy模式顾名思义是一种较为传统的启动模式,在以前的WinXP、Win7中都以Legacy模式启动,虽然Win8Win10也对Legacy下行兼容,但是不推荐。
总结来说,如果要安装WinXP和Win7,那么就用Legacy引导启动,如果要安装Win8Win10,那就用UEFI引导启动,虽然这样说不严谨,够用就行。
进入PE[color=rgba(0, 0, 0, 0.870588)]在关机状态下插入制作好的启动盘,在主板自检页面点按F12,进入快捷启动菜单,选择USB启动,也有部分电脑直接显示由UEFI引导的UEFI:0000.回车后自动加载PE。
镜像挂载
- 开始装系统的步骤,这是最简化的步骤。
- 打开资源管理器,找到U盘里面的ISO镜像文件,移动至本地磁盘。
- 右键点击镜像,挂载到虚拟磁盘
[color=rgba(0, 0, 0, 0.870588)]
[color=rgba(0, 0, 0, 0.870588)]
- 打开资源管理器中已经挂载好的镜像,进行常规步骤的安装。
[color=rgba(0, 0, 0, 0.870588)]
[color=rgba(0, 0, 0, 0.870588)]
安装后续[color=rgba(0, 0, 0, 0.870588)]安装完成后进入系统桌面,首先使用KMSAuto对系统进行激活,激活过程中保证网络连接为关闭状态,激活完毕后打开驱动人生网卡版,自动修复异常网卡驱动,并在网络连接后扫描其他问题驱动,并一键修复。
常见问题[color=rgba(0, 0, 0, 0.870588)]在选择安装分区的界面提示“Windows无法安装到这个磁盘。选中的的磁盘采用MBR分区形式”。
这种问题出现的原因是磁盘分区表的格式不对,磁盘分为MBR分区表和GPT分区表两种,这两者的区别和前面的Legacy和UEFI类似。总结来说,要装WinXP Win7,分区表就采用MBR,如果装Win8 Win10,那么必须保证磁盘格式为GPT。关于MBR和GPT的区别不再讲述,主要讲如何实现MBR和GPT的互相转化。
在WePE桌面上有一个分区助手工具,打开后便可以读取本机磁盘,右键单击盘符即可对磁盘进行格式转化操作。同时,这个工具还可执行多种磁盘操作,比如系统迁移,快速分区等等。
附件[查看全文]Windows 10 ×64:
所有机器都有一张操作命令清单,让你可以控制它。有时这个清单非常简短。电水壶就只允许两种操作:打开和关闭。CD播放器稍微复杂点,除了打开和关闭以外,还能调节音量、播放、暂停、快进、快退、随机播放等。计算机和其他机器一样,也有一张操作命令清单。比如,可以命令计算机把两个数相加。这种操作命令的总和就是计算机的机器语言(machine language)
机 器 语 言#24x计算机刚发明的时候,所有程序就是一条条机器语言的命令。没过多久,程序就改成使用汇编语言了,它要比机器语言写起来稍微方便一点。命令清单还是一样的,就是每个命令换了一个更人性化的名字。机器语言的加法命令是11001101,这可能就是计算机内部的加法表达方式,但是在汇编语言中,这条命令就改成了add。
机器语言和汇编语言的共同问题就是,只能让大多数计算机做一些很简单的事情。比如,假定你想让计算机的蜂鸣器响10次,但是不存在一条直接的机器语言命令让电脑重复进行n次操作,所以只能用机器语言写出下面这样的程序:
a 将数字10存入内存地址0如果内存地址0的值为负数,跳到b行
蜂鸣器发出声音
将内存地址0的值减1
跳到a行
b ……程序的其他部分……
如果只是为了让蜂鸣器响10次就不得不写这么多代码,不难想象写出一个文字处理器或电子表格将是一项多么浩大的工程。
顺便说一句,请再看一下上面的程序。蜂鸣器真的会响10次吗?不,响了11次。我不应该在第一行使用10,而应该使用9。我故意在这个例子中留了一个bug,证明编程语言的一个重要特点:一个操作所需的代码越多,就越难避免bug,也越难发现它们。
高 级 语 言#11x现在假设你不得不用汇编语言开发程序,但是你有了一个助手,他可以帮你承担那些麻烦的脏活。所以,你只要把程序写成F面这样就行了:
dotimes 10 蜂鸣器响(dotimes 是Lisp语言中表示循环的处理命令。)
接下来,你的助手会用汇编语言来实现这条命令(假定他不会产生bug)。
事实上大多数程序员就是这样工作的,不同之处就是,程序员的助手不是一个人,而是编译器。所谓“编译器”,本身就是一个程序,作用是将简便方式书写的程序(就像上面这一行命令)转变为硬件可以理解的语言。
这种简便方式书写的程序所使用的语言就叫做高级语言。它让你能够使用更强大的命令开发程序,比如现在你就有了“重复n次操作”的命令,不再仅限于只能做简单的“两个数相加”。
写程序时有了方便的命令,就可以把程序写得更简短。在上面假想的例子中,高级语言写出来的程序的长度只有机器语言的五分之一。所以,要是你犯错了,现在也更容易发现。
高级语言还有一个优点,它使得程序更具有可移植性。不同计算机的机器语言都不是完全相同的。所以,你无法将为某一种机型写的机器语言程序放到另一种机型上运行,只有彻底重写才能实现。但是,如果你的程序是用高级语言写的,你只需要重写编译器就可以了。
编译器不是髙级语言唯一的实现方法,另一种方法是使用解释器,它的作用是实时地将代码解释为相应的机器语言,然后一行行运行。相比之下,编译器则是先将整个程序全部翻译成机器语言,然后再运行。
开 放 源 码#30x编译器处理的髙级语言代码又叫做源码。它经过翻译以后产生的机器码就叫做目标码。顾客购买市场上的商业软件时得到的往往只是目标码。(目标码很难读懂,所以相当于被加密了,可以保护公司的商业秘密。)但是,后来出现另一种潮流:开放源码的软件。你可以得到源码,并且可以不受限制地修改它。
这两种方式的真正区别在于,开放源码使你对软件有更大的控制权,如果你想理解开源软件如何运行,只要阅读源码就行了。如果愿意,你甚至可以修改软件、重新编译。
你之所以需要这样做,一个原因可能是为了修正bug。比如,你自己不可能修正Windows的bug,因为你没有源码。(理论上你也许可以破解目标码,但是实际上这是非常难的。另一方面,软件的授权协议一般也不允许你这样做。)这会导致很大的问题。一旦Windows出现新的安全漏洞,只能等待微软公司发布解决方法,这还算是快的。如果bug的危害性不严重,只是偶尔会让你的机器死机,那么可能不得不等到下一次全面升级后问题才会得到解决。
开放源码的优势还不仅局限于可以自己动手解决bug。这里的关键是所有人都可以参与。所以,开源软件就像一篇经受同行评议的论文。许许多多的聪明人仔细阅读了Linux和FreeBSD这样的开源操作系统的源码,发现并且解决了大量的bug。相比之下,Windows的可靠性只能依赖于大公司自己的质量保证部门了。
开放源码的拥护者常常被看作反对知识产权的怪人。其中有些人确实如此,但是我本人肯定不反对知识产权。只是如果你要我安装没有源码的软件,我会非常犹豫。普通的消费者也许不需要看到他们使用的文字处理器的源码,但是在非常强调软件可靠性的情况下,出于强烈的工程需求的考虑,会要求开放源码。
语 言 的 战 争undefined绝大多数程序员在绝大多数时候都使用高级语言编程。现在很少有人使用汇编语言。程序员的时间要比计算机的时间昂贵得多,后者已经变得很便宜了,所以几乎不值得非常麻烦地用汇编语言开发软件。只有少数最关键的部分可能还会用到汇编语言,比如开发某个计算机游戏时,你需要在微观水平控制硬件,使得游戏速度得到最大限度的终极提高。
Fortran、Lisp、Cobol、Basic、C、Pascal、Smalltalk、C++、Java、Perl和Python,全都是高级语言。它们只是比较出名的几种而已。现在的髙级语言大概有几百种之多。不同机器语言的指令集基本相同,但是髙级语言就不一样,它们开发程序的模式差别相当大。
那么,应该使用哪一种语言?undefined嗯,关于这个问题,现在有很多争论。部分原因是,如果你长期使用某种语言,你就会慢慢按照这种语言的思维模式进行思考。所以,后来当你遇到其他任何一种有重大差异的语言,即使那种语言本身并没有任何不对的地方,你也会觉得它极其难用。缺乏经验的程序员对于各种语言优缺点的判断经常被这种心态误导。
可能因为想炫耀自己见多识广,某些黑客会告诉你所有高级语言基本相似。“所有编程语言我都用过。”某个看上去饱经风霜又酷的黑客往酒吧里一坐,“你用什么语言并不重要,重要的是你对问题是否有正确的理解。代码以外的东西才是关键。”
这当然是一派胡言。undefined各种语言简直是天差地别,比如 Fortran I和最新版的 Pert 就是两种完全不同的语言,而早期版的Pert和最新版的Perl之间的差別也大得惊人。但是,那个夸夸其谈的黑客可能真的相信自己的这番话,的确有可能使用所有不同的语言写出了与用原始的Pascal语言写的差不多的程序。如果你吃过麦当劳,就会知道全世界各地的麦当劳的味道都几乎一样。
一些黑客只喜欢自己用的语言,反感其他所有的语言。另一些黑客则说所有的语言都一样。事实介于这两个极端之间。语言之间确实有差别,但是很难确定地说哪一种语言是最好的。这个领域依然还在快速发展。
抽 象 性undefined高级语言比汇编语言更接近人类语言,而某些高级语言又比其他语言更进一步。举例来说,C语言是一种低层次语言,很接近硬件,几乎堪称可移植的汇编语言,而Lisp语言的层次则是相当高。(这里的高低不是指高低贵贱undefined)
如果高层级语言比汇编语言更有利于编程,你也许会认为语言的层次越高越好。一般情况下确实如此,但不是绝对的。编程语言可以变得很抽象,完全脱离硬件,但也有可能走错了方向。比如,我觉得Prolog语言就有这个问题。它的抽象能力强得不可思议,但是只能用来解决2%的问题,其余时间你苦思冥想、运用这些抽象能力写出来的程序实际上就是Pascal语言的程序。
另一个你会用到低层次语言的原因就是效率问题。如果你非常关注运行速度,那么最好使用接近机器的语言。大多数操作系统都是用C语言写的,这并非偶然。不过,硬件的运行速度越来越快了,所以使用C这样的低层次语言开发应用程序的必要性正在不断减少,但是大家似乎还是要求操作系统越快越好。(另一种可能是,人们还是希望“缓存区溢出攻击”继续存在下去,以便让大家时时保持警惕。)
注: 最常见的几种入侵计算机的手法都是利用了C语言的某些特点。当你在C语言中为输入的内容分配出一片内存(也叫“缓存”)时,它会被分配在当前运行代码的返回地址旁边。所谓“返冋地址”指的是一块特定内存,当前代码运行完毕以后,就要运行这块内存中包含的代码。也就是说,它实阮上是计算机下一步要做的事情。
假定有人打算入侵你的计算机,他们猜出你会为某种输入分配256字节的缓存,于是他们就提交多于256字节的内容,目的是覆盖旁边的“返回地址'。
那么,当前代码运行完毕之后,程序的控制权就交给了他们指定的内存地址。这个地址通常是缓存的首地址,缓存中是入侵者事前编好的机器码。于是,入侵者的程序就运行在你的计算机上了。
如果使用更抽象的高级语言,上面的亊情是不可能发生的。但是,在C语言中,一旦接受用户输入的时候你没有检查输入长度,就创造出了一个安全漏洞。利用这种漏洞的攻击行为就被称为“缓冲区溢出攻击”。在这种攻击中,还有其他方法可以控制计算机,但是覆盖返冋地址是最经典的一种。
有意思的是,劫持飞机与“缓冲区溢出攻击”有类似之处。在一般飞机上,乘客区与驾驶舱是相通的,就好像C语言中数据区与代码区是相邻的一样。劫机者一且进入驾驶舱,实际上就相当于把自己从数椐提升为代码。
安 全 带 还 是 手 铐?undefined语言设计者之间的最大分歧也许就在于,有些人认为编程语言应该防止程序员干蠢事,另一些人则认为程序员应该可以用编程语言干一切他们想千的事。Java语言是前一个阵营的代表,Perl语言则是后一个阵营的代表。(美国国防部很看中Java也就不足为奇了。)
自由语言派的信徒嘲笑另一方是“B&D”(奴役和戒律,Bondage and Discipline)语言,很无礼地暗示用那些语言编程的人是下等人。我不知道对方如何反击这些喜欢Perl的自由派,也许他们不喜欢给别人起绰号,因此我就无从知道。
由于防止程序员做蠢事有好几种方法,所以上面的争论逐渐分化成几个较小的议题。目前最活跃的议题之一就是静态类型语言与动态类型语言之争。在静态类型语言中,写代码时必须知道每个变量的类型。而在动态类型语言中,随便什么时候,你都可以把变量设为任意类型的值。
静态类型语言的拥护者认为这样可以防止bug,并且帮助编译器生成更快的代码(这两点理由都成立)。
动态类型语言的拥护者认为静态类型对程序构成了限制(这点理由也成立)。
我本人更喜欢动态类型,痛恨那些限制我的自由的语言。但是,确实有一些很聪明的人看来喜欢用静态类型语言。所以,这个问题依然值得讨论,并没有固定答案。
面 向 对 象 编 程#10x眼下另一个争论的热点则是面向对象编程。它是一种不同的组织程序的方法。假定你要写一个程序,计算二维图形的面积。首先,你必须知道到底是圆形还是正方形。一种解决方法是用一整块的代码判断遇到的是什么图形,然后再用相应的公式计算面积。
面向对象编程不是这样,它的方法是写出两个类,一个是圆形类,另一个是正方形类,然后每个类里面用一小块代码(叫做方法)计算该类图形的面积。求面积的时候,你就问要用哪一个类,然后再使用相应的方法得出最后答案。
这两种不同的计算方法可能听上去很相似,事实上,运行代码后,实际计算面积的运算过程也很相似。(这不奇怪,因为你本来就在解决同一个问题。)但是,代码的形式却是大相径庭。
在面向对象编程的方式中,计算圆面积和正方形面积的代码可能分散在不同的文件中。与圆形有关的代码都放在一个文件中,与正方形有关的代码则放在另一个文件中。面向对象编程的优点在于,如果你需要修改程序,计算另一种图形的面积,比如三角形,你只需要再另外增加一块相应的代码就可以了,甚至可以不修改程序的其他部分。
但是,批评者会反驳说,这种方法的缺点是,由于增加代码不用考虑其他部分,结果往往导致写出性能不佳甚至有副作用的代码,就好比造房子不考虑已经完成的部分一样。
关于面向对象编程优劣的争论并不像静态类型与动态类型之争那样壁垒分明,因为编程的时候你只能在静态类型和动态类型之中选一种。但是,面向对象编程只是程度不同的问题。事实上有两种程度的面向对象编程:某些语言允许你以这种风格编程,另一些语言则强迫你一定要这样编程。
我觉得后一类语言不可取。允许你做某事的语言肯定不差于强迫你做某事的语言。所以,至少在这方面我们可以得到明确的结论:你应该使用允许你面向对象编程的语言。至于你最后到底用不用则是另外一个问题了。
文 艺 复 兴undefined有一件事,我想所有软件业的人都会同意,那就是最近出现了很多新的编程语言。直到20世纪80年代,只有大机构才买得起开发编程语言所需的硬件,所以大多数编程语言都是大公司的教授或者研究员开发的。而现在,一个髙中生就能搞到所有必需的硬件。
Perl语言的设计者拉里·瓦尔的例子启发了很多黑客:为什么不动手设计一种自己的语言呢?只要你懂得驾驭开源软件社区,就会有很多人在短期内为你提供大量的代码。(Larry Wall在大学里主修语言学?1987年为了使管理机房的工作变得方便,他在业余时间创造了Perl语言。)
结果就是产生了一些也许可以称为“头重脚轻”的语言:它们的内核设计得并非很好,但是却有着无数强大的函数库,可以用来解决特定的问题。(你可以想象一辆本身性能很差的小汽车,车顶却绑着一个飞机发动机。)有一些很琐碎、很普遍的问题,程序员本来要花大量时间来解决,但是有了这些函数库以后,解决起来就变得很容易,所以这些库本身可能比核心的语言还要重要。
所以,这些奇特组合的语言还是蛮有用的,一时间变得相当流行。车顶上绑着飞机发动机的小车也许真能开,只要你不尝试拐弯,可能就不会出问题。(提醒各位亲爱的黑客,我只是打一个比方,请不要尝试在车顶绑上飞机发动机。另外,可以认为这类“头重脚轻”的语言存在已久,Fortran语言的流行主要就是因为它的函数库。)
另一个结果就是语言的多样化。编程语言之间总是存在很大区别。Fortran、Lisp、APL都是1970年以前开发出来的,它们之间的区别大得就像海星、熊、蜻蜓之间的区別。新兴的开源编程语言肯定将继承这种传统。
现在好像每隔一段日子就能听到一种新出现的语言。乔纳森·埃里克森把这种现象称为“编程语言的文艺复兴”。人们有时还会用另一个说法,即“编程语言的战争”。这并不矛盾,文艺复兴时期就是存在很多战争的。
实际上,很多历史学家相信战争是文艺复兴的一个副产品。当时,欧洲活力旺盛可能就是因为它分成许多互相竞争的小国。它们互相毗邻,所以新思想能够从一个国家传播到另一个国家,但是它们又互相独立,使得单个的统治者无法遏制创新的发展。相比之下,中国古代的封建皇朝禁止民间建造大型的远洋船只,阻止了经济的正常发展。
所以,程序员活在这个文艺复兴时代可能是一件好事。如果我们所有人都使用同一种编程语言,反而有可能是坏事。
本文来自: 编程语言解析——什么是编程语言-古黑论
原文地址: https://www.guhei.net/post/jb599
感谢转载本文,请保留原文链接,作者将表示感谢!
[查看全文]
网站应该是免费的,要注册帐号(邮箱),缺点就是全英文的,讲解也是英文的,做题的时候需要翻译(本人英语渣).
以下是网站: www.codeschool.com
[查看全文]
IOS/WINDOWS前端实习招聘
岗位职责:
1.辅助iphone,安卓应用程序的开发,参与制定开发方案,并编写相关技术文档;
2.独立完成手机软件设计、编码和单元测试工作,确保开发质量;
3.负责与服务器端相应数据接口的整合;
4.持续的优化相关的产品的质量、性能、用户体验;
5.负责ios、android软件的日常bug维护工作
任职资格:
1.计算机或相关专业本科大四在读,具有ios平台开发经验;
2.熟悉软件开发流程,能编写软件工程技术文档;
3.具有良好的编程风格与编码技巧;
4.熟悉iphone SDK开发环境及底层API调用;
5.熟悉至少一种主流数据库系统:MySQL、Qracle、MSSQL等;
6.有良好的沟通技能与团队合作能力,良好的编码习惯。
薪资面议
有意者请将简历发送至xbwj2017@126.com
#10x
几天马上就开学,能有时间也就现在了,之前一直想写一些个人关于诗词的想法,嗯 首先提一下诗词这个东西,啊,好吧第一印象就是能赚积分......真是抱歉了...#20t
诗在百科上一查就是广义,狭义的,很麻烦#25t......咱们只是谈一谈天朝的诗而已
诗的格式主要的(好吧,是在下常用的#27t)楚辞,诗经,乐府,老一点的是这样,然后再就是绝句和律诗
然后七绝七律五绝五律这样,我所想说的...所想说的...说的,啊咧?好像忘了?
嘛,又不是专业人士,在下是觉得只要对仗工整,韵脚压住,再加上个人的意境到了就好
对了,提一下韵脚的问题吧,其实也不用太过抠这个,简单点,一直按照仄起 平起来就好
那么主要说说词吧,不管是小令,中调还是大调其实分句都没有硬性要求
但其实按网上来说,这说法并不严谨(洒家那愚蠢的语文老师#7t),除了已有的词牌外,其实自己起的词牌字数都是可以不限的
词牌的名字可以随意起,可以按照意境,也可以从词里取
就这样吧,一边补番,一边写,好没有诚意......#23t
评分