svn

svn版本控制对于前端人员似乎比git方便,不会干扰到本地不需要调整的其他文件,可以只操作指定文件。而git的操作是整个分支同步,那很多前端冗余文件就需要手动忽略,也是累。

svn还有一个很强的功能,权限管理,例如不同的开发人员只能操作相关的文件组,避免文件错杂混乱,也可以降低代码泄露的风险,当然,这个跟前端无关,是svn的一个福利局。

但是,svn有个大bug,就是需要网络支援,才能够实现完美的版本控制,然后就是服务器冗余会很多,毕竟还需要查看比对之前的版本。

svn可以可视化操作,单文件操作,总的来说,感觉还是很不错。

微信播放视频相关

这周做了一个伪直播,美素直播

之前已经做过了假canvas弹幕,但是还有一点bug,所以调整为html弹幕,并且也使用了电脑和ios手机网页端检测过,等到做完放微信环境下测试,我整个人傻了,坑坑点点,不忍直视。

ios 视频播放是采用全屏播放模式,本来使用 webkit-playsinline=”true” 属性即可内联播放,但是微信不支持啊,于是各种找解决方案,添加了iphone-inline-video.js文件后,使用playsinline属性得到解决,ios可以播放视频并弹幕了,棒棒。

在我心目中ios解决了,那安卓不用说,一定ok的,毕竟安卓本来就是内联播放啊,事实证明,我还是图样图森破,在微信安卓环境下视频的播放只是看起来是内联,但它并不是。微信的同层级播放方法是x5-video-player-type=”h5″,h5同层级播放器接入规范 但是使用了该属性后,点击视频播放就会进入全屏播放,层级不变。

可是我不需要全屏啊,我只想安安静静的播放个视频而已啊,后来发现微信曾经开通过视频内联播放的白名单,但后来又关闭了,连白名单都不再有了,我的弹幕彻底没指望了。

还好,在孕育端浏览器端,ios和安卓都可以正常弹幕,而且ios微信端也可以弹幕,so,最后的最后,抛弃了安卓微信端的弹幕功能了。

一通折腾下来,我只想说:臣妾做不到啊 T_T .

canvas-假弹幕1

学习canvas中,正好接到新需求,做个假直播,配上假弹幕。

假直播是真视频,和一般视频一模一样,不予赘述,但是假弹幕这个正好就可以用canvas做啊,fillText()刚好可以用上。

折腾了两天,得到了一个半成品:canvas-弹幕

事实上,现在只有canvas动画的样但还没有canvas动画的魂,这可以算是真的canvas动画,也绝对是假的canvas动画,因为两组元素并不是一个画布而是两个画布生成的,中间的问题在于我使用了随机的颜色,canvas的动画不是元素在动,而是重新绘制,这就导致当我重新发布一组新的文字新的颜色时,之前的文字颜色也会随之改变,具体需要怎么做,还需要再思考看看。

当然,现在这个版本已经可以拿出去忽悠了,嘻嘻。

canvas–路径与画布状态

这周开始了canvas的初步学习,发现canvas里有两个很尴尬的方法:beginPath() — closePath();

看名字是一对对应的控制路径的方法,但是去官网上看,它俩压根一点关系都没有!!!??

canvas中beginPath()是开始描绘路径,这之后的fill()或者stroke()方法使用时都会往上追溯到beginPath()的地方,比如我先画一条线,描成黑色,再画一条线,描成红色,这时候第一条线也还会红,所以它黑-红相加了。那如何打断这种联系呢,并不是closePath(),而是重新beginPath()…

closePath()事实上用法和它的名字是一致的,创建当前点到起始点的路径,在PS里这个操作之后路径就闭合了,在canvas里这个路径也是闭合了,但是并没有结束这个路径,继续画新的形状后,再填充或者是描绘,还是会追溯到beginPath()。

所以beginPath()理解为newPath(),这个思路就顺了。

再来说画布状态,当画布进行旋转、缩放等操作时,这个改变了的状态是可以被保存和还原的,这对方法是:save()和restore()。

看名字是一对,事实上他们也确实是一对名正言顺的方法对,不是所有的命名都和Path()那样瞎来。

save()方法可以多次叠加使用,每次restore()会返回到上一次save()的状态。而且restore()对应不到save()会有报错,反之,save()不需要对应restore()。

restore()的操作会还原画布的状态,但是不会还原画布里面已经有的元素状态,所以还是可以放心大胆的瞎画。

let’s canvas。

CSS3 滤镜

CSS3 Filter(滤镜)属性提供了提供模糊和改变元素颜色的功能。CSS3 Fitler 常用于调整图像的渲染、背景或边框显示效果。

-webkit-filter是css3的一个属性,Webkit率先支持了这几个功能,感觉效果很不错。下面咱们就学习一下filter这个属性吧。

现在规范中支持的效果有:

grayscale 灰度                 值为0-1之间的小数
sepia 褐色       值为0-1之间的小数
saturate 饱和度     值为num
hue-rotate 色相旋转  值为angle
invert 反色       值为0-1之间的小数
opacity 透明度     值为0-1之间的小数
brightness 亮度     值为0-1之间的小数
contrast 对比度     值为num
blur 模糊       值为length
drop-shadow 阴影

其中,drop-shadow是可以穿透透明的阴影模式,可以利用此方法为透明元素增加阴影,不再受限于方框了。

 

首先声明,C语言没有类,类是C++里的。

C++世界,一切现实的事物都是对象,那类就是近似的对象的虚拟称呼,比如人“类”,类只是一种声明,不占用内存,比如“恐龙”这个类,没有实例,不占自然资源。

所有的类都有通用的属性,哺乳类会有身高,体重,都有通用的方法,如哺乳。

类的声明:类使用Class关键词声明,是自定义类型,如:

Class Person{

public:

char *name;

int height;

void say(){

printf_s(“HELLO,大家好,我身高%d”,height);

}

private:

int weight;//体重是秘密

}

其中private是私有属性,外部不可以访问,属性可以私有,方法也可以私有,声明在private下面的都为私有属性方法,声明在public都是公开的属性方法,外部可以访问。

类是创建对象的模板,创建对象的过程是类的实例化,每个对象都是一个实例,拥有类的属性和方法,对象是实在的数据,需要占用内存,如小明,是人类的一个实例,需要占用自然资源,如:

Person man;

man.name = “小明”;

man.height = 180;

man.say();

 

面向对象编程的设计思想

程序中,不单有数据,数据间存在一定的关系,而且,还存在着大量的在这种关系上的“运算”。
如果把数据及其上的运算,“封装”起来,就形成基本的“对象”的概念。
因此,对象是由数据成员和运算成员(函数成员)封装而成的。
数据成员又称为对象的“属性”;
函数成员又称为对象的“方法”。
将具有相同属性和方法的多个对象中,用“抽象”的方法,提取出其中的属性和方法,就构成了“类”,其实就是“类型”的意思。
将类实例化(计算机化、存储实现)就成为“对象”(实例)。
因此,对象的基本概念中的第一个“对象”其实是面向世界的;
“类”是面向逻辑的;

我个人理解面向对象就是面向职能模块,每一个类都专注于做一件事情,允许每个实例有个体化的特征,比如所有前端工程师的核心方法是页面重构,都有工具属性,性别属性等,但是工具,性别又会有所不同。

其它有待扩展

c-fseek

C语言中fseek函数掌握了文件流的进度和位置,可以实现文件中读写数据的跳跃。

int ret = fseek(文件指针,偏移值,相对位置)返回值为0||-1,当0时seek成功,-1时失败

每个被fopen的文件对象,其数据结构里都有一个位置指示器指向当前文件的读写位置,fseek就是让这个指示器从当前位置发生偏移从而实现数据的跳跃,正整数往后,负整数往前,如下:

const char* filename = “e/aaa.txt”;

File* fp = fopen(filename,”rb”);//此时指示器的值为0

unsigned char buf[128];

int ret = fseek(fp,32,SEEK_SET);//此时返回值为0,seek成功

int n = fread(buf,1,4,fp);//此时buf的值为32开始的4个字节

有了fseek以后,文件的读取可以动态起来了,跳跃式的读取可以略过中间不需要的数据直接读取到目标,但是方式还是略微死板,而且seek不能多用,因为seek时需要移动物理“磁头”,在硬盘、U盘等外部存储器上频繁的读写,速度比较慢,还会影响设备的寿命。期待其它的读写器。

C-文件-1

C语言可以编写各种后缀名的文件,尴尬,后缀名为mp3,xyz,都毫无压力,所有的文件类型都可以用来存储信息,主要看如何读取了。当然,这么高端的方法现阶段我还没有学到,现在只会读写数据。

C语言读写文件很简单,告诉程序文件的位置,打开它的方式,然后读写,然后关闭。主要是四个函数:fopen,fwrite,fread,fclose.

FILE* fp = fopen(文件路径指针,打开方法);返回值为文件指针,我使用的是fopen_s,安全性提高,返回值是一样的。例如下:

FILE* file;
errno_t fp;
fp = fopen_s(&file,”E:\\a.txt”,”r”);
if (fp != 0) {
printf_s(“文件打不开啊啊啊\n”);
return -1;
}

此处留疑问一个:fopen打开文件后,此时文件是在内存中吗?似乎不太可信,留疑。

Int n = fwrite(目标字符,写入字节大小(默认为1),写入次数(一般设置为sizeof(目标字符)),目标文件指针);返回值是写入的字节数,例如下:

for (int i = 0; i < 256;i++) {
char text[] = “helld,”;
n = fwrite(text, 3, strlen(text)/3,  file);
}

一般写入字节用1避免目标不能整除,多写了溢出字符,产生乱码。案例为错误示意。

Int m = fread(目标存储区域,读取字节大写,读取次数,目标文件指针);返回值是读取次数

char buf[128];
n = fread(buf, 12, 128, file);

Fclose(目标文件指针),关闭文件;无返回值

适合和fwrite一起使用的函数有sprintf(目标存储区域,输出格式(“%d”或者“%.2lf”),目标字符串):可以把数组格式化为有分隔符的字符串。返回值为格式化的字符大小,我使用的是sprintf_s,没区别,例如下

for (int i = 0; i < arr_len;i++) {
char text[128];
int s = sprintf_s(text,”%d,”,arr[i]);
n = fwrite(text, 1, strlen(text),  file);
}

读取未知大小文件,有函数feof(file)判断文件是否读取结束,返回值为布尔类型,为true时文件读取结束,下例以每次读4*1字节的方式循环读取文件数据,读完为止。

char buf[4];
int i = 1;
while (!feof(file))
{
int n = fread(buf, 1, 4, file);
if (n>0) {
printf_s(“read %d bytes,time %d,file is end:%d \n”, n,i, feof(file));
}
i++;
}