ThinkPad X220の無線LANカードをIntel 9260NGWに換装

ThinkPad X220に標準で搭載されている無線LANカードとBluetoothドーターカードでは、IEEE 802.11a/b/g/n、Bluetooth 2.0までしかサポートされていない。 そこで、これらをIntel 9260NGWに換装し、IEEE 802.11a/b/g/n/ac + Bluetooth 5に対応させる。 購入し…

ThinkPad X220 Full HDディスプレイ化

X220/X230 FHD mod kit (rev.6)を使って、ThinkPad X220のディスプレイをFull HDディスプレイに換装する。 ディスプレイの分解までは、LenovoのThinkPad X220 ハードウェア保守マニュアルに則って分解する。 X220 FHD mod kitの実装手順については、FHD mod …

ThinkPad X220マザーボード換装

ThinkPad X220のマザーボードを換装して、Core i5-2520MからCore i7-2640Mにアップグレードする。 LenovoのThinkPad X220 ハードウェア保守マニュアルに則って分解する。 購入した商品 商品 価格 ThinkPad motherboard core i7-2640M $56.66 ドイツ Thermal …

ThinkPad X220のカスタム

ThinkPad X220のキーボードが好きだ。 ThinkPad A285を買ったが、やはりX220のキーボードを打ちたくなる。 ただX220は今となっては、解像度は低いし、802.11 acやBluetooth 4以降に対応していないし、手元にあるCore i5モデルだとUSB3.0もついてないし、そし…

LinuxでWindows PEのLive USBを作る

BIOSの更新プログラムや、CPUのファームウェアの更新プログラムはWindowsしかサポートしていないものが多い。 PC環境がLinuxしかない場合、以下のような記事に従い、isoをUSBに書き込むことでBIOSのアップデートができる。 How to update Lenovo BIOS from L…

Rustのプロジェクトの中でCを使う

この記事ではRustのビルドシステムであるCargoを使って、Cのコードをビルドし、それをRustのコードから呼び出す方法について紹介します。 ※記事作成時のRustのバージョンはrustc 1.33.0です。 この記事で取り扱うRustの知識とクレートは次の通りです。 build…

CircuitJS1をElectronアプリ化する

電子回路のシミュレーションツールを探していたところ、ブラウザ上で動的にシミュレートするサービス CircuitJS1 を見つけました。 Circuit Simulator Applet ちょうどQucsという他の電子回路シミュレータを触り始めたところだったのですが、Qucsでは回路に…

Rustでプラットフォーム依存の処理を書く

#[cfg(...)] Attribute Rustでは #[cfg(...)] アトリビュートを使うことによって、OSやCPUに応じた条件コンパイルを行うことができる。 Conditional Compilation cfgは複数条件指定可能(OR, AND, NOT) #[cfg(any(unix, windows))] #[cfg(all(unix, target_…

RustのRange指定

RustのRange .. は[start..end)の半開区間だが、 ..= を使うことで、[start..=end]の閉区間にすることができる。 for i in 0..5 { print!("{},", i); } // => 0,1,2,3,4 for i in 0..=5 { print!("{},", i); } // => 0,1,2,3,4,5 また、matchに使われる ... …

Linux kernel moduleビルドのメモ

ArchLinux(4.17.10)上でのkernel moduleビルドを試したメモ。 Linux kernelのソースコードを入手する prepare_kernel_source.sh #!/usr/bin/env sh set -eu KERNEL_VERSION=`uname -r | sed -r 's/([0-9]+\.[0-9]+\.[0-9]+).*$/\1/'` LINUX_VERSION=linux-${…

Rust: Xargoとarm-binutils無しでCortex-Mターゲットのファームウェアをビルドする

2018年4月、Rustでの組み込みプログラミング環境に2つの大きなニュースが舞い込んできた。 Xargo と arm-none-eabi-lld 無しでCortex-M向けのビルドが可能に PSA: You no longer need Xargo to do ARM Cortex-M development#rustlanghttps://t.co/C6VhbyM0t…

Rustの構造体メモリレイアウト

Rustの構造体のメモリレイアウトについてのメモ。 Rustで次のような構造体を定義したときに、構造体のメモリレイアウトはどうなるか? struct Layout { b1: u8, s1: u16, b2: u8, w1: u32, b3: u8, w2: u32, s2: u16, s3: u16, } 検証時のRustのバージョンは…

RustでのIOストリーム処理

Go言語のio.Reader, io.Writer interfaceを使ったio.Cooyのような処理をRustで行うためには、std::io::Read traitとstd::io::Write traitを使って各ストリームを扱えばいい。 標準入力から標準出力へデータをコピーするサンプルコードを次に書く。 copy関数…

Cortex-MターゲットをOpenOCD + GDBでデバッグする(gdb-dashboard or VSCode)

OpenOCDとGDBを使ったarmのCortex-Mターゲットのデバッグ方法についてまとめておく。 個人的に、CUIベースでのデバッグにはgdb-dashboard、GUIベースでのデバッグにはVSCodeを使うのが好みなため、この2つのUIを介してデバッグする方法についてそれぞれ書く…

systemd環境でのコアダンプ解析

systemd環境下においては、従来(systemd無しの環境)のコアダンプ解析とは勝手が違ってくる。 コアダンプを有効にする ulimitコマンドでcore file sizeが0になっていないことを確認する。 $ ulimit -a -t: cpu time (seconds) unlimited -f: file size (blo…

OpenOCD + ST-LinkでFirmware書き込み

OpenOCDを使ってSTM32F401 Nucleo-64にST-Link経由でFirmwareを書き込む。 OpenOCDとST-Linkドライバのインストール Arch Linuxなら以下のコマンドでインストールする。 $ pacman -S openocd stlink Firmwareを書き込む OpenOCDで指定できるinterface, targe…

Rustでクロスコンパイル

x86_64-unknown-linux-gnuのホスト環境上で、CHIP向けのバイナリをRustでクロスコンパイルすることを目的とする。 概要 rustup target add ${target_triple} でターゲットのツールチェインを追加 ターゲットのリンカをインストール Cargoのconfigファイルに…

環境構築の検証用にDockerを使う

Rustのクロスコンパイル環境構築の検証にDockerを使い始めた。 開発環境を構築する際、最初は試行錯誤しながら行なうため、さぁ環境が構築ができた、となった時に行なってきた手順のどれが最低限必要なものだったのかがわからなくなることが多い。 必要だと…

Target Triple

Rustのコンパイラのソースコードの中で使用されていた"Triple"という言葉の意味がわからなかったので調べた。 Target Triplet - OSDev Wiki Target Triplets describe a platform on which code runs and are a core concept in the GNU build system. They …

Arch Linux上にRe:VIEWをインストールする

書籍執筆支援システムRe:VIEWの環境構築のメモ。 依存パッケージのインストール Re:VIEWを使うために必要なパッケージをインストールする。 $ sudo pacman -S ruby ruby-rubyzip texlive-most texlive-langjapanese poppler-data dvipdfmxのフォントのエラー…

vim-plug: プラグインがインストール済みかどうかを判定する

Vim

追記: 以下の記事にfunction! s:plug.is_installed(name)としてプラグインの存在確認方法が載っていました。 おい、NeoBundle もいいけど vim-plug 使えよ by @b4b4r07 on @Qiita 例として、プラグインの存在確認をするための関数を定義してみます。vim-plug…

bit置換

bit

ある値のn bit目からn+m bit目までを別の値で置き換えたい、という時がある。 例えば、以下のような値a,bがあったとして uint8_t a = 0b01010101; // 0x55 uint8_t b = 0b10101010; // 0xAA aの値の2〜4bit目をbの値で置き換えた値cを求めたい。 a,bが上記の…

LPC812マイコンでUSBシリアルからGPIO制御

組み込み開発の自動テスト化検討のためにUSBGPIO8とか買ってみようかと思ったけど、マニュアル読むと単にPCからUARTコマンド送ってGPIO制御するだけっぽい— ryochack (@ryochack) September 2, 2015 これならUARTがあるマイコンとUSBシリアル変換モジュール…

ctagsでCとアセンブラ間のタグジャンプができるようにする

ctags使っていて、Cとアセンブラでお互いにタグジャンプできないのが不便だったので、やっつけでtagsファイルを書き換えるスクリプト書いた。 Gist: ryochack / ctags_ac.rb アセンブラからCの関数を呼ぶ時には、関数名の先頭に"_"がつく。 そのため、tagsフ…

Go言語のヒープに確保するデータの初期化コストについて調べてみた

2014.6.14追記 途中MakeContainer()/MakeContainerOneLine()がごちゃごちゃになっていたのを修正 golangでは、ヒープに置かれるデータの初期化方法によって内部の挙動が若干異なるみたい。 (環境はx86_64、go version 1.2.2) 違いが出たのは以下のコード。 …

Go言語での複数チャネルからのメッセージ受信

Goではgoroutineを使うことで並行処理をとても簡単に実行できるが、複数goroutineとの同期が難しい。 そこで、複数走らせたgoroutineのメッセージを用いた同期方法について考えてみた。 以下のように、複数のチャネルからのメッセージを受信する必要がある時…

Go言語でmmapシステムコールを使ったファイル読み込みの高速化検討とC言語のコンパイラの話

長いタイトル…。 こないだ書いたgorepっていう検索ツール、もうちょっと速くしたいなと思ってファイル読み込みの部分をmmap()で置き換える検討中。(ちょっぱやのagもmmap()を使っている) mmap()での高速化確認用にCとGoで簡単なコード書いて実験していたら、…

C言語とGo言語で標準出力が端末を参照しているかどうかを判定する

標準出力のディスクリプタを取得して、それが端末を参照しているかどうかを判定する。 使いどころは端末に出力する時と、ファイルにリダイレクト出力する時とで表示の仕方を変えたいとき。 例えば、以下のページの方法でターミナルの文字をカラーにできる。 …

Go言語でgorepっていう検索ツール書いた

ディレクトリ名やらファイル名やらGrep検索やらを一緒くたに正規表現で検索する"gorep"っていうツール書いた。 https://github.com/ryochack/gorep 以下のコマンドを打ち込むと、カレントディレクトリ以下から再帰的にgo..pにマッチするディレクトリ、ファイ…

Go言語の並行処理で総和を求める

パタヘネ本の7章(マルチコアとマルチプロセッサとクラスタ)に以下のような(ちょっと違うけど)図が載っていたので、Goの並行処理を使って100,000個の数の和を求めてみた。 最初の図とはちょっと違って、実際の制御はこんな感じ。 値が2つ揃ったら、加算を行う…