読者です 読者をやめる 読者になる 読者になる

Steam が動くようになった件

Steam

ただし、以下のコマンドで、だけど。

% STEAM_RUNTIME=0 steam

STEAM_RUNTIME=0 は Steam 側のライブラリ*1じゃなくて、/usr/lib のライブラリを使うというスイッチだよ。

あと、cef_extentions.pak はどうしてもどうやって取得すればいいのかわからなかった*2ので、
外付け HDD の Windows にインストールされていた cef_extensions.pak をコピペしたらロードできないエラーは無くなった。

steamclient.so がどーたらこーたら言っていたので、そーいえば、Steam が依存している全てのライブラリを steam-libs でインストールできたっけなーと思い出したので:

% yaourt -S steam-libs

と打ってみた。
案の定、まだインストールしていないライブラリがあった。

で:

% STEAM_RUNTIME=0 steam

って打ってみたら、ログイン画面が出た*3

f:id:noqisofon:20160923230426p:plain

キタ━━━━(゚∀゚)━━━━!!

参考

*1:.so 的な意味で

*2:めんどくさかったというのもある

*3:一旦 ~/.local/share/Steam を全部削除してしまったせいで、ログイン情報も抹消されてしまったんだと思う

最近よく使ってるコマンド

コマンド

そのいち

これかなぁ:

% find -name '*.zip' -exec unzip -O cp932 {} \;

元の unzip がそうなのかはよくわからないけれど、unzip-iconv では
unzip <ファイル名> -O cp932 ってやると、-O cp932 が無効なオプションだよって言われるのでとっても悲しい。

そういうわけなので、unzip <ファイル名> ってタブってから、-O cp932 とか付けたりする。
unzip -O cp932 と先に付けてしまうとタブが効かないのでもっと悲しい。
Zip ファイルが 1 つならいいけれど、複数ある場合もあるので、これを使って全部解凍している。

そのに

これ:

% STEAM_RUNTIME=0 steam

または:

% LIBGL_DEBUG=verbose STEAM_RUNTIME=0 steam

まだ、解決していない。

また Steam が動かなくなった件

Steam Arch_Linux

カテゴリに 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

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' }

他の人はどう使っているのかわからないけれど、RubyLisp にあるキーワード的な使い方をしている。

LiveScript では add-column みたいなのは、JavaScript に変換する時に addColumn みたく camelCase になるので
ハイフン大好きマン*1な私としてはとてもうれしい。

ちなみに \slot-nameJavaScript に変換されると 'slotName' になる。
このため、どうしてもアンダーバーで区切りたい文字列には普通に \delete_account と書くことになるが、これはこれで良いと思う。

*1:で、JavaScript では camelCase したい

めっちゃシンプルな更新監視型ビルドツールが欲しい

build-tools

Hotot3 の core/scriptsCoffeeScript で書かれているので、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 やってみた

JavaScript
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();

は一緒のはずだよね???

ファイルの順番の話

FSharp

こーいう 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 すごい

FSharp

Argu は F# 製のコマンドラインパーサーだよ。

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 を引数に parserParse() メソッドか ParseCommandLine() メソッドを呼び出すだけ:

let results = parser.ParseCommandLine argv

すると、Arguments [] が返ってくる。
ので、これをあれこれする。

らしい。

printfn とかで出力する時に

FSharp

最近までこんな風にやってたんだけど:

let name = user.GetName()    // printfn "Hello, %s!" user.GetName() はエラーになっちゃうので
                             // 一旦、変数に束縛する。

printfn "Hello, %s!" name

別にそんなことをする必要はなかったらしい。 <| を使うんだルーク!!

printfn "Hello, %s!" <| user.GetName()

ヽ(=´▽`=)ノ

よく考えると coke とか joke とかいい名前があるじゃまいか

JavaScript

よさげなビルドツールを作ることはよさげな開発人生に一条のいい感じの光を投げかける的ななんかアレなわけです。
以下の 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:ドキュメント見ただけだから、そんなことはないかもしれない