yn2011's blog

技術メモ

C言語のビルドプロセスから理解する"./configure", "make" ,"make install"

Kakasiのインストールをしていて、 そういえば./configure, make ,make installって何しているのかちゃんと分かってないなあと思ったので調べたことをまとめた。
C言語本格入門 ~基礎知識からコンピュータの本質までを参考にさせて頂きました。

前提知識

  • ./configure, make ,make installを理解するには、C言語ソースコードが実行ファイルになるまでの流れを知っておく必要があると思う

C言語ソースコードはそのままでは実行できない

  • 下の図はC言語ソースコードが実行ファイルになるまでの流れを示している
  • 実行するには実行ファイルを作成する必要がある

f:id:pokuwagata:20181109000229p:plain [種田元樹 (2018) . C言語本格入門 ~基礎知識からコンピュータの本質まで 技術評論社 図1-7より引用]

ビルドとは何か

C言語の移植性

Cランタイムとlibc

  • C言語ソースコードを実行する環境の差異を吸収する
  • CランタイムはC言語で書かれたプログラムを実行するための情報を持つファイル
  • libcはC言語で書かれたプログラムを実行するためのライブラリ
  • 実行ファイル=機械語のファイル+Cランタイム+libc

Q&A

Q. ./configure すると何が起こるのか?

  • 実行環境の情報を元にMakefileを作成する
    • Makefileはmakeコマンドによるソースコードのビルドを自動化するための設定ファイル
    • ビルドは色々設定が必要なので設定ファイルがあると毎回書かずに済む
      • リンクするオブジェクトファイル名 (複数)
      • コンパイルオプション
      • リンカオプション
      • etc

Q. なぜ ./configure する必要があるのか?

  • C言語の移植性はCランタイムやlibcによって担保されているから

Q. make すると何が起こるのか?

Q. なぜmakeする必要があるのか?

  • ソースコードの実行ファイルを生成しないとプログラムを実行できないから

Q. make install すると何が起こるのか?

  • makeで生成された実行ファイルをインストールする (指定のディレクトリにコピー)

Q. なぜmake installする必要があるのか?

  • 対象の実行ファイルを呼び出しやすくするため

参考

VSCodeでawkの開発環境を整える (awk-language-client)

awkとしっかり向き合いたい時に役に立つかも。

環境

awk-language-client

marketplace.visualstudio.com

  • Language Serverのawk拡張
  • 拡張子.awkのファイルに対してシンタックスハイライト、補完、構文ミス、関数定義の参照等が可能
  • 意外と最近 (今年の8月ぐらい) に公開されたみたい
  • (他にも色々拡張はあるみたいだけど) この拡張のインストールだけで十分かなという印象

結果

f:id:pokuwagata:20181107092743p:plain

  • 自分が使っているカラーテーマとの相性は微妙だがシンタックスハイライトなしよりは全然良い
  • 補完や構文ミス検出も問題なく動作していたと思う
    • 文末のセミコロンの判定はsettings.jsonawk.stylisticWarnings.missingSemicolon: falseで無効にできる
      • 知らなかったが、awkファイルのアクション内では改行文字を文の区切りにできるのでこの判定を無効にしたい人もいるのかも?
    • 変数をホバーするとグローバルスコープか関数スコープか分かる
      • awkは関数の引数に指定した変数のみが関数スコープで、それ以外はグローバルスコープ
  • awkスクリプト書いていきましょう

peeコマンドについて混乱したので調べた(シェルスクリプト)

環境

混乱

$ matsuya | pee cat "grep -o ." rev
んどうーレカニミ
ミニカレーうどん
ミ
ニ
カ
レ
ー
う
ど
ん
  • シェルスクリプトってpee cat "grep -o ." revみたいにコマンドを並べられるんだっけ?
  • そもそもpeeを初めて見た。peeとは?

pee

  • teeの出力先がパイプになったコマンド。パイプだからt→pなのかも。
SYNOPSIS
       pee [--[no-]ignore-sigpipe] [--[no-]ignore-write-errors] [["command"...]]
  • teeはこんな感じで引数に複数のファイルを指定できる。
$ echo foo | tee bar.txt baz.txt
$ cat bar.txt
foo
$ cat baz.txt
foo
  • つまりpeeも引数として複数のコマンドを指定できる...?
$ echo foo | pee cat cat cat
foo
foo
foo
  • おお、やはり。
  • ということで最初のワンライナーを見返してみる。これはpeeの引数のコマンドに共通の標準入力を与えているものなのか。
$ matsuya | pee cat "grep -o ." rev

オプション付きコマンドの場合

  • "grep -o ."のダブルクォートはもしかするとコマンドにオプションを付けるときに必要なのかも...?
  • 試しに下記を実行してみる
$ echo foo | pee cat cat "cat -n"
foo
foo
     1  foo
  • 最後のcatだけ行番号付きで出力された。
  • やっぱりコマンドにオプションを指定するときはダブルクォートで囲ってあげる必要があるということみたい。
  • 考えてみれば、シェルスクリプトでは半角スペースが引数の区切りとして解釈されてしまうし仕方ない。

出力順

  • peeの引数に指定されたコマンドは先頭から順に終了するとは限らない。
  • 実際、最初に示した例ではrevcat"grep -o ."の順に標準出力に書き込まれている。
  • 何度か試すと時々順序が入れ替わる様子が観察できたので固定の出力が得られることは期待できないみたい。
  • peeを親とした子プロセスがforkされて個々のコマンドが並行(コンカレント)に実行されているから...だと思う (違っていたらすまん)

xcode-select --installに失敗した

xcode-select --installに失敗したのでXcode Command Line ToolsをApple公式サイトからダウンロードして解決したというお話。

環境

事象

gsedをsedとして呼び出せるようにしようと思いオプション付きでインストール実行。

$ brew install gnu-sed --with-default-names
Error: The following formula
  gnu-sed
cannot be installed as binary package and must be built from source.
Install the Command Line Tools:
  xcode-select --install

なぜか失敗した。このオプションはソースコードのビルドが必要なことがエラーと何か関係していそうではある。
とりあえず指示されたコマンドを実行してみる。

$ xcode-select --install
xcode-select: note: install requested for command line developer tools

すると以下の内容のポップアップウィンドウが表示されてダウンロードに失敗した。

xcode このソフトウェアは、現在ソフトウェア・アップデート・サーバから入手できないため、インストールできません。

解決策

  • Xcode Command Line ToolsはApple公式サイトからも取得することが出来る。
  • More Downloads for Apple DevelopersCommand Line Toolsと検索
  • 自分の環境のOSとXcodeのバージョンの組み合わせに一致するものを選択してダウンロード後にインストール。

インストール成功後に再度コマンドを実行する。

$ brew install gnu-sed --with-default-names
==> Downloading https://ftp.gnu.org/gnu/sed/sed-4.5.tar.xz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/gnu-sed/4.5
==> make install
🍺  /usr/local/Cellar/gnu-sed/4.5: 10 files, 528.5KB, built in 2 minutes 18 seconds

今度は成功。めでたい。

原因不明

  • $ xcode-select --installが失敗する理由はよく分からない...

参考

VSCodeでシェルスクリプト(bash)の開発環境を整える

シェル芸勉強会の過去問演習を再開したいなぁと思ったので、まずは環境を整えてみる。

環境

インストールした拡張

  "configurations": [
    {
      "type": "bashdb",
      "request": "launch",
      "name": "Bash-Debug (select script from list of sh files)",
      "cwd": "${workspaceFolder}",
      "program": "${command:SelectScriptName}",
      "args": []
    },
  • Bash IDE
    • language server
    • コマンドの補完、定義の確認(man)、VSCodeのアウトライン表示など
    • 下記のインストールが必要
$ npm i -g bash-language-server

結果

  • コマンドをホバーするとmanがポップアップ f:id:pokuwagata:20181103213837p:plain

  • 括弧の閉じ忘れ等の構文エラーが指摘される f:id:pokuwagata:20181103213830p:plain

シェルスクリプトやっていきましょう

IE11で文字列からDOM Nodeを生成・取得したい

業務で苦戦したことがあったのでまとめ

環境

  • IE(11.345)

やりたいこと

  • 文字列からDOM Nodeを生成してJavaScriptで取得したい
  • どんな要素でも文字列から生成できて欲しい
  • <template>要素にブラウザが対応している場合は下記の方法で生成と取得が可能
    • ただしIE11は<template>要素に対応していない
function htmlToElements(html) {
    var template = document.createElement('template');
    template.innerHTML = html;
    return template.content.childNodes;
}

var rows = htmlToElements('<tr><td>foo</td></tr><tr><td>bar</td></tr>');

Creating a new DOM element from an HTML string using built-in DOM methods or Prototypeより引用

div.innerHTMLではダメなのか

  • 上記のStackOverflowにも書かれているが<td>要素は親に<tr>要素しか持てない(<div>はダメ)などの制限が要素によって存在する

    • 親要素の制限については、例えば<td>なら4.9.9 The td elementのContexts in which this element can be usedに記載がある
  • <tr>要素を用意してtr.innerHTMLする手もあるにはあるが...

IE11ではどうするか

  • <template>要素にブラウザが対応していない場合

ライブラリを使う

  • 素直な方法

jQuery(3.3.1)

var node = $( "<td>hoge</td>" );

Dojo(1.10)

  • 今もDojoを使っている人がいるかは分からないけど...
var node = domConstruct.toDom("<td>hoge</td>");

その他

insertAdjacentHTML()

var parent = document.getElementById('hoge');
parent.insertAdjacentHTML('afterbegin', '<td>hoge</td>');

結論

  • ライブラリはマルチブラウザ対応を考える場合はやはり強い...

macOS Mojave(10.14)にアップグレード後にVSCodeのフォントが変になる事象を解決する方法

macOSをMojave(10.14)にアップグレードしてVSCodeを起動したら文字が変になっていて困った。

環境

事象

  • macOSをHighSierraからMojave(10.14)にアップグレードしたところVSCodeのフォント(Ricty Diminished)が変化し見にくくなった

解決方法

  • ターミナルを起動し下記を実行すると直る
    • 原因についての詳細は参考のIssueを参照(私はあまりよく分かってない)
$ defaults write -g CGFontRenderingFontSmoothingDisabled -bool NO
  • 元に戻したい場合はNO→YESにして実行
$ defaults write -g CGFontRenderingFontSmoothingDisabled -bool YES

結果

  • before

f:id:pokuwagata:20181101234316p:plain

  • after

f:id:pokuwagata:20181101234321p:plain

とりあえず直ってよかった

参考