koturnの日記

転職したい社会人2年生の技術系日記

C++のラムダで再帰する

C++

はじめに C++において,ラムダで再帰したいと考えることはたまにある. この記事ではラムダで再帰する手法をいくつか紹介する. 例として扱う再帰関数はフィボナッチ数列の関数(もっとも単純な実装)とする. int fib(int n) noexcept { return n < 2 ? n :…

タブ番号,バッファ番号,ウィンドウ番号,ウィンドウIDの相互変換

Vim

はじめに 先日,「Vimで既に対象バッファを開いているウィンドウがあるとき,そのウィンドウに移動する」と「Vimのタブ番号,ウィンドウ番号,ウィンドウID,バッファ番号の一覧情報を表示する」の2記事で,タブ番号,バッファ番号,ウィンドウ番号,ウィン…

Vimのタブ番号,ウィンドウ番号,ウィンドウID,バッファ番号の一覧情報を表示する

Vim

はじめに 先日の記事Vimで既に対象バッファを開いているウィンドウがあるとき,そのウィンドウに移動するでは,「タブ開きすぎると,どのタブでどのバッファ開いているかわからなくなるから,同じバッファを複数のウィンドウで開いてしまう」というIQ1的な事…

Vimで既に対象バッファを開いているウィンドウがあるとき,そのウィンドウに移動する

Vim

はじめに 僕はVimのタブ機能をそこそこ活用する方である. だが,「このバッファは既に開いている」ということを忘れることが多々あり,複数のタブで同じバッファを開くことがある. Vim8.0になり, win_gotoid() というVim scriptの関数が追加された. これ…

VimのCtrl-X補完を使えるようになりたい

Vim

はじめに Vimにはデフォルトで補完機能が備わっている. 実践Vim 思考のスピードで編集しよう!であったり,daisuzuさんの2015年のVim Advent Calendarの記事VimのCTRL-X補完について - daisuzu's notesを読むと,neocompleteやdeopleteに頼るだけではなく,…

IQ1を支えるコーディング術

この記事はIQが1Advent Calendarの10日目の記事になります. 昨日はMew_1406さんのIQ1と謝罪行脚と題された,怖いお話でしたね. はじめに ご存知の通り,僕はIQ1です. IQ1には様々な困難が存在します. 例えば,物が覚えられない.... 僕はプログラムを書…

小さいHello Worldバイナリを作る

はじめに 先日は,少し不思議なHello Worldを紹介した. そこで思ったのが,この程度の小さいプログラムならば,gccは必要ないのではないかと思い至った. そこで,小さいHello Worldの実行ファイルを作ることにした. 方針 終了の仕方 先日の記事では,crt*…

不思議なHello World

背景 最近になって,x64をちゃんと勉強したので,少しだけひねったHello WorldをC言語で書いてみることにした. (※x64のLinux環境でしか動作しない) const char main[] = "\x48\xc7\xc0\x01\x00\x00\x00\xba\x0d\x00\x00\x00\xbf\x01\x00\x00\x00\xe8\x0c\…

Javaで簡潔にディープコピーを行う

はじめに 発端は以下の一連のツイート. @ryunix にゃるほどっ...clone的なの実装しますかね...— ちゃっく@貴方の承認欲求満たします (@chakku_000) 2017年1月22日 Javaのオブジェクトのコピーといえば clone() メソッドを用いるものである. しかし,標準ラ…

Vimのあまり使われない機能について~暗号化と印刷~

Vim

はじめに この記事はVim Advent Calendar 2016の15日目の記事です. 今回はVimであまり知られていない,使われていない機能であると思われる暗号化機能について書きたいと思います. 暗号化機能 Vimはテキストエディタですが,単なるテキストエディットだけ…

denite.nvimのsourceを作ってみる

はじめに unite.vim に替わる新しいプラグインとして,denite.nvimが開発されている. まだまだ開発途上ではあるものの,じわじわとunite.vimから移行する人が見受けられる. denite.nvimはneovimだけでなく,Vim 8.0以降であれば利用可能であるのも魅力の1…

Osaka.vim #8 に行ってきた

はじめに 昨日,10/29(土)にOsaka.vim #8に行ってきました. 前回は大学の後輩を誘って参加しましたが,今回は都合が悪かったので参加できず...残念. やったこと denite.nvimの勉強 最初はShougo/denite.nvimについて勉強するかーと思って,denite.nvimの…

Windowsでneovimを使う(改訂版1)

はじめに 前回の記事(約1年前1)でWindowsでneovimを使う方法について書いた. しかし,約1年も経過すれば,色々と変化はあり,前回の記事内容そのままというわけにはいかない. 「Windows neovim」でググると,僕の記事が一番上に出てくるというのもあり,…

OpenCLのオフラインコンパイル

はじめに OpenCLといえば,カーネルのコードに以下の2つのコンパイル方式がある. オンラインコンパイル オフラインコンパイル オンラインコンパイルは,実行時にOpenCLのカーネルコードを文字列として関数に渡し,プログラムオブジェクトを構築する手法であ…

Osaka.vim #7に行ってきた

Vim

はじめに 参加感想記事なので,今回は「ですます調」で書きます. 2ヶ月遅れの参加記事執筆となりますが,7月2日にOsaka.vimに行ってきました. 7回目のOsaka.vimだったわけですが,6回目の参加でした. ちなみに,Osaka.vimの参加記事を書くのは今回が初め…

Dein.vim で NeoBundleList と同様のことをする

Vim

はじめに 発端はこの会話. @koturn deinでNeoBundleListに相当する関数ってわかりますか?— ちゃっく (@chakku_000) 2016年8月21日 この質問を受け,dein.vimにおいて, :NeoBundleList に相当する関数を探したが,直接的に該当するものはなかった. しかし…

MSYS2でOpenCLを使う

はじめに MSYS2でOpenCLのプログラムをコンパイル&実行したかった. pacmanでOpenCL関連のヘッダを導入することはできるが,OpenCLのインポートライブラリは導入することはできない. ここでは,MSYS2でOpenCLの環境を導入する一連の手順を紹介する. OpenCL…

std::vectorなどでアラインされた領域を用いる

はじめに 前回の記事でCPU SIMD命令(SSE/AVX/NEON)を紹介した. ただ,前回の記事では静的配列や単純な動的確保のパターンでしかアラインされた領域を用いる手法しか紹介しなかった. 今回は,C++でよく用いられるであろう std::vector でアラインされた領…

AVXとAVX-512のインタリーブ

C++

はじめに 前回の記事では,Intel系のCPUとARM系のCPUのSIMD命令紹介した. 記事中のサンプルコードで,画像の2倍の拡大を行うコードがあり,その中でインタリーブを行っていた. SSEであれば,単純にunpack命令を実行するだけでよかった. 簡単なサンプルコ…

SIMDの組み込み関数のことはじめ

はじめに 現代のCPUではSIMD(Single Instruction Multiple Data)命令を利用することができる. SIMD命令とはその名の通り,ひとつの命令で複数のデータを処理するものである. Intel系のCPUでは,MMX/SSE/AVX/AVX-512といったSIMD命令が利用可能であり,ARM …

GNU MakeでC/C++の依存関係を自動定義する

背景 C/C++用のMakefileを書いていると,依存関係を記述するのがなかなか厄介に感じられる. 何とか自動的に依存関係を定義したいと考えた. gcc/g++による依存関係の抽出 gcc/g++は以下のようにして依存関係を抽出することが可能である. $ g++ -MM foo.cpp…

NTSC加重平均法の整数演算による高速化

はじめに NTSC加重平均法という有名なグレースケール変換がある. このグレースケール変換は,ある画素の輝度値 $Y$ を,次の式(\ref{eq:ntscAverage})のように求めるものだ. ($r, g, b$ は赤,緑,青それぞれの値) \begin{equation} Y = 0.298912 r + …

各種言語における標準入力からのEOFまでの入力サンプル

はじめに 昨今,CodeIQやpaizaといったサービスが登場し,自動採点型のプログラミングの問題に取り組む人が増えている(と思う). 自動採点型のプログラミングの問題では,基本的に標準入力から読み込みを行い,をれに応じて適切な出力をするというものだ.…

CodeIQのスクエア・カルテット問題を解いた

はじめに CodeIQで@riverplus氏による「 スクエア・カルテット」問題 という,初等整数論を絡めた面白いプログラミングの問題があったので,それについての記事を書いた. 高校生の数学を思い出す良い問題であり,楽しかった. 問題 2つの自然数の組 $(a, b)…

候補絞り込み型インターフェースを提供するプラグインについて

Vim

この記事は Vim Advent calendar 2015 の16日目の記事です. 僕は普段「だ・である」調でブログを書いていますが,今回の記事は多数の人に見ていただくことを考慮して,多くの人がブログで採用している「です・ます」調,語り口調で書いていくことにしましょ…

Cygwinでclipboard機能を有効にしたVimをビルドする

はじめに 昔のCygwinのVimではクリップボードが利用できず,Cygwinで用意されているクリップボードデバイス /dev/clipboard に対し,読み書きを行うことや, getclip , putclip コマンドを利用することで,クリップボードとのやりとりを行っていた. kanaさ…

Vimからfzfを利用する

Vim

はじめに fzfとは,percolやpecoと同様,絞り込みの検索を行うことのできるコマンドラインツールである. 日本では,percolやpecoが有名で,fzfはあまり有名ではないが,海外では有名であるらしい. fzfはVimから利用できるように,公式のリポジトリにAPIを…

ctrlp.vimのエクステンションの作り方

Vim

はじめに この記事はctrlpvim/ctrlp.vimのエクステンションの作り方についての記事であり,ctrlpの公式リポジトリのextensionsブランチに書かれているエクステンションの作り方,および以下の3つの記事の内容に個人的な知見を追加したものである. Vimプラグ…

Windowsでneovimを使う

注意(2016/10/18 追記) この記事の情報は古くなっているので、新しい記事を参照してください. 前書き 僕自身,neovim自体にはあまり注目していなかった人間であるが,neovimが頑張ってるっぽく,かなり話題を耳にするようになったので,敢えてWindowsでne…

WhitespaceをC言語ソースに変換する

はじめに WhitespaceとはBrainfuckやLazyKと同じ難解プログラミング言語と言われる言語のひとつである. 難解プログラミング言語はジョーク言語と言われるが,実装の容易さやシンプルな言語仕様を考えると,とても興味深い言語である. Brainfuckはチューリ…