イナズマの日記

こんにちは。

C++で二進数を扱うときのメモ

if(v[i] & (1ll<<j))

でv[i]を二進数に変換したときのj桁目にBitが立っているかを判定できるが、vの要素がlong longの場合、1ではなく、1llとしないと正しく計算できないので注意。 1llは1をintではなくlong longとして扱います。

atcoder.jp

この問題とか、注意が必要です。

論理演算を用いた奇数と偶数の判定

一般に奇遇の判定は

int a = 10; // aは任意の整数
if (a % 2 == 1)
  // 処理
else
  // 処理

みたいなことをするが、AND演算でできることを知ったのでメモ。

上のようなソースコード

int a = 10;
if(a & 1)
  // 処理
else
  // 処理

と書き換えられる。

上記のコードにおいて、なにが行われているか簡単に説明する。

はじめに、任意の整数をnと置き、1とnを二進の値に置き換える。
1を二進数に直すと0b0000…1。つまり最下位Bitが1で、最下位Bit以外はすべて0であることがわかる。 また、任意の奇数を二進数に直すと、最下位Bitが1でその他のBitは整数によって変化することがわかる。1

次に、この2つの値の論理積を求める。
まず、最下位Bitから考える。 aの最下位Bitは、aが奇数である場合必ず1になるので、最下位Bitの論理積は1になり、偶数の場合は0になる。 次にその他のBitを考える。 1の最下位Bit以外が全て0であることから、nがいかなる値であろうと最下位Bit以外の部分での論理積は0になる。

このことから、1とnの論理積は、nの最下位Bitによって決定することがわかる。

1をboolean型にキャストするとtrue、0をキャストするとfalseになることから、上記のコードで奇数偶数判定になることがわかる。

にしても、蟻本やチーター本を読んでると、解説以外のとこにもこういう豆知識みたいなのがちょくちょく混ざってるから楽しいね🤘


  1. 少し考えればわかることだが、最下位Bitは2^0を表し、その他の部分は2^nを表している。前者は奇数を表せるが、後者は必ず偶数になることから、奇数の場合最下位Bitは1、偶数の場合は最下位Bitは0となる。

大きすぎる配列をローカルに持たない🙅🏻‍♀️

大きい配列はグローバルに持つ。

スタック領域・ヒープ領域が関係しているらしい。(スタック領域には制限があるとかないとか)


とりあえずdpするときとか、配列はグローバルに持つのが丸そう。

.vimconf.swp 2018に行ってきました!!

こんにちは、イナズマです。

.vimconf.swp2018にいってきました。 f:id:inazuma110:20181101114705p:plain

自分はVimを使いはじめてまだ3,4ヶ月程度なのですが…

結論から言えばめちゃ楽しかったです!!!来年もあればまた行きたいなと思いました!!

いや本当に、予定とかあった人が可愛そうです;;

ここからはLTの内容のメモとともに細かく感想を。 ただスライドみながら相当急いで書いていたので敬称略かつ誤字脱字等あるかもしれないです…>< (メモは一部発表と順序を変更しています)


.vimconf.swp

LT(と言っていいのだろうか??)

VimConf タイムテーブル徹底解説(by ujihisa)

登壇者の審査は全員一致(多数決はなし)

mattn

  • ネットに顔がないのでVimConfで見るしかない

はい、mattnさんについてはこれだけです…。 実は最初の5~10分席を外していて聞けませんでした…。

VimConfでmattnさんにお会いできることを楽しみにしています。

どのように登壇者を決めたかについてもお聞きすることができました。多数決は一切なしで、全員一致するまで議論を重ねたそうです。 ただ、誰一人として同じ考えの人がいないみたいで、5時間議論しても終わらなかったようです…(お疲れ様です)


Bram

  • Vimの作者
  • Youtuber
  • 見よう!
Bram裏話

ここには載せられない


なんと、今年のVimConfにはVim作者のBramさんが来日します!! 実はVimはBramさんのみがコミット権限を持つので、VimへのPRは必ずBramさんが目を通すことになっています。

Contributors to vim/vim · GitHub

BramさんはYoutubeでも活動を行っています。

Bram Moolenaar - YouTube

VimConf参加者はこの動画をみてぜひ予習してくれ!!とのことです!

懇談会でいろいろBramさとやり取りする際の裏話等も聞けたのですが、あまり言わないよう言われてたので割愛します^^;


daisuze

  • 日本語
  • もともとプラグインを使ってたが、使わなくなった
  • Vimそのものと向き合う正統派

ujihisa

  • C実装をみつつモードと正面から向き合う
  • 話が面白い(らしい)

Okura Masahumi

  • English
  • Vimを仕事でどう使うか
  • Vim勉強会向け
  • 幅広い層

Usami Kenta

  • 日本語
  • 外部ツールとの連携
  • 仕事、プラギン開発、汎用ツール開発の架け橋

Alisue

  • Eng
  • Vimscript
  • Neovimとの互換
  • 非同期

Akin

  • 英語
  • Onivim
  • 人口広める

rhysd

  • 日本語
  • 技術枠
  • WebAssembly…言語
  • ブラウザでVim

名前に誤字等あったら申し訳ないです><

5時間以上かけて厳選されたお話、どれもとても楽しみにしています!!


Differnces between Nvim and Vim8 full version(by @Shougo)

  • swpではフルバージョン!!
  • Vim8とNeovimの違い

NvimのVimの違うとこ

  • Nvimは一人が管理してるものではない
  • 開発にお金をもらっている
    • :help donate
  • XDG defaultsに従っている
    • $XDG_CONFIG_HOME/nvim
  • compatibleモードはない(Nocompatible)
  • defaultでシンタックス、インデント等
  • 一部のVimの機能を削除
  • crypt機能削除(Vimの暗号化) :help encryton
  • :smileコマンド削除(プラグインがある)
  • viminfoがない
  • 代わりにshada(バイナリ)(Viminfoはテキスト)
  • 前回のレジスタを覚える、的な
  • Nvim固有のAPI
    • nvim_parse_expression() Vimscriptの式を評価
    • :help api
  • built in LSP
    • LSPのクライアントを入れなくても動く
  • GUIを再実装
  • TUI(端末機能)再実装
    • term.cを削除
    • Vimでは動くけどNvimではうごかないみたいなことがある
    • 逆も
  • python, ruby機能を再実装
  • ラッパーなのでVim8より遅い
  • Nvim remote plugin(いろんな言語でVimプラグインをかける)
  • でふぉでLuaが入ってる
  • Vimのif_luaとは微妙に挙動が違う
  • LSPクライアントはLuaで実装されている
  • jobとターミナル機能
  • Vimのほうが実践的な機能
  • remote機能等がないので
  • Vimのパッチをすべてを取り込んでいるわけではない
  • もっとContributeしてくれ!!
  • どんな人がNvim使うべき??
    • 独自機能が好き
    • Vimscript嫌い!!
  • Vimは?
    • 互換性
    • 開発スタイル
  • NvimはVim8より早いの?→環境次第
  • :help vim-differnceにvimとの違いが詳しく書いてある

最後に

  • VimConf2019にリベンジしたい!!

うおおお濃厚だぁ!自分の知識じゃわからない単語もあったので少しづつ調べていこうと思います。

自分はNvimから入ったのでVimをほとんど使ったことがないのですがやっぱNeovim便利だなぁと。 端末の機能やLuaが最初から入ってるあたり、初心者にも優しいなと思いました。

でもやっぱり一概にNeovimのほうが上位互換ではないみたいですね。各自違いを認識して自分にあったVimを使いましょう!!

最後に、ShougoさんはVimConf2018には登壇できなかったので2019でリベンジしたいと話していました。第四世代のプラグイン、とても楽しみにしています!!(それ以前のプラグインもありがたく使わせてもらってます!!!)

いつか自分もcontributorとして貢献できるように強くなりたいです…!

ShougoさんのスライドはVimConf後に後悔されるようなので、楽しみに待ちましょう!


僕の推しプラグインをみて! (by eiya000)

推しVimはNeovim

おすすめVimplugin

見た目
  • foldCC

    • Vimの折りたたみの表示をわかりやすく
  • vim-matchup

    • 括弧の対応付けを拡張
    • カッコ以外も
  • vim-shot-f

    • 飛べる位置を可視化
  • vim-highlightedyank

    • yank箇所をハイライト
  • vim-indent-guides

    • indent可視化
    • トグルで有効無効
  • vim-devicon

    • devicon表示
編集
  • lexima.vim

    • 対応する文字を自動挿入
  • vim-operator-surround

    • 選択してる囲み文字を追加したり削除したり編集したり
    • Java, Kotlin, C#, Scala等におすすめ
  • vim-text-obj-between

    • ↑と逆みたいな感じ
  • vim-autoformat

    • コード自動整形
ツール編
  • gina.vim

    • git系
    • :Gina status
    • :Gina commit
  • vim-manapager

  • vimconsole.vim
    • vimscript向け
自作

プラグイン大量じゃああ!!

この中でも自分も使っていて便利に感じるのはlexima.vimですね。 個人的に気になったのは、

  • vim-shot-f
  • vim-highlightyank です。ブログ書き終わったら試そうと思います!!

Elegant collabolate for vim(by hokke)

vimscriptの代わりにRubyを使いたいと思うはず!!

  • vimrcのなかにRubyを書ける
    • 簡単
    • Rubyのactive_supportが便利
    • Rubyを決めると気持ちいい(?)
  • vimpluginでRubyを書ける
  • if_ruby
    • rubyeval
      • 現状Rubyの値をVimscriptで使えない
    • もっとリッチなライブラリがほしい

Rubyがあまりわからないです…orz


vimのヘルプボットは裏で何をしているのか(by @thinca)

  • vimはHelpが膨大
  • helpを読もう
  • hubotで作られている(JS)
  • 実際にVimを起動
  • helpを実行
  • -e
    • バッチモード
    • Exコマンドを流し込む

Slackのvim-jpで:help *みたいな感じでVimのヘルプを見せてくれるBotです。 どんな実装をされているのかを見ることができました。

なんかヤバそうな正規表現がでてきてましたw(thincaさんも覚えていない-1の正体とは…?)


IOS DEV WORKFLOW WITH VIM(by jkaplan)

Nvim使い

  • vimは軽い
  • キーバインドが楽
  • プログラムブル
  • xVim2
    • 不安定
    • アップデートにすぐ対応できない
    • セキュリティ懸念

XCodeを使ったことがないのであまりわからなかった…orz


スライドのメモはこんな感じで終わりです。

で、このあと追い夕食を食べに部屋を移動しました。

懇談会

大量のピザとコーラを食いながら(うまい!!)いろんなVimmersと交流しました。 僕のいた卓はたまたまVim歴が僕と同じくらいの人たちだったので、Vimトークもかなり弾みました!!

f:id:inazuma110:20181101151304p:plain

ちなみに、
「推しVimはなんですか?」
「僕Neovimです」
「私は普通のVimです」
「自分はgvimです」
みたいなVimmer特有の挨拶が繰り広げられてましたw

また、後半は突発的な質問コーナーが始まり、VimConfの裏話等々聞くことができました。 が、ここに載せられることではないので割愛します^^;

最後に

こんな感じでした。 いろんな方のいろんな視点からお話を聞けてとても楽しかったです!!

VimConf2018でまたお会いしましょう!!

Atommer「VimじゃTeletypeできないじゃん」Vimmer「え、できるけど^^」

f:id:inazuma110:20180919091842p:plain 別にTeletypeとか使う頻度低いけど、まぁできるに越したことはないよね。 日本語での解説記事がなさそうなので(あったら教えて)使い方を書いてみました。ちなみにTeletypeってのは一つのファイルをリアルタイムで共同編集する機能のことだと思ってください。

Installation

github.com

まず、これを落としてきてください。(インストール法はここでは割愛)

Python依存なので、もしpathを通してなかったら通し(方法はここでは割愛)*1、以下を実行します。

pip3 install neovim

次にここのアカウントを作ります。ここからGitHub連携させるのが楽でしょう。

作ったらホーム直下に.floorc.jsonを作ります。作成したアカウントに.floorc.jsonの内容があると思うのでそれをコピペすればおkです。 f:id:inazuma110:20180919112318p:plain これの黄色で囲まれてる部分を一番下までまるまるコピペです。

最後にvimで:UpdateRemotePluginを実行します。 これで準備OKです!!

Usage

3つコマンドを覚えておけばだいたい大丈夫です。詳しくGitHubのREADMEあたりを読みましょう。

  • :FlooShareDirPublic /path/to/files 全人類に公開します。
  • :FlooShareDirPrivate /path/to/files ↑のプライベート版

これらのコマンドを使ったとき、ワークスペースの名前も決定します。

  • :FlooJoinWorkspace https://floobits.com/owner/workspace_name 参加します。ownerとworkspace_nameは適宜変更しましょう。

最後に

ごめんなさい、ここまで書いてなんですがこの機能を使ったとき僕の環境下ではdeopleteが4にます。設定が悪いのか環境が悪いのか、相性が悪いのかはわかりませんが、この機能を使ってもdeopleteが使える人がいましたら、よかったらコメントお願いします。

*1::echo has('python3')で1が返ってくればおkです

Atom用のスニペットをVim用に変換するやつ

こんちゃーす、イナズマです。 この記事はAtomユーザー以外には無益です。Vimに移行する気が一ミリでもあるような(もしくはAtomVimを併用している)Atomユーザーを対象に書いてます。

はじめに

ちょっと前までAtomだけ使ってたんですが、最近はVimをよく使うようになりました。f:id:inazuma110:20180909074607p:plain 競技プログラミングにおいてスニペットは必須だと思っているので、Vimに乗り換えるにあたってスニペットの移行をしようと思いました。Vimスニペットには(安定の)Shougoさんのプラグインを使います。 github.com

んで、いざ移行しようと思ったもののAtomスニペットは.cson1というよくわからない形式で書かれていました。Vimスニペットも.snipというよくわからない形式で書く必要がありました。 つまり単純なコピペでは移行できません。しかもスニペット本文(っていえばいいのか?)も微妙に書き方が違うので結構書き直す部分がありそうです。う〜ん困った。

作った

ということで、AtomスニペットVimスニペットとして扱えるようにするnpmパッケージを作ってみました。 www.npmjs.com

最初はPythonで書こうと思ったのですが、csonっていう形式がよくわからなかったのでjsonに変換してくれるパッケージがあるNodeで書きました。 www.npmjs.com 使いにくい部分ありますが、最低限は動いてくれるかなと思います。

終わりに

文字がかなり読みにくいので文字色とか変えていこうかと思います。他にももう少し機能を追加する予定です。 すでにいくつか確認していますが、バグとかあったらIssueにおねがいします。

Issues · Inazuma110/snippets-resycler · GitHub


  1. あんまり調べてないので詳しくはわからないが、jsonにコメントとかがかけるらしい。あとcoffeescriptってのに関係があるとか。