ぬまのそこ

namazuのゆるいエンジニアブログ

最近のWineはエロゲ動くの?

wineでエロゲ動かす

私のノートPCは以前Windowsだったのだが、開発に使うには嫌気がさしてLinuxにしてしまった。 開発効率が上昇してとても良い感じだが、一点問題が。エロゲができない。

そもそも開発用のノートPCでやるなよという話なのだが、ノートPCしか手元にない状態で過ごしていると、なんとなくやりたくなったときにできなくてつらい。

家のメインPCにRDPしてやってもいいのだが、メインのデスクトップを常時付けていると電気代もアレなので大抵切ってしまっている。

この前実家に帰省したときにノートPCしかなくて辛くなって、なんとかしてLinuxノートでエロゲ動かそうと頑張ってみた。

Linuxwindowsアプリを動かすならwine。 昔に使ったときは、使い物にならなかったような記憶があるが、いまはどうなんだろうって。

環境

  • VAIO Z(VJZ13A1)
  • ArchLinux

wineインストール

Wine - ArchWiki

偉大なるArchWikiに沿ってやっていく。 適当に推奨されたものを突っ込んでいった。 実際に動かす上で足りない物もでてきたので、それらは随時いれた。

足りない奴は実行時にsoがないよーってログが吐かれるので、そこから推察してインストールすれば上手くいく。

私はサウンド関係を入れ忘れてて、音がでなかった。 必要パッケージをpacmanから放り込んだらすんなりいった。 (wikiにリスト載ってるんだからちゃんといれとけと言う話だが。。。)

動かしてみた

とりあえず試してみたのは『feng: 妹のセイイキ』 OPが好き。 三部作のなかでは一番好きですね。 イカもいいんだけど。 

ISOをノートPCにマウントして、wineコマンドでexeを起動。 インストーラはさらっと立ち上がって、普通にインストールできた。

起動したら、普通に画面出た。 普通に動くし問題なさそう!

f:id:kituneko-510:20180303230815p:plain

一つ動いたくらいだと偶然っぽいので、もうひとつやってみた。

ユニゾンシフト: 』 癒やしゲー。

こちらはインストールして起動したら、画面が出てこなかった。 おそらくDirectXとかあのあたりではないだろうかだろうと予想。 winetricsを入れて、DirectX周りのコンポーネント入れたらちゃんと立ち上がってくれた。 

f:id:kituneko-510:20180303231038p:plain

いいかんじ。

結論

二作品しか試していないけど、Linuxでもエロゲはなんだかんだ動くんじゃないでしょうか。 

どうしてもノートPCでエロゲがしたいときはなんとかできる。

どうでもいいはなし

きょうはみみのひで、みみけっとでした。 ぼーっと歩いてたらなんか色々買っていて、財布が空になってた。 こわい。

涼屋のうすい本、キャラが可愛くてなんとなーく欲しかったのですが、25分で全部完売しててゲットならずでした。  みみけの涼屋ってあんなんだったけ。。。 

昼は品川のラーメンを食べてきて家に戻ったのですが、書類がどっかいったことに気づき、家中探し回り、大学にまで探しに行った、大学で無事見つけられたのだが、その後また小川流でラーメン食べて返ってきた。 1日に二回もラーメンを食べてしまった。。。

エロゲと美少女ゲームの定義って結構差があるよね。

 

Nginxのauth_requestがPOST時にTimeoutする

Nginxのauth_request

Module ngx_http_auth_request_module

これをつかってSSO認証を制御していた。

上手いこと動いていた感じだったのだが、この認証下にある WordpressのログインがTimeoutするという問題が発生。 

調査していくと、wordpressへのPOST時のauth_requestでタイムアウトが発生していることがわかった。 認証サーバ側のNginxのログは見ると408を返していた。

解決策

auth_requestをProxyに流すときには、

  • Content-Length を空にして
  • proxy_request_body を off にすること。
 proxy_pass_request_body off;
 proxy_set_header Content-Length "";

公式にちゃんと書いてある()

行きつくまで

認証サーバ自体はRailsでできたちょっとしたものなので処理の中でタイムアウトが起きるはずはなかった。 またRailsには一切ログが吐き出されていなかった。

Railsのログに記載されないというのはどういうこと???ってなった。 低レイヤでどうなってるのか調べようと、unicornにstraceを掛けたり、tcpdumpしたり色々していた。 その過程でそこそこしょうもない知識を得た。

結局、nginxがGETを受けたまま、そのまま固まっているのでは?感がnginx-workerプロセスのstraceから見えてきた。 ヘッダを全部見返していったら、大本の設定でContent-Lengthが抜けてたことに気づいた。

他のauth_requestの設定をしてある場所はちゃんと公式の見本通りにヘッダがセットしてあったのに、ここだけ抜けていたのはなんでなんだろう。。。 Gitのログ曰く、最近テンプレートを書き直したときに、このヘッダだけ削っていたっぽい。 ふぇぇって感じ。

どうでもいいはなし

Nginxのことも含めて、

とか絶賛しょうもない日だった。

タスクが山積みなのでなんとかしないと。。。 明日大学に行って進捗を出すかなぁ。。。 

 

Linuxのパーミッションで4桁のときの最初の0

今日したこと

  • windows10のVagrantVirtualBox)が上手く動かなくなっててBIOSが開けなかったり、設定項目にたどり着けなくておこになった。
  • なんかつかれたのでお風呂に行ってた。
  • vagrantで沢山VM上げてプロビジョニングして楽しんだ

Linuxパーミッションの数字表記

chmod 0644 ... とか よく書くじゃないですか。 この最初の0について。 気になったので調べてたら、これのことだったのねってなったのでメモ。

この最初の桁は0,1,2,4が使えて、それぞれ以下の意味になる

  • 0 とくになにもなし
  • 1 スティッキービット: 所有者以外消せないけど誰でも書き込めるって奴。 /tmpとかのディレクトリに初期設定されてる。ファイルに付与したら何も起きない。
  • 2 SGID: 付けた場合、そのファイルの所属グループの権限で動くようになる。
  • 4 SUID: 付けた場合、そのファイルの所有者の権限で動くようになる。

詳細は

qiita.com

このへん。

RackとかRailsでリダイレクトとかがhttpsにならないとき

今日したこと

  • いろいろ

短文技術エントリは手抜き。

nginx => railsとかでhttpsをraislに飛ばすときに解く

よくある構成だとおもう。 フロントのWebサーバまではHTTPSで飛ばして、最後のRailsにはHTTPでReverseProxyするってやつ。

そのときにHTTPヘッダをちゃんとNginxで設定しないとRails側がHTTPSで来た通信だということを認識しなくてうまく動かないのはよく知られた話。 X_Forwared_Proto htttps; とかはちゃんと書こうなって記事に引っかかる。

で。 これで引っかかった。 ちゃんと書いていたのにHTTPSと認識されなかったのは謎。

今回の問題は、 GoogleOmniauthのリダイレクトURLが何故かHTTPになってしまうということ。

コードを漁っていったら、Rackのschemeからhttpsかhttpかを取得していた。

このschemeの部分を見ていたらRails(Rack)がHTTPSできた通信かHTTP出来た通信か調べてるのがわかった。

def scheme
        if get_header(HTTPS) == 'on'
          'https'
        elsif get_header(HTTP_X_FORWARDED_SSL) == 'on'
          'https'
        elsif get_header(HTTP_X_FORWARDED_SCHEME)
          get_header(HTTP_X_FORWARDED_SCHEME)
        elsif get_header(HTTP_X_FORWARDED_PROTO)
          get_header(HTTP_X_FORWARDED_PROTO).split(',')[0]
        else
          get_header(RACK_URL_SCHEME)
        end
end

Rack schmeのここの部分だった。 これでhttpsか判断してるっぽい。 X_FORWARDED_PROTOなどなんかうまくいかなかったので、このコードにしたがって、Nginxで。。。

proxy_add_header X_FORWARDED_SSL on;

みたいにやったら、HTTPSと認識してくれて良しなに動いた。

どうでもいいはなし

  • 某所の電源がぶつぶつ切れる問題。 接続しているUPSのバッテリー切れが原因っぽかった。 対応したのでこれでいけるといいにゃぁ。
  • ストロングゼロ2本だと飛べないのでつらいね。

Ruby YAMLファイルを読み込んでメソッドで値を取れるクラス

今日したこと

にゃーん って感じ。 カルシウム足りないんじゃないのってくらい情緒不安定だった。

愚痴ってもしょうがないので、さっきちょっと作ったコードを載せて今日はおわり。

やりたかったこと

env1:
  obj1: hello
  obj2:
    obj2_1: hello
    obj2_2: hello
env2:
  obj1: hello

こんなconfi.ymlみたいなのがある。 一番大本が環境毎。 そのしたにyaml

これを

config = Config.new('env1')
config.obj1 #=> 'hello'
config.obj2.obj2_1 #=> 'hello'

みたいに使いたかった。 

これをやるGemは当然既にあるだろうし、いつもはEasySettingsっていうGemを使っている。 ただせっかくだし自前でちょろっとつくった。たいした用途ではなかったしね。

とりあえず思いついたのがこれ。 メソッド名で出すからハイフンが使えなかったり色々あるけど。

require 'yaml'

class Config
  CONFIG_FILE_NAME = './config.yml'

  def initialize(env)
    config = YAML.load_file(CONFIG_FILE_NAME)
    hash_method_define = Proc.new do |res, obj|
      obj.each do |k, v|
        if(v.kind_of?(Hash))
          res_child = Object.new
          hash_method_define.call(res_child, v)
          res.define_singleton_method(k) { res_child }
        else
          res.define_singleton_method(k) { v }
        end
      end
    end
    hash_method_define.call(self, config[env])
  end
end

Rubyってすごいんですね。

どうでもいいはなし

にゃー。 あした大学行きたくない。 

RSpecでFileIOをスタブにする

今日したこと

  • テスト書いたり諸々

単体テスト、疲れたときに書くと意外と良いかもしれない。 今日は其の途中で得た知見を書いてお茶を濁す

FileIOをする処理をRSpec

テスト対象

def file_write
  File.open('hoge.txt', 'w') do |f|
    f.print 'fuga'
  end
end

こんなコードをテストしなきゃいけないとき、ファイルに色々と書き出されてしまうので面倒くさい。 また書き出されたファイルの中身が正しいかチェックするのにもファイルを読まないと行けないので大変。

こんな処理の時はStringIOが便利。 またRSpecでは既存の処理を簡単に置き換えられる。

file = StringIO.new('', 'w')
allow(File).to receive(:open).and_yield(file)

file_write
except(file.string).to eq 'fuga'

FileのOpen時にブロックに渡される引数をStringIOに置き換える。 これでファイルに書き込むはずだった物が簡単に取り出せる。

便利。

ブロックでは無く戻り値を利用してるとき

f = File.open('hoge.txt' , 'w')
f.print 'fuga'
f.close

なときは。。

allow(File).to receive(:open).and_return(file)

こうする。 戻り値を置き換えることもできる。

どうでもいいはなし

Rubyの勉強していたおかげでこのallowとかその辺の処理がどう実現されているのか大体想像が付くようになってきて嬉しい。 進捗と相談しつつテストを書いて完成度を上げていきたい。 

Wordpressの管理ユーザをDB叩いて追加する方法

今日したこと

WordpressのUserをDBから追加する方法

備忘録的に残しておく, 基本的には wp_usersにレコードを追加し wp_usermetaに必要情報を追加する

https://www.web-plains.com/?p=419 こちらを参考にクエリ組み立てさせてもらった。

insert into wp_users (
  user_login,
  user_pass,
  user_registered,
  user_email
) values (
  "namazu",
  md5("nyannyan"),
  "2018-01-25 00:26:19",
  "xxxxxx@mofumofu.com"
);

これでユーザが登録できる user_idはauto_incrementなのでこれで作成したあとに確認.

wp_usermetadataテーブルには

  • wp_dashboard_quick_press_last_post_id
  • dismissed_wp_pointers
  • wp_capabilities
  • wp_user_level
  • nickname

これを設定すればいいらしい

insert into wp_usermeta (
  user_id,
  meta_key,
  meta_value
) values (
  3,
  'wp_dashboard_quick_press_last_post_id',
  5
) , (
  3,
  'dismissed_wp_pointers',
  ''
) , (
  3,
  'wp_capabilities',
  'a:1:{s:13:"administrator";b:1;}'
) , (
  3,
  'wp_user_level',
  '10'
) , (
  3,
  'nickname',
  'namazu'
)

3のところは先程作ったユーザIDに変更。 これで管理者が作れる。

どうでもいいはなし

ちょっと立て込んでて時間がないので今日はこれで。

Nginxの設定がミスっていたらしく,POSTするとなぜかGatewayTimeoutが発生する謎現象に悩まされている。 つらい。