kasuのブログ

勉強していく

Redbubbleでステッカー達を購入しました :)

Gopherくん 第二弾!

第二弾です。

残すところ、あと一弾...泣

www.instagram.com

#gopher #nuxt #github #redbubble

Redbubble

Awesome products designed by independent artists | Redbubble

Gopherくんだけじゃなくて、nuxtも欲しいなあと探してて見つけました。

www.redbubble.com

www.redbubble.com

www.redbubble.com

StickerMule Unixstickers を購入しました :)

Gopherくん 第一弾!

第一弾です。

第三弾まであります :)

www.instagram.com

#golang #gopher #stickermule #macbookpro #sticker

StickerMule

ステッカーパックが1ドルで買えるとTwitterで見かけたので、今更ながら買いました。

そのおかげで、色々欲しくなってしまい第三弾まで出来てしまいました。orz

www.stickermule.com

競プロ golang 複数行文字列を配列で返してテストで使う

複数行文字列をリストにしたい

パッケージ化しました

github.com

インストール
go get github.com/ergofriend/ml2array
使い方
input := `4 5 2
0 1 2 1
0 2 1 2
1 2 1 1
1 3 1 3
2 3 2 1`

result := ml2array.Make(input)

for i := 0; i < len(result); i++ {
    fmt.Printf("%d行目:%s\n", i, result[i])
}

やっていく

現在のテストコード

現在のテストコードは1行ずつリストで足していくやり方です。

func getTests() []testValue {
    testValues := []testValue{
        testValue{
            []string{
                "3 6",
                "3 4 5",
            },
            "2"},
    }
    return testValues
}

しかし、競プロなどで例として載っけられているテストケースは複数行のテキストです。

↓こんな感じ

Image from Gyazo

これを一回でコピペしてテスト出来るようししていきます。

複数行文字列

goでは、こんな風に書きます。

input := `4 5 2
0 1 2 1
0 2 1 2
1 2 1 1
1 3 1 3
2 3 2 1`

まずappend等での速度低下をなくすために、行数を数えて必要な大きさのスライスを作成します。

var lineCount int
for i := range input {
    if input[i] == 10 {
        lineCount++
    }
}
resultArray := make([]string, lineCount)

最後に、各行をスライスに代入します。

var i int

scanner := bufio.NewScanner(strings.NewReader(mlstring))
for scanner.Scan() {
    resultArray[i] = scanner.Text()
    i++
}

終わりのテストコード

関数化して使いやすくします。

func getTests() []testValue {
    testValues := []testValue{
        testValue{
            ml2array.Make(`4 5 2
0 1 2 1
0 2 1 2
1 2 1 1
1 3 1 3
2 3 2 1`),
            "2"},
    return testValues
}

完成!

ハードウェア乱数生成

Image from Gyazo

ハードウェア乱数生成

/dev/urandom を使ってランダムなパスワードを生成する方法を読むと、

>env LC_ALL=C tr -dc a-zA-Z0-9 < /dev/random | fold -w 20 |head -1
6drFed868QT6LGyiwqUU

/dev/random

/dev/randomから読み込んだ中には記号も含まれているので、isalnum(buf[i])で文字・数字だけを出力しています。

>gcc makepasswd.c -o makepasswd
>./makepasswd
htC7LG0wjqE1XPo16AGasqLIELhlpyOJp
#include <stdio.h>

int isalnum();

int main()
{
    FILE *fp;
    char buf[128];

    fp = fopen("/dev/random", "rb");
    // fread(保存先, 保存する大きさ,  保存する大きさの個数,読み込み元)
    fread(buf, sizeof(buf), 1, fp);
    for (int i = 0; i < sizeof(buf); i++)
    {
        if (isalnum(buf[i]))
            printf("%c", buf[i]);
    }
    printf("\n");
    return 0;
}

パフォーマンスメトリック

ホップごとの遅延値

  • proc_delay: 処理遅延 (Processing delay)
  • queue_delay: 渋滞遅延 (Queueing delay)
  • link_distance: リンクの距離(Link distance)
  • propagation_speed:リンクの伝播スピード(propagation speed)
  • pkt_len: パケットサイズ(Packet size)
  • transmission_rate: リンクの伝送速度(Transmission rate)

伝播遅延(Propagation_delay) = link_distance / propagation_speed

伝送遅延(Transmission_dalay) = Packet_size / transmission_rate

ホップごとの遅延値(Per-hop delay)[ms] = proc_delay + queue_delay + Propagation_delay + Transmission_dalay

#include <stdio.h>
#include <stdlib.h>

float per_hop_delay(float proc_delay, float queue_delay, float link_distance, float propagation_speed, float pkt_len, float transmission_rate)
{
   float transmission_dalay;
   float propagation_delay;
   transmission_dalay = pkt_len / transmission_rate;      //伝送遅延
   propagation_delay = link_distance / propagation_speed; //伝播遅延
   return proc_delay + queue_delay + propagation_delay + transmission_dalay;
}

void main(int argc, char *argv[])
{
   float proc_delay = atoi(argv[1]);
   float queue_delay = atoi(argv[2]);
   float link_distance = atoi(argv[3]);
   float propagation_speed = atoi(argv[4]);
   float pkt_len = atoi(argv[5]);
   float transmission_rate = atoi(argv[6]);
   printf("per_hop_delay= %f ms\n", per_hop_delay(proc_delay, queue_delay, link_distance, propagation_speed, pkt_len, transmission_rate));
}

gcc per-hop-delay.ca.outコンパイル

例題

  • 処理遅延 (Processing delay) = 0.1 ms
  • 渋滞遅延 (Queueing delay)= 20 ms
  • リンクの距離(Link distance)= 200 km
  • リンクの伝播スピード(Propagation speed)= 3・10 ^ 8 m/s
  • パケットサイズ(Packet size) = 1500 bytes
  • 10 Mbps Ethernet Link (リンクの伝送速度(Transmission rate)= 100 Mbps)

単位をそろえて実行する。

> ./a.out 0.1 20 1000000 300000000 1500 10000000
per_hop_delay= 20.003485 ms

VuePress theme デフォルトをいじる

VuePress フォントを変える

Noto Sans JP に変更します。 https://fonts.google.com/specimen/Noto+Sans+JP

vuepress eject docsでデフォルトの theme コンポーネント書き出し。

docs/.vuepress/config.js

module.exports = {
  head: [
    [
      'link',
      {
        rel: 'stylesheet',
        href: `https://fonts.googleapis.com/css?family=Noto+Sans+JP`
      }
    ]
  ]
};

docs/.vuepress/theme/styles/theme.styl

body
  font-family 'Noto Sans JP', sans-serif
  -webkit-font-smoothing antialiased
  -moz-osx-font-smoothing grayscale
  font-size 17px
  color $textColor

Navbar 検索バーを一番右に

NavLinks.vue

.nav-links {
  display: inline-block;
  margin-right: 2rem;

Navbar.vue

<template>
  <header class="navbar">
    <SidebarButton @toggle-sidebar="$emit('toggle-sidebar')"/>

    <router-link
      :to="$localePath"
      class="home-link"
    >
      <img
        class="logo"
        v-if="$site.themeConfig.logo"
        :src="$withBase($site.themeConfig.logo)"
        :alt="$siteTitle"
      >
      <span
        ref="siteName"
        class="site-name"
        v-if="$siteTitle"
        :class="{ 'can-hide': $site.themeConfig.logo }"
      >{{ $siteTitle }}</span>
    </router-link>

    <div
      class="links"
      :style="{
        'max-width': linksWrapMaxWidth + 'px'
      }"
    >
      <NavLinks class="can-hide"/>
      <AlgoliaSearchBox
        v-if="isAlgoliaSearch"
        :options="algolia"
      />
      <SearchBox v-else-if="$site.themeConfig.search !== false"/>
    </div>
  </header>
</template>