Wednesday, April 17, 2019

自己购买4k显示屏P2415Q的经历

希望写下这篇文章可以给想买P2415Q显示器的读者有一些帮助

设备情况

笔记本 i5-7300HQ 黑苹果

为什么挑选这款显示器

  1. 网络上很多人推荐, 评价不错
  2. 4k的分辨率并且价格优惠

经历

一开始我并没有直接考虑这一款4k显示器, 而是一款1080分辨率的显示器U2417H, 但是呢买过来, 发现并没有想象中的好, 有轻微的阴阳屏, 写代码的时候颗粒比较明显, 从而导致了, 我考虑4k显示器
当然, 我也有一些疑虑, 比如我的cpu是否可以带的动, 是否支持4k的分辨率
由于身边并没有人用4k的屏幕, 我并没有办法打消自己的疑虑, 只能去实体店来来测试, 结果到了实体店发现并没有4k显示器的样机, 最后终于在败家之眼找到了一台4k样机, 最后测试的结果是支持4k, 但是流畅度没有1080的流畅, 但是就正常写代码是完全没有问题的

使用后的感觉

相比之前的U2417H来说呢, 是一点点颗粒感都没有, 显示代码是非常非常的清晰

但是由于cpu原因呢, 看在线视频的时候呢, cpu占用会比较高

Monday, April 8, 2019

在单个文件中, 如何只提交部分更改给git

很多时候写代码, 会心血来潮的就修改了很多的bug, 然后又添加了很多代码, 那么如何分开提交呢?
按照以前我刚开始学git那会, 一直都是手动改代码, 手动还原, 等commit以后再还原回去, 非常的麻烦

小技巧 git add -p



1
2
3
4
5
6
7
8
9
10
11
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
e - manually edit the current hunk
? - print help
输入对应的字母就可以了

Wednesday, April 3, 2019

电信呼叫转移和VoLTE冲突的破事

经过

手机卡之前开过呼叫转移, 现在开了VoLTE, 导致了之前的呼叫转移失效, 打电话给10000号, 客服也不懂, 网上搜寻, 据说要…, 反正没解决, 去营业厅, 没解决, 无奈, 投诉

解决办法

电信10000号投诉

吐槽

就这事情, 浪费了好长时间, 现在的10000号变成了语言识别, 周围不能有一点杂音, 非常的难用
建议直接人工客服 直接按1键即可

Saturday, March 23, 2019

POJ-1159 将字符串变成至回文串




POJ 1159

最近发现做算法题最重要的是思路, 一开始的思路正确, 就会非常轻松的做出来, 反之, 会绕好长的路还不一定能出来…
这一题的关键是 最长公共子序列
我并没有想到… 然后呢, 在纸上模拟补齐, 嗯…
举个例子, Aba3bd和它的倒序db3abA, 它们的最长公共子序列是b3b, 所以只要最长的公共子序列对齐即可



1
2
A b a 3   b d
d b   3 a b A
只要对齐的字符越多, 要补的字符就越少
然后中间空出来的部分, 照抄上面的或者下面的
两边不同的部分, 直接错开对齐就行



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <cstring>
using namespace std;

int main() {
    int n;
    cin >> n;
    string data;
    cin >> data;
    
    data = " " + data;
 
    static short dp[5050][5050];
    memset(dp, 0, sizeof(dp));

    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (data[i] == data[n - j + 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
            } else {
                dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
            }
        }
    }

    cout << n - dp[n][n] << endl;





    return 0;
}
滚动数组版



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <cstring>
using namespace std;

int main() {
    int n;
    cin >> n;
    string data;
    cin >> data;
    
    data = " " + data;

    int dp[2][5050];
    memset(dp, 0, sizeof(dp));

    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (data[i] == data[n - j + 1]) {
                dp[i % 2][j] = dp[(i+1) % 2][j - 1] + 1;
            } else {
                dp[i % 2][j] = max(dp[i % 2][j - 1], dp[(i+1) % 2][j]);
            }
        }
    }

    cout << n - dp[n % 2][n] << endl;


    return 0;
}

关于约瑟夫问题自己理解过程


约瑟夫环问题

一开始我并没有完全理解这位博主的意思, 我还纳闷这公式是咋来的, 知道最后, 有一句理解这个递推式的核心在于关注胜利者的下标位置是怎么变的, 真是的一语惊醒梦中人

这里说一下我自己的理解, 一开始我其实是完全懵逼的状态, 看了WiKi上的说明, WiKi上是使用数学上的数学归纳法来推到出来的, 其实还是比较懵逼的
我们按照那位博主所说, 只关注那位幸存者, 这样问题一下就变得非常的简单, 我们假设一共有11个人, 每第3个人出局
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
我们假设f(N, M) = 最终幸存者的位置
这样f(11, 3)所表达的意思就是说, 11个人每3个人出局, 最终幸存者的位置
过程

1
2
3
4
5
6
7
8
9
10
11
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10                                                                 6
         3, 4, 5, 6, 7, 8, 9, 10, 0, 1                                                           3
                  6, 7, 8, 9, 10, 0, 1, 3, 4                                                     0
                           9, 10, 0, 1, 3, 4, 6, 7                                               6
                                     1, 3, 4, 6, 7, 9, 10                                        3
                                              6, 7, 9, 10, 1, 3                                  0
                                                       10, 1, 3, 6, 7                            3
                                                                 6, 7, 10, 1                     0
                                                                           1, 6, 7               1
                                                                                   1, 6          1
                                                                                          6      0
通过这种方式, 每次让出局的那个人的后面那个人出局, 可以让每次都是新的题目, 状态和上下都没有关系了
比如第一次, 是11个人, 每3个出局
到第二次, 就是10个人, 每3个出局, 单独来看的话, 结果是跟上面的没有关系的
不清楚有没有表达清楚
比如, 就拿第二次来说, 我继续从0开始写, 就是0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 这样的话, 状态是和上一次有关系的, 因为再下一次出局的人是5, 而这个5排在第4个位置(从0开始数), 那我写成上面那样的话, 3, 4, 5, 6, 7, 8, 9, 10, 0, 1, 这样话, 我就相当与重新开始这样
这样, 每次出局一人, 我们就可以理解成每次人数减去1, 幸存者往前移动M个位置
f(N-1, M) = f(N, M) - M
这样公式大体就出来了, 然后, 我们需要再考虑下f(N, M) - M是负数的情况
于是公式就变成了这样
f(N-1, M) = (f(N, M) - M) % (N-1)
然后, 我们用逆向思维, 倒过来
f(N, M) = (f(N-1, M) + M) % N

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

int main() {
    // f(1, M) = 0
    int r = 0, n = 11, m = 3;
    for (int i = 2; i <= n; ++i) {
        r = (r + m) % i;
    }
    cout << r << endl;

    return 0;
}

Thursday, March 21, 2019

在Pull requests上添加commits

自己的Pull requests, 在Pull requests后, 如何再次添加commits上去

Pull requests是绑定你Pull requests的那个分支的, 所以说只要你push commits到你Pull requests上的那个分支就可以了
比如, 你在分支patch-1上修改了内容, 然后Pull requests到别人的仓库, 接下来, 你想继续修改, 直接commitspatch-1这个分支即可

如何添加commits到别人的Pull requests

只要Contributor没有取选Allow edits from maintainers就可以修改, 一般情况没人会取选

第一种方式: 通过网页来修改

非常简单, 点进commit里去, 右上角有个像笔一样的图标直接点进去修改提交即可

第二种方式: 通过命令行来修改

这个问题我一直想解决, Google了很多, 都没有发现有详细解决的
首先明确一点, 如果说Contributor没有取选Allow edits from maintainers, 那么默认maintainers 就可以修改Pull requests绑定的那一个分支
这样的话, 直接提交到那个分支即可
这里写下自己的命令, 使用了hub, 比用git省很多事, 不用复制用户名, 分支名啥的

1
2
3
4
hub pr list        # 列出PR
hub pr checkout xx # 要切换到的PR
xxx                # 这里修改然后commit
hub push           # push
这样就可以了

Monday, January 7, 2019

使用gpg钥对ssh进行认证

使用gpg钥对ssh进行认证

1. 生成gpg认证私钥


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
❯ gpg --expert --edit-key your_id                                    ## 使用专家模式, 不然没有认证的选项
gpg (GnuPG) 2.2.12; Copyright (C) 2018 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec  rsa2048/7DEFA5351BCE3C55
     created: 2019-01-07  expires: 2021-01-06  usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa2048/2FCE923F8ECB63F6
     created: 2019-01-07  expires: 2021-01-06  usage: E
[ultimate] (1). hhhhh <h@mail.com>

gpg> addkey
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (12) ECC (encrypt only)
  (13) Existing key
Your selection? 8                                                   ## 选8, RSA, 自定义权限

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Sign Encrypt                               ## 这里显示默认有Sign和Encrypt两种权限

   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? S                                                   ## 关闭Sign

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Encrypt

   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? E                                                   ## 关闭Encrypt

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions:

   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? A                                                   ## 开启Authenticate

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Authenticate

   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? Q                                                    ## 退出
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 1y                                             ## 有效期
Key expires at Tue Jan  7 11:33:54 2020 CST
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

sec  rsa2048/7DEFA5351BCE3C55
     created: 2019-01-07  expires: 2021-01-06  usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa2048/2FCE923F8ECB63F6
     created: 2019-01-07  expires: 2021-01-06  usage: E
ssb  rsa4096/19D32A8839DCAA1F
     created: 2019-01-07  expires: 2020-01-07  usage: A
[ultimate] (1). hhhhh <h@mail.com>

gpg> save                                                            ## 保存

2. 文件配置


1
2
3
export GPG_TTY=$(tty)
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
echo UPDATESTARTUPTTY | gpg-connect-agent 1> /dev/null
加入你的bashrc

1
enable-ssh-support
加入~/.gnupg/gpg-agent.conf

1
2
3
4
5
6
7
8
9
10
11
❯ gpg -k --with-keygrip
/Users/root/.gnupg/pubring.kbx
-----------------------------
pub   rsa2048 2019-01-07 [SC] [expires: 2021-01-06]
      8A9FC025A44AA4824C1F4AE27DEFA5351BCE3C55
      Keygrip = BEFCCDFE36CC5442B888B8459265C68B60A4ABD2
uid           [ultimate] hhhhh <h@mail.com>
sub   rsa2048 2019-01-07 [E] [expires: 2021-01-06]
      Keygrip = 422922ACFD099E79863D93B93333528F225C90FC
sub   rsa4096 2019-01-07 [A] [expires: 2020-01-07]
      Keygrip = 999A87A51CFE82DAA494BEB42F585051307F9E33
选择你新加的带有[A]标志的那个, 即999A87A51CFE82DAA494BEB42F585051307F9E33
加入到~/.gnupg/sshcontrol
运行ssh-add -l, 查看是否有加入
接下来运行gpg --export-ssh-key yourid导出ssh key放到你的服务器上的~/.ssh/authorized_keys
重启shell, 就可以连接了

Reference