archlinux-安装笔记

花了一些时间安装arch,记录一下注意事项。

多重引导

  • 安装多重引导支持
    pacman -S os-prober
  • 更新grub
    grub-mkconfig -o /boot/grub/grub.cfg
  • 写入mbr
    grub-install --target=i386-pc --recheck /dev/sda

图形化的网络服务

systemctl enable NetWorkManager.service

wifi配置

  • 如果你想使用wifi(在图形界面下),首先你要停止dhcp服务systemctl stop dhcpcd.service
  • 开机停止运行systemctl disable dhcpcd.service
  • 我们之所以这样,是为了保证我们的NetWorkManager正常服务。

session控制器

我选择的是gdm,原因是slim我不太会配置。
pacman -S gdm

另外patheon在我书写这篇blog的时候,还是存在不少bug.官方的wiki在这个时候也不是很好用了。期待patheon!

添加了官方给的patheon库,会出现一个gnome-lib的冲突

输入法的注意事项

使用fcitx需要注意.xprofile的配置问题。

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"

其他的安装情况可以看看官方的wiki

sudoer的配置

使用pacman安装sudoer

pacman -S sudo

编辑/etc/sudoers,取消wheel用户组的注释.

vim配置

gvim中,直接使用synatic on而不用判断,否则会造成代码高亮失效。

locate配置

安装以后发现locate命令无法使用,安装pacman -S mlocate

另外, mark一个项目:gitbook, 很好很强大

应该涵盖了所有的我安装时候遇到的问题,如果还有什么问题,我再后续添加。

Linux-进程间的通信

实验内容

消息的创建,发送,和接收。

<任务>

使用系统调用 msgget( ), megsnd( ), msgrev( )及 msgctl()编制一长度为 1K 的消息发送和接收的程序 。

程序设计

  1. 为了便于操作和观察结, 用一个程序为引子 , 先后fork( )两个子进程 , SERVER 和 CLIENT,进行通信。
  2. SERVER 端建立一个 Key 为 75 的消息队列,等待其他进程发来的消息。当遇到类型为 1 的消息,
    则作为结束信号,取消该队列,并退出 SERVER 。SERVER 每接收到一个消息后显示一句 “(server)received”。
  3. CLIENT 端使用 Key 为 75 的消息队列,先后发送类型从 10 到 1 的消息,然后退出。最后的一个
    消息,既是 SERVER 端需要的结束信号。CLIENT 每发送一条消息后显示一句“(client)sent”。
  4. 父进程在 SERVER 和 CLIENT 均退出后结束。

使用的函数

并非每次创建消息队列都会成功,所以重新添加-1情况的判断。
可以使用ipcs -q命令查看

源代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>
#define MSGKEY 75
struct msgform
{
    long mtype;
    char mtexe[100];
}msg;
int msgqid, i;
void CLIENT()
{
    int i;
    msgqid = msgget(MSGKEY, 0777|IPC_CREAT);
    if( msgqid == -1)
    {
        puts("client error in build");
        return;
    }
    else
        printf("client qid is: %d\n", msgqid);
    for (i = 10; i >= 1; i --)
    {
        msg.mtype = i;
        printf("(client)sent mtype %ld.\n", msg.mtype);
        msgsnd(msgqid, &msg, strlen(msg.mtexe)+1, 0);
    }
    puts("client exit...");
    exit(0);
}
void SERVER()
{
    msgqid = msgget(MSGKEY, 0777|IPC_CREAT);
    if( msgqid == -1)
    {
        printf("error in build.\n");
        return;
    }
    else
        printf("server qid is: %d\n", msgqid);
    do
    {
        msgrcv(msgqid, &msg, 1030, 0, 0);
        printf("(server)received mtype %ld.\n", msg.mtype);
    } while (msg.mtype != 1);
    msgctl(msgqid, IPC_RMID, 0);
    puts("server exit...");
}
int main ()
{
    if(fork())
    {
        SERVER();
        wait(0);
    }
    else
        CLIENT();
    return 0;
}

运行结果

进程间的通信

ACM-zoj3789-排列利用


利用排列找规律。

首先利用next_permutation函数进行求排列

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int a[30];
int cal(int n)
{
    int sum = 0;
    int i;
    for (i = 1; i <= n; i++) {
        /* code */
        sum = abs(sum - a[i]);
    }
    return sum;
}
void parray(int a[], int len)
{
    int i;
    for (i = 1; i <= len; i++) {
        cout << a[i] << " ";
    }
    cout << endl;
}
void cp(int a[], int b[], int n)
{
    int i;
    for (i = 0; i <= n; i++) {
        a[i] = b[i];
    }
}
int main(int argc, const char *argv[])
{
    int i;
    for (i = 1; i <= 30; i++) {
        a[i] = i;
    }
    int n;
    int maxa[30], mina[30];
    while (~scanf("%d", &n)) {
        int max = -INF;
        int min = INF;
        if (n == 1) {
            cout << "1 1" << endl;
            cout << "1" << endl << "1" << endl;
            continue;
        }
        while (next_permutation(a+1, a+n+1)) {
            /* code */
            int temp = cal(n);
            if (temp >= max) {
                max = temp;
                cp(maxa, a, n);
            }
            if (temp <= min) {
                min = temp;
                cp(mina, a, n);
            }
        }
        cout << min << " " << max << endl;
        for (i = 1; i <= n; i++) {
            cout << mina[i] << " ";
        }
        cout << endl;
        for (i = 1; i <= n; i++) {
            cout << maxa[i] << " ";
        }
        cout << endl;
    }
    return 0;
}

代码如上。

可以观察出规律,然后即可AC。

详细代码下次再写= =

AC代码

#include <stdio.h>
#include <string.h>
#include <cmath>
using namespace std;
int main()
{
    int i, n;
    int max, min;
    while(~scanf("%d", &n))
    {
        max = min = 0;
        for(i = n; i >= 1; i--)
            min = abs(min - i);
        for(i = n-1; i >= 1; i--)
            max = abs(max - i);
        max = abs(max - n);
        printf("%d %d\n", min, max);
        for(i = n; i >1 ; i--)
            printf("%d ", i);
        puts("1");
        for(i = n-1; i >= 1; i--)
            printf("%d ", i);
        printf("%d\n", n);
    }
    return 0;
}

规律在代码中,很明确。

使用cd快速在目录间移动

难得看见一篇好文= =

操作方法

在此学习并且记录。

  • 标记一个书签: mark [书签]
  • 进入一个书签: g [书签]
  • 输出全部标签: gs

实现原理

sudo vim /etc/profile
也可以使用:w !sudo tee %这种方式来保存

# mark
export MARKPATH=$HOME/.marks
export MARKDEFAULT=sanguo#设置你的默认书签,可以直接输入g跳转
function g {
   local m=$1
   if [ "$m" = "" ]; then m=$MARKDEFAULT; fi
   cd -P "$MARKPATH/$m" 2>/dev/null || echo "No such mark: $m"
}
function mark {
   mkdir -p "$MARKPATH"
   local m=$1
   if [ "$m" = "" ]; then m=$MARKDEFAULT; fi
   rm -f "$MARKPATH/$m"
   ln -s "$(pwd)" "$MARKPATH/$m"
}
function unmark {
   local m=$1
   if [ "$m" = "" ]; then m=$MARKDEFAULT; fi
   rm -i "$MARKPATH/$m"
}
function gs {
   ls -l "$MARKPATH" | grep ^l | cut -d ' ' -f 13-
}
_completemarks() {
   local curw=${COMP_WORDS[COMP_CWORD]}
   local wordlist=$(ls -l "$MARKPATH" | grep ^l | cut -d ' ' -f 13)
   COMPREPLY=($(compgen -W '${wordlist[@]}' -- "$curw"))
   return 0
}
complete -F _completemarks g unmark

筛素数更正

写在之前

maker关于线性筛素数的论文。

做到欧拉线性筛法再做补充。(当时还写了个这?)

关于线性筛素数

  • 之前一直没有正视线性筛素数的问题。今天特意来写一个伪证明。如果当前的i不是素数,那么必然被之前的某个素数筛掉了。i × prime[j]。
    一个合数必然可以写成几个素数的乘积,再或者就是p×i这种形式。如果能被i×p1筛掉之后则不需要i×p2继续筛了,i×p2可以写成p1×(i×p2)

例如12可以被6×2筛掉,之前4×3这种筛除就可以去掉。

  • 这种方法会不会存在没有筛掉的合数?

不可能:i会一直到n,也就是整个范围都会包含在内。

代码:

memset(Prime, 0, sizeof(Prime));
memset(IsPrime, 1, sizeof(IsPrime));
for(i = 2 ; i <= n; i++)
{
    if(IsPrime[i])
        Prime[num++] = i;
    for(j = 0; j < num && i * Prime[j] <= n; j++)
    {
        IsPrime[i * Prime[j]] = 0;
        if(i % Prime[j] == 0) break;
    }
}

之前的错误在于筛素数的时候没有筛去2的倍数,所以出现后面的值错误。

关于今天的健身

今天下午去健身。

牛奶事件

先去了新世界陪睡在我下铺的兄弟买杯子。也是见识了伟大的坑爹商场——放了一个大大的10元标签,下面写了一个小小的某品牌牛奶。然后放在下面两种牛奶。

在下眼力尚可,拿了没有标签的15元一杯。结账的时候才发现,也是醉了。随后付钱的时候发现了这个机智的想法——我个人认为这样做生意不会长久,不知道诸位如何作想。

健身问题

不知罗伯特何处去也,只得我两个孤独的健身。但是今天练的着实不够理想——一方面,没有练肱二头;另一方面,感觉背部的重量太小了,不太合适。于是,决定下一次加大重量,顺便为我的健友鼓劲。

感谢王大哥的指导!

关于最近


谈谈算法

今天上午一个团体赛,晚上一个bestcoder,水了自己一脸呵。

究其原因,可能有中午没有休息,晚上来的太晚,没有好好吃饭等等。


探究原因

仔细想想,最近这段时间对于学习,生活,等等一系列的事情是否有够认真努力呢?

怕是一般情况吧= =。晚上做题的时候猛然发现之前有错的线性筛素数模版有问题,也是没有及时修正。此外,欧拉函数等等也是忘记的差不多了,太水。

没有做好,做完的事情: 操作系统的书写还是差着不少,另外,并行计算的文档还没有成型。。总之,感觉就像是什么事情都没有做好一样。心塞。

那么这段时间我到底干什么了呢?这个问题也是值得深究的。

  • 用了很多的时间在Python的学习以及Linux的学习上了。
  • 不能说是浪费时间,但是对于ACM,对于我现在要做的事情,的确是有所偏差。(应该算是另一种娱乐吧)
  • 此外,还学习了线性代数。但是学习的效果如何呢?是不是太慢了,或者太过于悠哉游哉了呢?

似乎就是有点吧,可能太过于悠哉游哉了。尽管没有完成任务,但是还是觉得自己做了点东西。星期四和星期五,也是没有好好的把时间铺在算法上面,看这个看那个——用封老师的话来说,就是没出息。

哈哈= =

生活中缺少一股紧张的气息,所以可能做的不够。这是目前给自己找的原因。我想我需要一个时间好好的思考一下,处理一下自己究竟应该怎么处理自己的学习问题。

如果每次都是有些遗留,或者忘记了自己本来的目的,那么真是浪费时间了。