また Steam が動かなくなった件
カテゴリに Arch_Linux って書いてあるけど、私が使っているのは Antergos なんだ。
とにかく、steam を実行するとこんなメッセージが出る:
% steam
/home/rihine/.local/share/Steam/steam.sh: 行 154: VERSION_ID: 未割り当ての変数です
/home/rihine/.local/share/Steam/steam.sh: 行 154: VERSION_ID: 未割り当ての変数です
Running Steam on antergos 64-bit
/home/rihine/.local/share/Steam/steam.sh: 行 154: VERSION_ID: 未割り当ての変数です
STEAM_RUNTIME is enabled automatically
Installing breakpad exception handler for appid(steam)/version(1471977975)
libGL error: unable to load driver: i965_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: i965
libGL error: unable to load driver: i965_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: i965
libGL error: unable to load driver: swrast_dri.so
libGL error: failed to load driver: swrast
また Steam が動かないインシデントだ!と思って、remove-bad-steam-libs
を実行してみた。
こっちにも書いてあるように、エイリアスとして remove-bad-steam-libs
を定義してる。
### Steam を動かすために必要 # # -------------------------------------------------------------------- alias remove-bad-steam-libs='find ~/.steam/root/ \( -name "libgcc_s.so*" -o -name "libstdc++.so*" -o -name "libxcb.so*" \) -print -delete' alias remove-bad-steam-libs-local='find ~/.local/share/Steam/ \( -name "libgcc_s.so*" -o -name "libstdc++.so*" -o -name "libxcb.so*" \) -print -delete'
原因は忘れたけど、Steam の中の(・∀・)イクナイ!! .so ファイルを削除すると、Steam が高い確率で動くようになる。
……んだけど、やってもダメだった。
これはまいった。
最初に Steam が動かなくなったときも、上と同じ libGL error が出ていたように思う。
上記のエラーメッセージで言っている i965_dri.so
を find してみると:
% find /usr -name 'i965_dri.so'
/usr/lib32/xorg/modules/dri/i965_dri.so
/usr/lib/xorg/modules/dri/i965_dri.so
64 bit 版も 32bit 版も存在する。
ちなみに、swrast_dri.so
もこの中にある:
% ls /usr/lib32/xorg/modules/dri/
i915_dri.so nouveau_dri.so r300_dri.so radeonsi_dri.so
i965_dri.so nouveau_vieux_dri.so r600_dri.so swrast_dri.so
kms_swrast_dri.so r200_dri.so radeon_dri.so virtio_gpu_dri.so
過去の私はこれをどーにかして動かしていたらしい。
いったい、どーやったんだ?!
と思ったら、STEAM_RUNTIME=0 steam
したときのログに cef_extensions.pak
をロードできなかった的なことが書いてあるのに気がついた。
/home/rihine/.local/share/Steam/steam.sh: 行 154: VERSION_ID: 未割り当ての変数です
/home/rihine/.local/share/Steam/steam.sh: 行 154: VERSION_ID: 未割り当ての変数です
Running Steam on antergos 64-bit
STEAM_RUNTIME is disabled by the user
Installing breakpad exception handler for appid(steam)/version(1471977975)
Installing breakpad exception handler for appid(steam)/version(1471977975)
Gtk-Message: Failed to load module "canberra-gtk-module"
Installing breakpad exception handler for appid(steam)/version(1471977975)
[0913/173630:ERROR:main_delegate.cc(779)] Could not load cef_extensions.pak
[0913/173630:ERROR:browser_main_loop.cc(217)] Running without the SUID sandbox! See https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_sandbox_development.md for more information on developing with the sandbox on.
Installing breakpad exception handler for appid(steamwebhelper)/version(20160823182455)
Installing breakpad exception handler for appid(steamwebhelper)/version(1471976695)
[0913/173630:ERROR:main_delegate.cc(779)] Could not load cef_extensions.pak
Installing breakpad exception handler for appid(steamwebhelper)/version(20160823182455)
Installing breakpad exception handler for appid(steamwebhelper)/version(1471977975)
Installing breakpad exception handler for appid(steamwebhelper)/version(1471977975)
../common/steam/client_api.cpp (331) : Assertion Failed: ClientAPI_InitGlobalInstance: InternalAPI_Init_Internal failed, most likely because you are missing a 32-bit dependency of steamclient.so (the Steam client is a 32-bit app).
Assert( Assertion Failed: ClientAPI_InitGlobalInstance: InternalAPI_Init_Internal failed, most likely because you are missing a 32-bit dependency of steamclient.so (the Steam client is a 32-bit app).
):../common/steam/client_api.cpp:331
Installing breakpad exception handler for appid(steam)/version(1471977975)
crash_20160913173630_5.dmp[7571]: Uploading dump (out-of-process)
/tmp/dumps/crash_20160913173630_5.dmp
SteamStartup.cpp (838) : Assertion Failed: ! "There was a problem with your Steam installation.\n" "Please reinstall steam.\n"
crash_20160913173630_5.dmp[7571]: Finished uploading minidump (out-of-process): success = yes
crash_20160913173630_5.dmp[7571]: response: CrashID=bp-bbaf019d-9bcc-4a93-80fb-d7f282160913
crash_20160913173630_5.dmp[7571]: file ''/tmp/dumps/crash_20160913173630_5.dmp'', upload yes: ''CrashID=bp-bbaf019d-9bcc-4a93-80fb-d7f282160913''
[0913/173631:ERROR:main_delegate.cc(779)] Could not load cef_extensions.pak
[0913/173631:ERROR:browser_main_loop.cc(217)] Running without the SUID sandbox! See https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_sandbox_development.md for more information on developing with the sandbox on.
Installing breakpad exception handler for appid(steamwebhelper)/version(20160823182455)
Installing breakpad exception handler for appid(steamwebhelper)/version(1471976695)
[0913/173631:ERROR:main_delegate.cc(779)] Could not load cef_extensions.pak
Installing breakpad exception handler for appid(steamwebhelper)/version(20160823182455)
Installing breakpad exception handler for appid(steamwebhelper)/version(1471977975)
Installing breakpad exception handler for appid(steamwebhelper)/version(1471977975)
[2016-09-13 17:36:30] Startup - updater built Aug 23 2016 18:24:59
[2016-09-13 17:36:30] Verifying installation...
[2016-09-13 17:36:30] Verification complete
[2016-09-13 17:36:31] Shutdown
あと、「なんかインストール時に問題起こったから、Steam を再インストールお願いプリーズ(意訳)」って書いてあるように見える。
% find ~/.steam/root/ -name 'cef_extensions.pak'
確かに cef_extensions.pak
が無いかもしれない…………。
~.local/share/Steam を削除して steam
を実行してみたが、やっぱり cef_extensions.pak
が無かったのでダメだった。
( ◠‿◠ ) cef_extensions.pak をロードできませんでした♡
\(^o^)/オワタ
なぜこの書き方がいいの?
LiveScript では、普通の文字列の別の書き方として \hoge
というのができる。
SliderService.add-column account.serv, account.name, type, params, (ok, msg) !-> if ok console.log 'create column done.' respond { result: \ok, content: { column: msg } } else console.log "create column failed, error: #{msg}" respond { result: \error, reason: 'failed to create the column' }
他の人はどう使っているのかわからないけれど、Ruby や Lisp にあるキーワード的な使い方をしている。
LiveScript では add-column
みたいなのは、JavaScript に変換する時に addColumn
みたく camelCase になるので
ハイフン大好きマン*1な私としてはとてもうれしい。
ちなみに \slot-name
は JavaScript に変換されると 'slotName'
になる。
このため、どうしてもアンダーバーで区切りたい文字列には普通に \delete_account
と書くことになるが、これはこれで良いと思う。
*1:で、JavaScript では camelCase したい
めっちゃシンプルな更新監視型ビルドツールが欲しい
Hotot3 の core/scripts
は CoffeeScript で書かれているので、LiveScript
で書き直したりするようなことをしていた。
じゃっばすくりぷよにコンパイルする時に lsc
に --watch
付けてやってたんだけど、コンパイルに失敗するとわけ不明なエラーを吐いて落ちる。
これが一番ムッカーって来たような感じ。
それで他のツールを探してみたんだけど、 Ruby の Guard とか Watchr とかなんかエラー起こるし、よくわからないので、 全然更新を監視しないんだけど、LiveScript ファイルを取ってきて全部コンパイルする Ruby すくりぷよ書いた。
# -*- mode: ruby; -*- def watch(pattern) found_files = Dir.glob pattern yield found_files end def echo_and_system(command) puts command system command end watch 'core/scripts/*.ls' do |matching| matching.each do |filename| echo_and_system "lsc --no-header --bare -c #{filename}" end end
単に watch
メソッドを呼びだすと更新されたほげファイルを見つけてブロックを実行してくれるやつが欲しい。
Socket.IO やってみた
const Http = require( 'http' ); const Express = require( 'express' ); const Socket_IO = require( 'socket.io' ); const app = Express(); const server = Http.createServer( app ); const io = Socket_IO( server ); const port = 3000; app.get( '/', (request, response) => { response.sendFile( __dirname + '/client/index.html' ); } ); server.listen( port, () => { console.log( 'server listening at port %d', port ); } ); io.on( 'connection', socket => { console.log( 'a user connected' ); socket.on( 'chat message', message => { console.log( `message: ${message}` ); } ) socket.on( 'disconnect', () => { console.log( 'user disconnected' ); } ); } );
の a user connected
が表示されない………。
\(^o^)/オワタ
const server = require( 'http' ).createServer();
と:
const Http = require( 'http' ) const server = Http.createServer();
は一緒のはずだよね???
ファイルの順番の話
こーいう F# のソースファイルがありますよね。
Batteries.Env モジュールと:
// env.fs module Batteries open System module Env = let at (index : int) = let argv = Environment.GetCommandLineArgs() argv.[index] let get = at
それを参照する main.fs
。
open Batteries printfn "%A" <| Env.get 0
入力するファイルの順番に違いがあったってご存知でした?
これだとビルドできるのに:
% fsharpc ./env.fs ./main.fs -o ./battery-env.exe
こっちだとビルドできない:
% fsharpc ./main.fs ./env.fs -o ./battery-env.exe
╰( ´◔ ω ◔ `)╯ 普通は Visual Studio に任せるから気が付かないよな
Argu すごい
gmake のオプションを前半だけ書いてみた。
type Arguments = | [<AltCommandLine("-B")>] Always_Make | [<AltCommandLine("-C")>] Directory of dir : string | Debug of mode : DebugMode option | [<AltCommandLine("-e")>] Environment_Overrides | Eval of expr : string | [<AltCommandLine("-f")>] File of file : string | [<AltCommandLine("-i")>] Ignore_Errors | [<AltCommandLine("-I")>] Include_Dir of dir : string | [<AltCommandLine("-h")>] Jobs of n : int option | [<AltCommandLine("-k")>] Keep_Going with interface IArgParserTemplate with member this.Usage = match this with | Always_Make -> "Unconditionally make all targets." | Directory _ -> "Change to <dir> before doing anything." | Debug _ -> "Print various types of debugging information." | Environment_Overrides -> "Environment variables override makefiles." | Eval _ -> "Evaluate <expr> as a makefile statement." | File _ -> "Read <file> as a makefile." | Ignore_Errors -> "Ignore errors from recipes." | Include_Dir _ -> "Search <dir> for included makefiles." | Jobs _ -> "Allow <n> jobs at once; infinite jobs with no arg." | Keep_Going -> "Keep going when some targets can't be made."
DebugMode
に何を入れるのかわからなかったので、スキップ。
書くならこんな感じに:
type DebugMode = | A = 1 | B = 2 | C = 3
コマンドラインをパースする
コマンドラインをパースするにはパーサーを作成する:
open Argu let parser = ArgumentParser.Create<Arguments>( programName = "make.exe", errorHandler = ProcessExiter() )
第 2 引数の errorHandler = ProcessExiter()
を忘れると恐ろしいことが起こるので注意。
後は、argv
を引数に parser
の Parse()
メソッドか ParseCommandLine()
メソッドを呼び出すだけ:
let results = parser.ParseCommandLine argv
すると、Arguments []
が返ってくる。
ので、これをあれこれする。
らしい。
printfn とかで出力する時に
最近までこんな風にやってたんだけど:
let name = user.GetName() // printfn "Hello, %s!" user.GetName() はエラーになっちゃうので // 一旦、変数に束縛する。 printfn "Hello, %s!" name
別にそんなことをする必要はなかったらしい。
<|
を使うんだルーク!!
printfn "Hello, %s!" <| user.GetName()
ヽ(=´▽`=)ノ
よく考えると coke とか joke とかいい名前があるじゃまいか
よさげなビルドツールを作ることはよさげな開発人生に一条のいい感じの光を投げかける的ななんかアレなわけです。
以下の C 言語なソースコードをビルドすることを考えてみましょう:
// main.c #include <stdio.h> int main() { printf( "Hello, World!\n" ); return 0; }
このようなケースは実の所あんまりないんですが、えーっと考えるのが簡単だよねって思ったのでそーいうことにしています。
SCons 風のビルドツール
SCons さんは Python 製のビルドツールっていうかなんかそれです。
ごっごる神がお作りになった次世代ビルドツールである Bazel だって SCons さん風に*1ビルドスクリプトを書きます。
const joke = require( '../lib/' ); joke.program( 'main.c' );
こうして見ると、JavaScript にはもってこいのような気がしなくもないと云うか何と云うか………。
CMake 風のビルドツール
CMake さんは Makefile を生成するメタビルドツールだと云うこともできるかもしれません。
めんどくさい AutoTools よりは佳いと思われます。
const joke = require( 'joke' ); joke.project( 'hello-example' ); joke.addExecutable( 'main', 'main.c' );
っていうか、パッと見、SCons とあんまり変わってないですね………。
それで?
joke を SCons 風なビルドツールとして作ってみようかなと思ったり思わなかったり……………。
*1:ドキュメント見ただけだから、そんなことはないかもしれない
RequestPolicy じゃなくて RequestPolicy Continued にしたら捗った
いままで、RequestPolicy を愛用していたんだけど、全然更新されていないのに気がついたので、RequestPolicy Continued に切り替えた。
(๑´ڡ`๑) めっちゃ使いやすい
class が export キーワードで export できなくてちょっと悲しかった
node のバージョンはこんな感じ:
% node --version
v6.3.1
wasp を書いてたら、
// ↓ class は書けるのに、export ができない!!!>< /* export */ class Emitter { constructor() { this.events = []; } on(name, cb) { this.events = ( this.events || [] ); this.events[name] = cb; return this; } emit(name, that) { let self = this; let events = self.events[name] || []; events.forEach( anEvent => { anEvent.call( self, that ); } ); return self; } } // ↓ ので、従来通りの module.exports に Emitter を設定する。 module.exports = Emitter;
という感じだったので、悲しい。