为期两周的课设终于结束了,我们组选择的题目当然是我邮软件祖传的课设项目TTMS(Theater Ticket Management System 剧院票务管理系统),说来也很惭愧,整个项目自打三月份人机界面课程大作业时候就已经开始,直到现在六月份,开发周期长达三个月,然而功能上还有很多欠缺。 项目首页: https://github.com/fujie-xiyou/TTMS_2.0 那就先从项目的界面说起 界面部分采用JAVAFX开发,JAVAFX是JAVA8主推的图形库,相比Swing有很多方便的特性,比如对css的支持,就让我们的项目在美化过程中变得非常轻松。 而JAVAfx的缺点在于官方文档不够全面,网上的资料也相对比较少,做很多东西都要查资料查很久或者自己慢慢摸索。 说几个界面开发过程中的坑点 Javafx时间选择器 在开发 演出计划管理 用例时,需要给用户提供一个选择时间日期的工具,而javafx也自带了日期选择器,令人不解的是却没有提供时间选择器!!! 如果直接让用 继续阅读 >>


刘付杰 18/06/20 21:19:58
由于目前还没有用MySQL进行过完整的程序的开发,因此本文部分说法可能不严谨,还请见谅. 在使用MySQL开发程序的时候一般我们要单独为一个程序设计一个数据库. 首先,我们登录MySQL管理界面,新建数据库 CREATE DATABASE 数据库名; 在这里为了避免在使用的时候出现中文编码错误的问题,我们最好在创建数据库的同时指定数据库使用的字符集,使用以下语句创建数据库并指定字符集为utf-8 CREATE DATABASE 数据库名 CHARACTER SET utf8; 然后,”使用”该数据库 USE 数据库名; 接着我们要在数据库里创建我们要用来存储数据的表,例如 CREATE TABLE 表名 ( 字段名1 类型, 字段名2 类型, ... ); 查看我们新建的表的结构 DESC 表名 创建完数据表后我们应该给表里面插入几条测试数据.使用如下SQL语句 INSERT INTO 表名 继续阅读 >>


刘付杰 17/08/07 00:25:43
我们知道多个线程之间有很多内存资源都是共享的,灵活的同时也会造成一些问题,就是当两个线程都要使用同一个资源的时候,例如两个线程同时对一个全局变量进行赋值然后打印,就会出现同步问题,有可能 线程2打印出来的结果实际上是线程1对其赋的值.因此,Linux提供了几种方法用来解决多线程同步问题,在这里主要探究一下互斥锁和条件变量之间的瓜葛. 先简单的说一下互斥锁: 互斥锁是通过锁机制来实现线程间同步的一种方法.在同一时刻它通常只允许一个线程执行一个关键部分的代码. 下面列举操作互斥锁的几个函数: 函数 功能 pthread_mutex_init 初始化一个互斥锁 pthread_mutex_destroy 注销一个互斥锁 pthread_mutex_lock 加锁,如果不成功,阻塞等待 pthread_mutex_unlock 解锁 pthread_mutex_trylock 测试加锁,如果不成功则立即返回,错误码为EBUS 继续阅读 >>


刘付杰 17/08/04 14:30:45
本文旨在对自己所写的myshell中的几个思路做以记录 多管道复合 整体的思路是每个管道符隔开的命令将由shell进程创建一个子进程去执行,那么每个管道符隔开的命令之间将会是一系列兄弟进程,因此问题就在于怎么把数据在兄弟进程之间传递,一开始打算使用高端的pipe()函数,但是过程中反复调试总有问题,可能是自己对进程的理解不够深入,最后的解决方案是使用两个临时文件,pipe_w负责写入管道前的命令的执行结果 ,管道后面的命令在开始执行之前先将pipe_w重命名成pipe_r并从中读取输入,这样如果该条命令的后面还有一条管道,则可以继续创建pipe_w并将执行结果写入其中. 多组输入输出重定向组合 对于多组输入输出重定向的解决方案感觉有点丑陋,但这里还是做以记录,等到将来自己能够实现更好的做法之后再回来嘲笑自己,哈哈. 核心的思路就是,对于每个输入或输出重定向都单独的fork一个新的进程去执行, 例如: cat > 1 > 2 > 3 这个复合重定向,实际上我是将其拆分成 继续阅读 >>


刘付杰 17/07/30 22:24:41
在学习Linux c编程实战的进程控制一章时,书上关于孤儿进程的例子如下: #include<stdio.h> #include<sys/types.h> #include<unistd.h> #include<stdlib.h> int main(){ pid_t pid; pid = fork(); int n = 5; switch(pid){ case 0: while(n--){ printf("当前为子进程 pid = %d," "ppid = %d\n",getpid(),getppid()); sleep(3); } break; case -1: printf("进 继续阅读 >>


刘付杰 17/07/24 16:42:51
        首先是参数的解析,尽管此次仅要求完成ls三个功能选项,但是即便只有三个功能选项,加上n个文件路径的参数, 手动解析这样的参数还是动作有点多. 还好,Linux提供了一个专门用于解析命令的函数: getopt() 示例如下: #include<stdio.h> #include<unistd.h> int main(int argc , char ** argv){ int oc; char ec; while((oc = getopt(argc,argv,"laR")) != -1){ switch(oc){ case 'l': printf("有l选项\n"); break; case 'a' : 继续阅读 >>


刘付杰 17/07/24 00:25:41
这一周以来一直与Linux的文件操作相关系统调用打交道,其与C语言中的文件操作函数有些许相似但又千差万别.尤其是open()函数的参数,相当复杂,因此作以记录便于查阅. 对于用Linux系统调用进行文件的常用操作作以总结 主要是关于open()系统调用的各个参数做记录. 简述:open是UNIX系统(包括LINUX、Mac等)的系统调用函数,区别于C语言库函数fopen。 #include<fcntl.h> int open(constchar*pathname,intflags); int open(constchar*pathname,intflags,mode_tmode); 返回值:成功则返回文件描述符,否则返回-1 对于open函数来说,第三个参数仅当创建新文件时(即 使用了O_CREAT 时)才使用,用于指定文件的访问权限位(access permission bits)。pathname 是待打开/创建文件的POSIX路径名(如/home/user/a.cpp);f 继续阅读 >>


刘付杰 17/07/23 23:12:38
前几天在做课程设计的过程中,碰到一个小问题,有关于C语言几种标准输入的处理机制,做了如下测试。 1.scanf()的%c #include<stdio.h> int main(){ char a,b; scanf("%c",&a); scanf("%c",&b); printf("%d %d\n",a,b); } 输入 a 回车 输出 97 10 结论1: scanf的%c读取一个字符 然后本次按下的回车会留在缓冲区,可以被接下来的带%c参数的scanf或者getchar接收。附:getchar()等价于scanf(“%c”) 2.scanf()的%d #include<stdio.h> int main(){ int b; char a,c,d; scanf("%c",&a); scanf("%d",&b); scanf("%c",&a 继续阅读 >>


刘付杰 17/06/24 18:37:43
将Ubuntu安装至U盘,得到“Ubuntu棒” 为什么要把Ubuntu安装至速度慢稳定性又差的U盘? 这样我们就能随身携带一个自己熟悉的常用的工作环境,不管的在宿舍,去机房,甚至是在网吧打完游戏突然想撸一段代码(有些网吧又BIOS锁..囧),都可以从口袋里掏出自己的”Ubuntu棒”插上电脑开始装逼..哦不学习… 安装到U盘的Ubuntu性能如何? 本人测试将Ubuntu16.04安装在一个破旧的垃圾USB2.0的8gU盘上,实际用起来打开软件确实慢的有点难受,不过打开之后运行阶段是没有明显的卡顿感的。反正要比学校机房的虚拟机体验要好的多。 开始安装 本教程将带领你在uefi+gpt模式下给U盘中安装Ubuntu。 1. 准备两块U盘,一块用于刻录Ubuntu安装镜像,我们暂且称之为安装盘,另一块用于将Ubuntu安装在其中,暂且称之为系统盘。 2. 有关于Ubuntu安装镜像的刻录这里不再赘述,自行在一块U盘中刻录好安装镜像。 3. 给系统盘分区: 这里分区的时候我用的 继续阅读 >>


刘付杰 17/06/05 19:58:54
1