かつかれーのメモ帳

実験ノートか勉強記録

Windows環境でllvmとcclsをビルドしてcoc.nvimを導入する

タイトルの通りの備忘録。Windowsだと情報がそれほど多くなくて、1日溶かしてしまった…

llvmのビルドについては良い記事が既に存在する。
Windows環境でLLVM、Clang、lld(Ver11.0.0)をビルドする手順 - 単子葉類プログラマーのメモ

簡単にまとめておくと

という感じ。build/Release/binにパスを通して、llvmの準備は完了。

cclsもほぼ同様にビルドが行える。

  • 公式の手順の通り、最新版を
    git clone --depth=1 --recursive https://github.com/MaskRay/ccls
  • ccls/buildディレクトリを作成
  • CMakeLists.txtの頭の方に
    SET(Clang_DIR "(前略)/llvm-project/build/lib/cmake/clang")
    SET(LLVM_DIR "(前略)/llvm-project/build/lib/cmake/llvm")
    を追記
  • CMakeでccls/buildを書き先にして、他の設定は特に弄らずConfigure→Generate
  • VSソリューションが作成されるので、Release, x64 設定でビルド
    • overrideされるはずのものがされていない、というエラーに対しては"override"のコメントアウトで対応したが問題なさそうだった。

ccls/build/Releaseにccls.exeがあるはずなので、このディレクトリにパスを通す。

これでcocからcclsを利用する準備が整った。cocの設定はWindows特有の要素があまりなく、dein等で導入したあと:CocConfigコマンドから設定を書けば問題ない。設定が保存されるファイルはnvimの設定フォルダ直下のcoc-settings.json
わかりやすいまとめは NeoVimでC/C++を書くときはcoc.nvim + cclsが良さげ | endaaman.me とか。
VSのプロジェクトみたいな感じで、コンパイル対象のファイル一覧をcclsに知らせるために、compile_commands.jsonをプロジェクトにつき1つ作成する。おそらく一番簡単なのはClangの出力結果をまとめる方法。
Compilation database — Sarcasm notebook にある通り、

clang++ -MJ a.o.json -Wall -std=c++11 -o a.o -c a.cpp
clang++ -MJ b.o.json -Wall -std=c++11 -o b.o -c b.cpp
のようにファイルごとにjsonを生成して、それを単純に連結したものを[]で括ってcompile_commands.jsonにする。この辺はclang++を叩くところも含めて適当にバッチなどで処理できる。

適切なcompile_commands.jsonを有するフォルダ(例えば以下のような感じ)で補完が出来ていれば成功。ちゃんと出来ていればmain.cppがtest.h(プロトタイプ宣言)をincludeしてtest.cppに定義されている関数を呼ぶ、といった形になっていても補完やジャンプが利く。

│  main.cpp
│ test.cpp
│ test.h
│ compile_commands.json (main.cppとtest.cppを対象に上記手順で生成)
└─ccls-cache
│ (以下略)

Raspberry Pi 2 Model Bのセットアップ

エスプレッソマシンに仕込むために今更Raspberry Pi 2 Model Bを引っ張り出してきてセットアップしました。無線LAN周りの設定は以前より大変になっているみたいです。
システム情報(uname -aコマンドで表示)は、"Linux raspberrypi 5.10.60-v7+ #1449 SMP Wed Aug 25 15:00:01 BST 2021 armv7l GNU/Linux"。執筆当時の最新のはずです。

初期設定

何はともあれ

sudo apt update
sudo apt upgrade
sudo passwd pi # ヤバい来客対策でパスワードくらい変えておく
sudo passwd root # rootパスワードも設定

あとは

sudo raspi-config

のInterface Optionsから、SSHとI2C(エスプレッソマシンで使う温度センサー用)を有効化します。
ここでrebootすればひとまずヘッドレス運用はできるはずです。

無線LAN子機"T2U nano"の設定

TP-Linkから出ている安いアダプタで、たまたま余していたので使うことにしました。搭載チップはRTL8812AUなので、調べると手順が出てきます。
一番簡単なのはコンパイル済みのドライバを落としてくること。http://downloads.fars-robotics.net/wifi-driversから必要なファイルを落としてきて解凍、install.shを実行するだけです。
以下の記事に手順詳細がまとまっています(対象チップがブログではRTL8188EUSになっているので、ダウンロード元のディレクトリを変える必要がある点のみ注意)。
qiita.com
一般的には、以下のソースを自力コンパイルする方法が取られていますが、上述のサイトがメンテされている限りはダウンロードしてくるので問題なさそうです。
github.com
再度

sudo raspi-config

すればSystem Optionsから簡単にWifi設定が出来ます。少なくとも、自宅の無線LANアクセスポイント(RT-AC68U, アクセスポイントモード)に対しては自動的に802.11acで接続されました。

IPアドレスの固定

/etc/dhcpcd.confに

interface eth0
static ip_address=192.168.0.20/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1 8.8.8.8

interface wlan0
static ip_address=192.168.0.21/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1 8.8.8.8

あたりを追記しておけばOK。

Python, GPIO

デフォルトのPython3からimport RPi.GPIOすれば問題なくGPIOを制御できるようです。Pythonのバージョンは3.7.3で、古さを感じるほどではありません。

sudo apt install python3-pip

だけして、pip3は入れておきました。

無停電化

USB給電元とRaspberry Pi本体の間に噛ませられる、専用UPSみたいなものが存在します。Micro-Bの入力端子と標準Aの出力端子を備えているので、接続上は電源ラインを中継するだけになります。
Li-ionバッテリーへの充電、バッテリーからRaspberry Piへの給電を常時行っているので、電源の供給が途絶えても給電を続けられます*1
いろいろな中華製品がAmazon等で見つかります。僕が購入したのはSunFounderというところの2500円くらいの基板
電池はKEEPPOWER 3500mAh P1835J 保護回路付きがぴったりハマりました。
基板への供給電源を分圧して*2GPIOに入力すると、電源供給が途絶えたことも検出できます。

*1:数十分もつんじゃないか?というくらい。シャットダウンまでの時間稼ぎにはオーバースペックな気もしますが、安価で安定していそうなのでヨシ

*2:Raspberry PiのGPIOは3.3V系なので電源の5Vから落とさないといけない

Rancilio Silviaの改造 (PID温調+低圧プレインフュージョン機能)

概要

Rancilio Silviaというエスプレッソマシンは、その内部構造の単純さのため改造の余地が多くなっています。いろいろといじりながらエスプレッソ抽出を楽しみたい、ということで昨年購入し、まあまあ一区切りといったところまでいじったので記録を残しておきます。配管周りの改造・電子工作・Raspberry Pi関連と、内容が結構バラけるので、いくらか記事を書いてみてこのページに集約するのが良いかなと思いました。
v3という世代の機種がベースではありますが、後付け改造ばかりなので割とどれでも行けると思います。部分的にでも、どなたかの参考になれば幸いです。

改造の目的・改造内容の検討

美味しいエスプレッソを簡単に安定して抽出できるようにしたい、ということに尽きます。あとは技術的興味()
今回の改造の目的はすべて味の安定性の改善で、計器類の増設+Raspberry Piを用いた制御でこれを実現しています。
エスプレッソ抽出の仕組み(後で記事を書く) から考えると、

  1. 粉のパッキング(=抽出速度)
  2. 湯の温度
  3. パックに通す湯の量

が一定にできれば味は安定するはずなので、項目ごとに検討していきます。

1. 粉のパッキング(=抽出速度)
通常の手順だと、安定させるのが3項目の中で一番難しいです。30秒くらいでショットの抽出が終わるようにタンピング*1の力を加減して粉の密度をコントロールすると良いのですが、同じように押し固めたつもりでも抽出時間は10秒~35秒くらいの範囲でブレブレで、安定させるのは難しかったです。
私の場合、ダメだった回はパックの様子からしチャネリング*2がよく起こっていた印象でした。外周部で顕著だったため、バスケットに対してタンパーが若干小さかったのかもしれません。
しばらく押し方を試行錯誤しましたが抽出時間を安定させることが出来ず、結局プレインフュージョン機能の追加を決めました。プレインフュージョンとは、エスプレッソの抽出圧を通常の9気圧まで上げる前に低圧(2気圧くらい)でしばらく放置し、静水圧による均質なパッキングやパックの蒸らしを行うものです。ごく弱いタンピング+プレインフュージョンで粉のパッキングは随分安定した印象です。
粉のパッキングがいつも同じように行えるようになったのでショットの再現が取りやすく、グラインダーの挽き目(メッシュといいます)の調整もしやすくなりました。一旦プレインフュージョンの手順を決めてしまえば、あとはメッシュの細かさで抽出時間を追い込んでいけば良く、グッと楽になりました。

2. 湯の温度
これはデフォルトの状態でもある程度一定に保たれています*3。しかし、デフォルトの制御方法では温度の振動が大きく、数度以上のレベルで温めすぎ→冷えすぎを繰り返すようです。高精度な温度制御(誤差1度未満)のためには温度センサーをボイラーに取り付け、湯温を見ながらヒーターを直接PID制御する方法が有効で、Silvia PID modなどで検索すると多くの作例が見つかります。今回は、他の制御と合わせてこれもRaspberry Piに担わせることにしました。従来の方法と比べると設定温度の上げ下げが出来るのも良い点ですね。

3. パックに通す湯の量
抽出されるエスプレッソをショットグラスや計量カップなどで受ければ特に問題はないのですが、クレマが多く出ていると液面が分かりづらく、止めるタイミングを待ち構えるのもなんだか面倒です。せっかくなので、Raspberry PiにUSB接続した重量計をつかって抽出量をモニタし、勝手に抽出を止める機能をつけました。

完成形

(写真を貼る)

改造の詳細へのリンク

各記事はのんびり追加していきます。

*1:バスケットに入れたコーヒー粉を上から押して固めること

*2:パックの一部、特に押しの弱い外周部を貫通するような隙間が生じてしまい、お湯がそこに逃げてしまうこと

*3:サーモスタット(ある温度以上で抵抗値が急激に増大する素子)がヒーターと直列に入っており、設定温度以上ではヒーターの発熱が抑えられるようになっています

Atmelマイコンを使ってPCからLチカ (汎用HID IOライブラリを公開しました)

この記事は何?

PCとマイコンの間で、USBインターフェースを通じてデータの送受信をするためのデモコードを公開したので簡単に解説します。

背景

かつてAtmelから、ヒューマンインターフェースデバイス(HID)の実装について基礎的なところを抜き出したアプリケーションノートとサンプルコードが公開されていて*1、PCからinterrupt転送を利用してデータの送受信をする方法が解説されていました。
自作デバイスのファームウエアを書く際のテンプレとしてまあ使えたのですが、最低限の処理というにはちょっと分量が多く読みづらい部分もあったので、本当に最低限と言える部分だけ整理して公開することにしました。

対応マイコン

以下の通りです。ほぼレジスタ名を共有しているので、相互に移植する際にコードの修正はほとんど要りません。同一のシリーズ内であれば挙動は全く同じです(プログラムを書き込むFlash領域の容量に差があるだけで、コア部分は同じなので)。

  • AT90USB 2シリーズ
    • AT90USB82, AT90USB162:
  • 同6シリーズ
    • AT90USB646, AT90USB1286
  • 同7シリーズ
    • AT90USB647, AT90USB1287
  • U2シリーズ(未実装、多少修正すれば動くと思います)
    • ATmega8U2, ATmega16U2, ATmega32U2
  • U4シリーズ(実装したけど未検証)
    • ATmega16U4, ATmega32U4

AT90USBの2シリーズはピン数自体少なく、6, 7シリーズの下位互換のような感じです*2。一方、7シリーズは「6シリーズ+USB Host機能」なのでDeviceモードで使用する分には基本的に6シリーズと同じに見えます。レジスタに書き込むべき値が違う箇所が稀にあったり、ブートローダーのアドレスが違ったりする程度です。
ちなみに、U2シリーズとU4シリーズの関係は2シリーズと6シリーズの関係に近いです。

ソースコード

Teensyプロジェクトのコードを借りている部分があるので(MakefileとUSB周りのコードの一部)、MITライセンスを引き継いで公開しています。
GitHub - dskk/AT90USB_HID_sample
ベースとなるコードはhidio_162, hidio_646, hidio_usbkey*3です。改変例(オマケ)として、646とusbkeyをそれぞれゲームパッドとしたものも同梱されています。それぞれ動作は確認したので、同名ファイル間で適宜diffなど取りながら読んでみて下さい。

普段意識しなければならない処理は全部main.cにまとめたので基本的にこれだけ読んでもらえれば処理は追えると思います。ディスクリプタ類はdesc.hに定義しています。

動作の概略

main関数の頭でデバイスの初期化をして、続く無限ループでio_task関数とusb_task関数を順に呼ぶだけです。io_task関数内にはピン入出力の処理を、usb_task関数内にはinterrupt転送によるデータの送受信処理を書きます(hid_report_send関数・hid_report_recv関数に分けて実装してあります)。
複数エンドポイント(EP)にも対応できますが、今回は最低限の実装ということでEP1をsendに(USBの言葉で言うとHost基準なのでINレポートになります)、EP2をrecvに割り当てています。

その他、USBデバイスとして要求される初期化処理・割り込み処理の類*4はusb.cに全部書いてあって、勝手にいい感じにしてくれるようになっています。結構汎用的な書き方になっているので、ちょっと変わったデバイスを作るのでない限りこのファイルを改変する必要はありません。

レポートディスクリプタに定義した通り、send, recv共にデータ長は8バイトです。これは元のDemoの値を引き継いでいます。
send関数ではピン入力状態を8バイト送信しています*5
recv関数では受け取ったデータをピン出力に反映させています。いわゆるLチカ用のコードですね。8バイト受け取りますが、ピン入力状態は都度上書きされるため最後の1バイト以外は一瞬過ぎてあんまり意味がありません。

Host側コード

PC側で使うPythonコード、hidapi_sample.pyをリポジトリのルートに置きました。
hidapiライブラリに依存するのでpipなどで入れておいて下さい。

  • バイスをオープン
  • バイスのmanufacturer_stringを取得
  • 試しに0x00を8バイト送信
  • forループでピン入力状態に0~255を順に反映

するだけのコードです。write関数に渡す配列の先頭がレポートID(常に0として良いです)として扱われるため、長さが9バイトな点には注意です。
デモファイルには含めていませんが、h.read(8)のようにすればデバイスからデータを受け取ることもできます。

コードの改変方法

当コードをベースに自作デバイスを作るにあたって、書き換える必要があるのはdesc.hとMakefileとmain.cです。
desc.hにはディスクリプタがまとめてあるので、適宜書き換えます。hidioサンプルとgamepadサンプルを比べると分かりやすいと思います。
Makefileでは、ボードに応じてMCUとF_CPUを更新する必要があります。
main.cには先述の通りメインループが含まれるので、ここに所望の処理を記述します。hidioサンプルでも、入出力ポート名や初期化の方法などチップごとに適当に変更しています。
その他のファイルは全プロジェクトで共通のはずです。

ただ、AT90USB162だけはinterrupt転送に使うエンドポイントでダブルバッファ*6を有効にすることができない*7のでこれだと動かなくて、普段弄らなくていいdesc.hの末尾を弄りました。特別な理由がなければダブルバッファは有効にしておいた方が何かと楽でしょうし、162のプロジェクトのdesc.hは他チップ用には使わないことをお勧めします。

おわりに

自分用の備忘録の側面が強く、最小限の解説に留めてしまったので不明点あればいつでもコメントかリプ下さい!可能な範囲で対応します。 同志カツカレー (@Tov_KK) | Twitter

*1:おそらく今はWeb上のアーカイブにしか上がっていないが、AVR328という通し番号が振ってある文書に付属するUSBKEY_STK525-series6-hidio-2_0_2-docというデモファイル。とりあえずAVR.JPとかではまだ見つかる。他にAVR276, 329あたりも関連しているので、読む方は参考にして下さい。

*2:2シリーズでは機能の制約が大きかったり一部レジスタの省略や改編があったりして、6, 7シリーズのプログラムを移植する際は多少修正を要します。

*3:AT90USBKEY2という評価ボードのこと。搭載チップはAT90USB1287。LEDやジョイスティックが最初から乗っているので動作確認が容易。秋月でも扱いがある実装済み基板なので、今回の対象チップを触り始めるなら最も手軽?

*4:エニュメレーションとか、HIDレポート以外のデータのやり取りとか

*5:なんか動作してる感?が欲しかったので、実際には1ずつカウントアップして連番にしています

*6:詳細な説明は割愛しますが、非同期FIFOの長さが1ではなく2になるという機能。例えばデバイスからの送信の際に「さっき送ったデータをPCが引き上げるのを待って(=FIFOが空になるのを待って)からデータを流し込む」必要がなくなるので、切れ目ないデータ送信が可能になる。

*7:コンパイルは通るのですが、PCと通信させたときにエラーも出さずしめやかにハングしてしまいます。デバッグしづらいからやめてくれ…

CY7C68013Aボードで簡易USBロジアナ

Cypress社のマイコン、CY7C68013Aが乗ったボード(いわゆるEZ-USB FX2LPボード)を簡単にロジアナ化できるということなのでやってみました。
具体的な手順は先人達が良くまとめて下さっているのですが、古い情報も混在しているので補足と共にリンク集的に書き留めておきます。

環境構築

そもそもこのボードはSaleae社のLogicというロジアナのクローンを作るために利用されていたようで、同社の公式ドライバと公式アプリを組み合わせて使う方法について書かれた記事も多く見つかりますが、現在は対策されていて出来なくなっているようです。
したがって、PC側のソフトはSigrok一択と思われます。

PulseView・Sigrok-cli

Sigrokのクライアントです。PulseViewはGUIで、Sigrok-cliCLI。本記事の最後に書いたPython連携なんかが不要ならCLIは入れなくてもOKです。インストールは以下のリンクから。
Windows - sigrok

マイコンの開発環境

以下のリンクにもある通り、cy3684kit_RC8をhttp://www.cypress.com/file/135301から入手してインストールします。適当に進めていたらCドライブ直下に複数のツールが入ってしまい、サブPCにインストールすれば良かったという気持ちに…
EZ-USB開発環境設定メモ - neko Java Home Page

ボード

下のリンクに記載のある、Geeetech版のボードが良さそうです。
Lcsoft Mini Board - sigrok
CY7C68013AでAmazonを検索するといくつかヒットしますが、例えばこれとかはトップの画像が同じもののようです。
Amazon.co.jp: EZ-USB FX2LP CY7C68013A USB 開発コアボードのロジックアナライザ: 産業・研究開発用品
ジャンパ2つとスイッチ2つを備えたボードです。

ボードの説明

回路図が見つからなかったのでざっと触って調べた程度ですが、簡単にボードの解説を入れておきます。論理が逆になっているボードなども普通に流通していそうなので、以下の情報を使う際は自己責任で。

J1

LEDを使用するか否か決めるもののようですね。PA0とPA1にはLED(D1,D2)のカソードが繋がっているのですが、アノード側はJ1経由でVCCから電流が供給されているため、J1を抜くと光らなくなります。
Sigrokは、当ボードがロジアナとしての動作している間LEDを点滅させてお知らせしてくれるみたいなので、刺したままにしておくのが良さそうです。

J2

AVRで言うところのHWBボタンみたいなものですね。普段は抜いたままにしておきます。差し込んだ状態で電源を供給すると素のCY7C68013Aとして認識され(マイコンからEEPROMが見えなくなるためROMを読みに行ってブートすることがなくなる)、開発ツールから各種書き込みができます。当然、開発ツールからEEPROMの内容を書き換えるときはジャンパを抜いてEEPROMにアクセス可能にする必要があることに注意です。マイコンを起動したらすぐジャンパを抜きましょう。

青い大きなスイッチ

USBのバスパワーを基板に供給するか決めるためのもので、どうしてもセルフパワーで使いたいというのでない限り供給するようにしておけばいいと思います(USBケーブルを刺した状態で「POWER LEDが光る側」にしておけば良いです)。

表面実装のタクトスイッチ

マイコンのリセットボタンです。J2刺して再起動するときとかに使えます。

VID/PIDの書き換え

J2を抜いた状態でUSBケーブルを刺すと、素のCY7C68013Aボードとして認識されると思います。ドライバが当たっていなければ、C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.1\Drivers以下を指定して読み込みます。
あとはEZ-USBロジックアナライザー - neko Java Home Pageの通り、

  • C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.1\Windows Applications\Application Source files\c_sharp\controlcenter\bin\Release\CyControl.exe を使って、VID/PIDを1D50/608Cに書き換え。EEPROM容量は16kBあるので、Req codeは0xA9です。
  • PulseView同梱のZadigを使って、VID/PID=1D50/608CのデバイスにWinUSBドライバを割り当て

の手順を済ませれば、デバイスとプリンターメニューでは"Unknown Device #1"という名前で見えるようになるはず(ドライバは当たっている)。

完成!

この状態でPulseViewを起動すると、ファームウエアがボードに流し込まれます。USBデバイスのデタッチ・アタッチが自動的に行われたあとfx2lafwというデバイス名で認識され、無事波形が取れるようになります。

f:id:DSKK:20210514024327p:plain
波形の観測例

ちなみに、マイコンのPB0~PB7がロジアナのch0~7にそれぞれ対応します。信号名をつけられたり解析機能があったりいろいろと便利な感じで、普通の用途だとこれで十分なんじゃないでしょうか?

長時間測定とPython連携

C:\Program Files\sigrok\sigrok-cliにパスが通っている前提で、

sigrok-cli --config samplerate=4M --driver=fx2lafw --continuous

のようにすると標準出力にデータが出てきます。リダイレクトによってテキストで保存するとこんな感じ。

f:id:DSKK:20210509042950p:plain
連続測定の結果

samplerateは4Mまで安定していました。PulseViewだと24Mまで動くのにSigrok-cliだと割とすぐダメになるっぽい?
これをPythonで受けるにはsubprocessモジュールを使えばよくて、基本のコードは大体以下のような感じ。

import subprocess
cmd=[
"C:/Program Files/sigrok/sigrok-cli/sigrok-cli",
"--config",
"samplerate=4M",
"--driver=fx2lafw",
"--continuous"
]
proc = subprocess.Popen(cmd,stdout=subprocess.PIPE,text=True)
proc.stdout.readline() #useless line
proc.stdout.readline() #useless line
l=[]
try:
    while True:
        out = proc.stdout.readline()
        if out=="": #通信がダメになると空文字列が返ってくるので測定終了
            proc.kill()
            break
        l.append(out)
except KeyboardInterrupt: #手動で止める際の処理
    proc.kill()

lの各要素は

"D0:11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111\n"

みたいな感じなので、適宜成型して解釈すれば良いでしょう。
ちなみに、readline()はブロッキング実行で、USBのFIFOが空の間は待ちになります。実測してみたら16ms周期で5000~10000行くらいドバっと送られてきているみたい。timeモジュールで時間を実測しても意味ないので、samplerateが正しいと信じてlistのindexから時間を割り出してプロットなどするのが良いです。1MSpsを指定して5分くらい測ってみましたが、99.9914%くらいの精度で時間は正しかったです(=データが上がってくる周期が1 usよりもほんのわずかに短い)。
ここまで書いて気付いたのですが、これPulseViewでサンプル数を1Tとかすごく大きな数にして測定すればよくない…?

Windowsクリーンインストール+環境構築の手順

自分用。まっさらな環境で何をすればいいかよくわからなくなるので、必要なものを列挙しておく。
Twitterに細切れで投稿するより、後で見返したりアップデートしたりしやすいブログにまとめるべきだってやっと気づいた…

クリーンインストールの前に

FastCopyってツールがタイムスタンプ残しつつ高速なファイルコピーをしてくれるので別のHDDなどに今のデータを全部移す。書き込み対象がHDDであっても半日あれば1TBくらいいける。

必須系

ウイルス対策を初手でやったらドライバ先に入れたほうがいいかも

研究関連

  • Ovito
  • VESTA
  • IGOR (公式サイトからDL、メールで貰ってるアクティベーションキーを入れて使用開始)
  • Rlogin (ポータブルアプリなので同フォルダ内に鍵入れておくこと)
  • TexLive

開発関連

ドライバ

  • NVIDIAグラフィックスドライバーとGeForce Experience
  • Logicool Options
  • プリンタ(LBP6300とEP-811A)
  • ペンタブ
  • オーディオI/F
  • CUDA

ユーティリティ

  • W10Wheel
  • PowerToys (FancyZonesで縦画面を分割するため)
  • クリップボード系のアプリもそのうち入れる

Neovim

https://github.com/dskk/nvim
README通り、前提条件を満たしたあとXDG_CONFIG_HOMEでこのリポジトリをgit clone。
あとはNeovimの実行ファイル落として実行すればプラグインのダウンロード等勝手にやってくれる。

実行ファイルは公式サイトから普通に落とせる。
右クリックメニューへの追加方法は→GVim/neovimの右クリックメニュー登録方法 [Windows 10] | Vim入門

cd ~/bin
wget https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
chmod u+x nvim.appimage
echo alias vi=\"~/bin/nvim.appimage\" >> ~/.bashrc
source ~/.bashrc

でいつもの感じになる。場合によっては以下のような対応も必要になるかもしれない。
dskk.hatenablog.com

雑記
  • W10Wheelの設定ファイルは~/.W10Wheel.properties。あとタスクスケジューラから「ログインのたびに管理者として実行する」ようにしておくと良い。
  • W10Wheelのスクロール切り替えにはScrollLockキーを設定しているが、Logicool Optionsから単体のキーストロークは設定できないのでAlt+ScrollLockを設定する。

sudo出来ない環境でModuleNotFoundError: No module named '_ctypes'を解決する

要約

とあるスパコンで前回の記事(Python環境が訳わからなくならないための自分用メモ - かつかれーのメモ帳)に従ってPython環境を作った後、Neovimの環境構築をしていたところ、

python -m pip install neovim

の段階で表題のエラーが発生。
調べてみるとlibffiが無いのがいけないらしい。そのせいで「_ctypesが使えないpython」としてビルドされてしまった感じ。

pyenv uninstall 3.9.2

して、以下の手順の通りlibffiを入れてからpythonを入れ直すことで解決できた。

手順

普通にローカルにダウンロードして解凍、ビルド、インストール。もちろん$HOME配下である必要がある。

wget https://github.com/libffi/libffi/releases/download/v3.3/libffi-3.3.tar.gz
tar xvfz libffi-3.3.tar.gz
cd libffi-3.3
./configure --prefix=$HOME/local/libffi/3_3
make
make install

すると~/local内にlibffi/3_3/が出来る。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/local/libffi/3_3/lib64
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$HOME/local/libffi/3_3/lib/pkgconfig

をbashrcに追記、sourceしてから

LDFLAGS="-L $HOME/local/libffi/3_3/lib64" CPPFLAGS="-I $HOME/lo
cal/libffi/3_3/include" pyenv install 3.9.2

python 3.9.2を入れ直せば完了。pipも正常に通った。