F欄 フリーター dossyのプログラミング初心者日記  〜ええんやで〜

自分が思ったこと、試したこと、outputしたことを書き殴ってやる。夢は、賢い人になること!!!

vs codeで自分でshort cutを作成

qiita.com

こちらを参考にしてみました。

自分は、最初のエディタにfocusと、ターミナルにfocusを作成しました。

vscodeを使っていると、いちいちターミナルにカーソルを合わせて動かし、良い結果が取れなかったら書いているcode(file)にまたカーソルを動かして・・・・、というのが億劫だったので。

基本的には、既存のショートカットがある場合には+αで同じ設定を別のkeybindで行えるのが一般的です。 例)左のside barを消したり表示したりできる。"command + b" しかし、command + b 以外のkey bindでも同じ動きをしたい場合にこのqiitaの設定を行います。 これを行うと、command + b 以外の自分で設定したkey bindが出来上がります。 自分は、control + : とかにしてみました。

しかし、これ以外に自分でショートカットを作成できる方法があります。 key bindのキーボードショートカット画面で右上のfileのアイコンがあるのでclickすればkeybinds.jsonというfileがひらけます。

そこに、自分で設定したい自分だけのkey bindがかけます。

例) これは、ctrl + ]を押すとターミナルにfocusできるようにしたkey bindです。

[
  {
    //editer => tarminal
    "key": "ctrl+]",
    "command": "workbench.action.terminal.focus",
    "when": "editorTextFocus"
  },
]

自分で、いくらでも追加でかけちゃうので既存のkey bindだけでは物足りないという人はやってみてください。

golangでos packageがどうなっているか気になったので、できる範囲で調べてみた

最近は、pythonを触ってます。 golangでもそうなのですが、os.Open("python.py")みたいな記述ってありますよね。

いわゆる、自分のpcのfileを取得しようとしているのですが、正直全部packageがやってくれてるので使う身としては気にしなくていいところなんですよね。

でも、気になってしまいました。正直この辺を知っておけば、夢であるサードパーティ作成に近くのではないかと思ってます。

なので、わかる範囲までですが、os packageを調べました。

1 import osする os.Open() ではopen funcを使用してます。

2 open funcをみる

func Open(name string) (*File, error) {
    return OpenFile(name, O_RDONLY, 0)
}

引数として、strを取得している => "python.py"のfile名かな そして、return でOpenFile funcを呼び出している

3 OpenFile funcをみる

func OpenFile(name string, flag int, perm FileMode) (*File, error) {
    testlog.Open(name)
    f, err := openFileNolog(name, flag, perm)
    if err != nil {
        return nil, err
    }
    f.appendMode = flag&O_APPEND != 0

    return f, nil
}

このあたりからこんがらがってくる。 引数で取得するのは、3つ nameとflag とperm nameはfile名。flagは?permは?

flagはO_RDONLYを渡している。これは、定数として定義されてるらしい。

const (
    O_RDONLY int = syscall.O_RDONLY // open the file read-only.
    O_WRONLY int = syscall.O_WRONLY // open the file write-only.
    O_RDWR   int = syscall.O_RDWR   // open the file read-write.
)

では、その右辺はなんなのか?syscall.O_RDONLY? syscall packageを使用して、O_RDONLYを呼び出しているみたいです。 では、syscall packageの中身をみると?

const{
O_RDONLY = 0x0
O_RDWR     = 0x2
O_CREAT    = 0x200
)

中には0x0という値が入ってました。これ、binary(二進数)だと思います。

permの値は0を渡してます。type FileMode uint32 のstructが存在していて、その型で0を表現していると思われます。

4 openFileNolog(name, flag, perm) を呼び出す

func openFileNolog(name string, flag int, perm FileMode) (*File, error) {
    setSticky := false
    if !supportsCreateWithStickyBit && flag&O_CREATE != 0 && perm&ModeSticky != 0 {
        if _, err := Stat(name); IsNotExist(err) {
            setSticky = true
        }
    }

    var r int
    for {
        var e error
        r, e = syscall.Open(name, flag|syscall.O_CLOEXEC, syscallMode(perm))
        if e == nil {
            break
        }

        // On OS X, sigaction(2) doesn't guarantee that SA_RESTART will cause
        // open(2) to be restarted for regular files. This is easy to reproduce on
        // fuse file systems (see https://golang.org/issue/11180).
        if runtime.GOOS == "darwin" && e == syscall.EINTR {
            continue
        }

        return nil, &PathError{"open", name, e}
    }

    // open(2) itself won't handle the sticky bit on *BSD and Solaris
    if setSticky {
        setStickyBit(name)
    }

    // There's a race here with fork/exec, which we are
    // content to live with. See ../syscall/exec_unix.go.
    if !supportsCloseOnExec {
        syscall.CloseOnExec(r)
    }

    return newFile(uintptr(r), name, kindOpenFile), nil
}

ここの部分。

if !supportsCreateWithStickyBit && flag&O_CREATE != 0 && perm&ModeSticky != 0 {

supportとflag&O_とperm&Modeが0以外の時にtrueに行くようにされてます。

const supportsCreateWithStickyBit = false  #定数

ここで、&が出てきます。&はbit演算子なるもので、2進数を比較するものです。右辺左辺を比較し、どちらの位も1なら1をreturn その他はreturn 0です。 例) 0101 & 1100 なら =>答えは0100かな。 perm =0 O_CREATE = 0x200 この時、permが0なのでどうやってもreturn 0です。

5 syscall.Openを呼び出す。 func OpenFileNologではOpenが呼ばれています。 |もbit演算子だろうと思います。 or演算子かな。

r, e = syscall.Open(name, flag|syscall.O_CLOEXEC, syscallMode(perm))
func Open(path string, mode int, perm uint32) (fd int, err error) {
    var _p0 *byte
    _p0, err = BytePtrFromString(path)
    if err != nil {
        return
    }
    r0, _, e1 := syscall(funcPC(libc_open_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))
    fd = int(r0)
    if e1 != 0 {
        err = errnoErr(e1)
    }
    return
}

6 BytePtrFromStringを呼び出す 呼び出すとそのさきでSliceFromStringが呼ばれてます。そこをみてみるとようやく読めそうなcodeが書いてあります。 stringたちを1つ1つ分解しrune型でsliceに入れていると思います。 stringがbinaryに分解されていることがわかりました。

_p0, err = BytePtrFromString(path)
func BytePtrFromString(s string) (*byte, error) {
    a, err := ByteSliceFromString(s)
    if err != nil {
        return nil, err
    }
    return &a[0], nil
}
func ByteSliceFromString(s string) ([]byte, error) {
    for i := 0; i < len(s); i++ {
        if s[i] == 0 {
            return nil, EINVAL
        }
    }
    a := make([]byte, len(s)+1)
    copy(a, s) #copyでsの中身をaにコピー
    return a, nil
}

7 newFile funcを呼び出す openfilelog funcでは最後のreturnで newfileが呼ばれています。 現時点では、rにはbinaryのsliceが入っていそうです。 rのtypeはuintptr型。以下だそう。

`// uintptr is an integer type that is large enough to hold the bit pattern of any pointer.

type uintptr uintptr`

その情報が入ったfileのdateをfと変数にpoll.FDというstructで入れ込みます。正直この辺は本当に何をしているかわかりませんでした。 ここでreturn されるfが"python.py"を表すdataだと思います。思うだけです。自身ありません。

func newFile(fd uintptr, name string, kind newFileKind) *File {
    fdi := int(fd)
    if fdi < 0 {
        return nil
    }
    f := &File{&file{
        pfd: poll.FD{
            Sysfd:         fdi,
            IsStream:      true,
            ZeroReadIsEOF: true,
        },
        name:        name,
        stdoutOrErr: fdi == 1 || fdi == 2,
    }}

    pollable := kind == kindOpenFile || kind == kindPipe || kind == kindNonBlock

    // If the caller passed a non-blocking filedes (kindNonBlock),
    // we assume they know what they are doing so we allow it to be
    // used with kqueue.
    if kind == kindOpenFile {
        switch runtime.GOOS {
        case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd":
            var st syscall.Stat_t
            err := syscall.Fstat(fdi, &st)
            typ := st.Mode & syscall.S_IFMT
            // Don't try to use kqueue with regular files on *BSDs.
            // On FreeBSD a regular file is always
            // reported as ready for writing.
            // On Dragonfly, NetBSD and OpenBSD the fd is signaled
            // only once as ready (both read and write).
            // Issue 19093.
            // Also don't add directories to the netpoller.
            if err == nil && (typ == syscall.S_IFREG || typ == syscall.S_IFDIR) {
                pollable = false
            }

            // In addition to the behavior described above for regular files,
            // on Darwin, kqueue does not work properly with fifos:
            // closing the last writer does not cause a kqueue event
            // for any readers. See issue #24164.
            if runtime.GOOS == "darwin" && typ == syscall.S_IFIFO {
                pollable = false
            }
        }
    }

    if err := f.pfd.Init("file", pollable); err != nil {
        // An error here indicates a failure to register
        // with the netpoll system. That can happen for
        // a file descriptor that is not supported by
        // epoll/kqueue; for example, disk files on
        // GNU/Linux systems. We assume that any real error
        // will show up in later I/O.
    } else if pollable {
        // We successfully registered with netpoll, so put
        // the file into nonblocking mode.
        if err := syscall.SetNonblock(fdi, true); err == nil {
            f.nonblock = true
        }
    }

    runtime.SetFinalizer(f.file, (*file).close)
    return f
}

8 最後

6-7あたりは本当に何をしているかわかりませんでしたが、 どうやら、stringをrune型のsliceに分解し、その情報と0x200のようなpcの設定定数情報を駆使して開いているのではないかと思います。 pcを操るのはやはりbinaryなんだと調べていて感じました。

実際に、pcの中をどうやって調べているのか、まではわかりませんでしたが収穫はあったのでまぁいいとしましょう。 こういう、こと知ってる人って周りにいないから如何しようも無い。。。 いろんな知らない型が出てきて世界は広いと感じました。

あと、このレベルのcode書けるのに何年書かんねやろ。

以上、自分の覚書程度にまとめました。

backspace string compare leetcode 解説

Goでの実装。

正直難しいし、問題の意味も最初は理解できなかった。

問題:

Given two strings S and T, return if they are equal when both are typed into empty text editors. # means a backspace character.

Note that after backspacing an empty text, the text will continue empty.

Example 1:

Input: S = "ab#c", T = "ad#c"
Output: true
Explanation: Both S and T become "ac"

まず、問題文をよみとこう。 要するに#はbackspaceである。すなわち#があれば1つ前の文字は削除することとなる。

ex) abc#d なら#の前はcなので => abdになる。 ex) abcc##de# なら => abdとなる。(ccとeは削除) #は一個削除 ##は2個削除となる。

最終的にTとSが完全一致ならtrue 一致しなければfalseを返す問題。

で、このコードも自分で考えきれなかったので人のを拝借。 すごいコードを書く人もいるもんだなぁとしみじみ。

func backspaceCompare(S string, T string) bool {
    return dec(S) == dec(T)
        //ここでSとTが一致しているか確認
}


(仮にab#cなら)
func dec(T string) string { //decは文字列から#を除く処理
    for i := 0; i < len(T); i++ {
        if T[i] == '#' { 
            if i > 0 {//iが最初の要素以外なら
                T = T[:i-1] + T[i+1:]  
                                  //                                         b       #                     a       c
                                  //ab#cの時 => acにする([1]と[2]を消して、[0]と[1]のみにする。)
                i -= 2
            } else { //iが0なら
                                  //#が二つ続いている時を想定していると思う
                T = T[:i] + T[i+1:]
                i--
            }
        }
    }
    return T
}

数をこなしていこう。数が大切だ。

今回の学習点: shift unshiftの勉強になった。 sliceからの自己削除をすればいいと学んだ。

rails secret_key_baseに関するまとめ

secret_key_base関係で少しつまづいたのでまとめてみました。

Rails.application.key_generatorの中に@secretと言う形で保存されています。

主な使用するcaseは、cookieの暗号化、message_varifierメソッドの暗号化などに用いられるとのこと。

わかりやすいのは、cookieの暗号化。

では、cookieとは?

cookieはwebサイトからあなたのpcやスマホに永続的に保存される個人情報のtext file。 cookieはwebの検証などで見ることは可能であるが、日時情報以外は、基本的に暗号化されて表示される。

その保存される段階で暗号化するために使用するのが、secret_key_baseだと言うこと。

cookieがそのままwebに表示されたら、個人情報ダダ漏れなので暗号化してくれていると。 色んな、便利なことが自動的にされてんだと思うと世の中広いなぁ、まだまだ知らないことがいっぱいあるんだなぁと思ってしまいますね。

leet code 38. Count and Say の解答:問題文解説

これむずすぎへんか??

 

と思った。

 

まず、問題が初見だと意味不明でした。。。。

問題文の意図を汲み取るのに時間がかかりました。

まず、問題の意味がわからなければ問題は解けないのでホント苦労の連続ですね。

 

hatena blogなどで解答を書いている人もいるみたいですが、自分もoutputのために書いておきます!!!

イエィ!!

 

The count-and-say sequence is the sequence of integers with the first five terms as following:

1.     1
2.     11
3.     21
4.     1211
5.     111221

1 is read off as "one 1" or 11.
11 is read off as "two 1s" or 21.
21 is read off as "one 2, then one 1" or 1211.

Given an integer n where 1 ≤ n ≤ 30, generate the nth term of the count-and-say sequence. You can do so recursively, in other words from the previous member read off the digits, counting the number of digits in groups of the same digit.

Note: Each term of the sequence of integers will be represented as a string.

 

----------------------------------------------------

intの整数が与えられます。

 

2なら、1のvalue 11を参照します。

11は1が2つあります。ですが、英語では 1が2つあるではなく,2つあるよ1がと表示します。なので valueは 21 (two one)となる。

 

3なら、2のvalue 21を参照します。

21は2が1つ1が1つあります。 ですが、英語では〇個あるよ〇〇が と表示します!!

この時、1つあるよ2が + 1つあるよ1が => 1211(one two one one)  となります。

 

問題の解説は終わり!!

 

次、codeです。

自分では考えきれませんでしたので、他人のコードを拝借してときました。

激ムズやでホンマ。easyやのに。。。。。

 

func countAndSay(n int) string {
seq := "1"
for i := 1; i < n; i++ {
seq = next(seq)
}
return seq
}

func next(seq string) string { //次の要素(next)のstringを返す
i := 0
nextSeq := ""
for i < len(seq) { //length分回す
count := 1 //nextの要素用
for i < len(seq)-1 && seq[i] == seq[i+1] { //0 < 3 && nowとnextが同じなら
//0<3は3より奥のseqのlengthより多い要素を調べないようにしている
count++
i++
}
nextSeq += strconv.Itoa(count) + string(seq[i])
// strconv.Itoa(count)が個数 + string(seq[i])が値
i++
}
return nextSeq
}

 

 

 

むずかったよっていう備忘録を残しておきます。。

1年後こんなもん楽勝やで!と思っていたいので、書いておきます!!!!

未経験から就職はそんなに難しいことでは無いし、就職で大事なのは軸だよね。

未経験から就職ってそんなに難しいことじゃ無いんだよなぁ〜〜。

 

だって、最初は誰だって未経験だしそんなに気を張ることは無いんだよね。

 

とか言って、自分はまだ就職して無いんだけども。。。。

 

就職してない自分にとっては、就職は少し憧れがある。(就活中)

だけれども、大切なのは就職してからなんだよね。

自分がそこで何を得たいのかが重要で、skillを身に着けるべきでは無いかと思う。

 

仕事を覚えるのも大事だが。自分は何のために会社に入ったのかが言えないとダメかなぁと思った。

 

skillを磨いて、収入をあげたい。

実務経験を経て、別の事業に生かしたい。

とかあると思うけど、じゃあそれって何???いわゆる指標がブレブレ。

 

収入をあげたいのであれば、どんなskillをえる必要があるのか。いつまでにそれを達成すべきなのかを決めないとダラダラ行っちゃうよね。

 

実務経験をえたいだけなら、どこでもいいわけで、どの分野の実務経験をえたいのか、なぜ経験を得ようと思ったのかの目標をはっきりさせて置く必要があるんじゃ無いかと。

 

-----------------------------------------------------

 

だから、就職先を見つけるにも就職した後のことにも軸が必要になってくるわけで、その軸を考えるのが難しいんだけれども。

 

自分の軸は、

私服出社可能なところかな。いわゆるモダンなとこ。

SIは基本スーツやからSIは省けるし、最新の技術を扱っていそうだから次の転職を考えたときに有利に進められるのでは無いかとも思った。

最新の技術って意外と幅が狭いような気がする。

最新の知識を持っている人は少なくて、大抵の人は数年経って学びやすい環境になった時に学ぶ。つまりその時には最新ではなくなってるんだよね。

 

だからこそ、母数が少ない ==(イコール) 価値が高い!!!!

もちろん周りに知ってる人が少ないのもデメリットだけれども、それを補う収入があるんじゃ無いのかな。

後、知らないことを調べる力が身につくし、日本文書だけでは情報不足でダメなので英語で質問する機会も増えるし、外国との接点が増えるんじゃ無いかなぁ。

そうすると自ずと市場価値もぐんぐん上がるような気がする。

 

いつの間にか、知り合いが増えて質のいい情報を手に入れることだってできるだろうし、知り合いに仕事を紹介してもらえるかもしれない。

 

そうなると、人生は面白くなる!と思った。

 

就職の自分の軸は決めておく必要があるけれども、数年後その軸は変わっているかもしれない。

あくまで、考える軸は現在の自分の軸であり未来の軸は考えない。

 

未来はわからないし、経験をしたら価値観だって変わるかもしれないからね。

パラダイムシフト(7つの習慣から価値観や物事の捉え方が変わる事象)が自分の中で起こり、今までやってきたことが無駄に思えてしまうかもしれない。

 

価値観が変わったら、その時点での価値観で軸を決めて人生を進めて行けばいい。

 

小学生の頃、面白かったことが今では何一つ面白みを感じないことだってあるし

逆に小学生の頃面白くなかったことを今では楽しいと感じることだってあるだろうしね

 

おっさんに何か説教されても、自分には関係ないと思って聞き流していたけど、未来ではそれを居酒屋で後輩に説教垂れているかもしれないし。

 

その時その時の自分の最良の判断を下すことこそ大事じゃないかなぁ〜。

 

---------------------------------------------

 

最後に、自分の軸を書いておく。これは2020年初頭の自分の価値観である。

 

座右の銘:マジョリティよりマイノリティ

 

就職の軸:

私服ok

比較的新しい技術を扱っているところ

未経験ok

 

人生の軸:

人に好かれる人間になる なぜか魅力のある人間になる

チャレンジは積極的に行い、そのチャレンジの目標と期限をきっちりと決める

IT用語の勉強 plugin api gateway ってなんやねん

小難しい、話でうんざりするのですが

やたらと、英語を頻発して使う人はイメージはよくないのですが。。。

 

そんな、ものでしょうかね???

 

で、気になったのが

```

Plugin Api Gateway

```

とか言われてもわからんぞってこと。

 

 

plugin :

追加の拡張機能のこと

 

api :

何かと何かの情報をやり取りするシステムのこと。何かと何かをつなぐもの。

 

gateway :

通信規格が違う2者間をつなぐシステムのこと

 

 

以上が、自分なりの解釈です。間違ってたらコメントください。

 

 

つまり追加の拡張機能を実装するときに、通信規格が違うものを繋ぐシステムのこと!

 

じゃないのかなぁ〜〜。

 

webは基本httpやけど、tcp通信で別のデバイスと繋げるしかない時に、この言葉を使うのかなぁ〜〜。

 

通信規格が違う、デバイスを繋ぐという名詞かな??

 

plugin api gatewayを実装しよう!!!とか使うのかな?

この言語でplugin api gatewayはどう繋げるか!!とかで使うのかな??