カテゴリー別アーカイブ: パソコン

Xcodeでflexつかうとエラーになる時のメモ

半日潰したのでメモ。

● 出てたのは

2つ。
Xcode付属のflex,bisonで下記。

  • (1) flex ver 2.5.: C++11仕様でコンパイルでワーニング
  • (2) bison ver2.x:「%define parser_class_name { Parser }」が通じない

(1)(2)ともにXcode付属のflex/bisonが古いぜ。

● 結論

(1)(2)ともに,flex&bisonをverUpしたがXcodeがそれをガン無視。
 ↓
Scanner.cpp, Parser.hpp, Parser.cppを予めコマンドラインで生成して,Xcodeのプロジェクトに追加することに。
 ↓
今度は,Xcodeの環境で読み込む「#include 」が古いファイルを参照するので,/Application/Xcode.app/〜以下のFlexLexer.hをXcodeに内緒で差し替える
 ↓
ビルド成功(ちょっぴりwarningまだ出るけどね)

ここまで半日格闘。

● (1)flex 2.5.x だと c++11 コンパイルでワーニング

flex 2.5.xは,変数宣言だかにregisterキーワードが使われる。
registerはc++11でdeprecatedに。だから Xcode でコンパイル時にワーニングだらけになる。

こちとら趣味だしワーニングなんで放っとこうかと思ったが,何しろ多量だし気味が悪い。

● 調べると

flex 2.6.xは,registerキーワード吐かなくなったらしい。おお。
早速brewでインストール。

$ brew install flex
$ brew link flex --force

これでScanner.lをコンパイルする。

$ flex -o Scanner.cpp Scanner.l

中身からキレイにregisterが消えた。

● このファイルをXcode

に追加すると,register絡みのワーニングは消えた。

● が

今度はエラーが大量に出るように。

Xcode曰く
Too many errors emitted, stopping now

て。ええ!?

● みると Semantic Issue だそうで

「Member reference type ‘std::istream *’ (aka ‘basic_istream *’) is a pointer; did you mean to use ‘->’?」

みると確かに「yyin」がポインターとして宣言されて,「.」演算子が付されてる。
「yyin.rdbuf(std::cin.rdbuf())」みたくなってて妙だ。
「yyin->rdbuf(std::cin.rdbuf())」では,ってコンパイラが言うのも確かに。

しっかしsemanticエラーたって,flexが吐いたコードだしなあ。
webによっては「もう,自分で.を->に編集しちゃおうか」的な話もあり。

● だが救世主はやはり

webの中に。

● stack overflowというサイト

国内に情報が少ない場合に大体googleでヒットするstack overflowだ。

もう。stack overflowyahoo知恵袋に世界の大半は記録されてるんじゃないか。

上記リンク先のAlex H.さん(stack overflowの方ね)曰く

you might be able to just use a newer “FlexLexer.h” (for example the one from here: https://github.com/westes/flex/blob/master/src/FlexLexer.h)
(新しいほうの”FlexLexer.h”が使える。(例えばこことか))

FlexLexer.hが古いんで,新しいやつダウンロードして使えば?という。

理由はAlex H.さんの予想だと

I believe the issue is an out of sync “FlexLexer.h”. Flex 2.6.0 changed the storage definition of yyin storage for C++ scanners for both the header and the generated source. However I suppose the mac port package is including an out-of-date FlexLexer.h, even though flex itself has been updated. This leads to the mismatch you are seeing as compilation errors.

ということのよう。って英語だらけ。だいたい

  • flex 2.6.0で,yyinの定義が変更になってる
  • flex自体は更新されても,古いまんまの”FlexLexer.h”が読み込まれてるんじゃないか

ということか。

● そこで

仰せの通りここへ行って,FlexLexer.hをダウンロード。
いや実際にはここでcloneをダウンロード。
どこに入れればいいかというと

~$ find /Applications/Xcode.app/ -name "FlexLexer.h"
/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/FlexLexer.h

発見。

これで(1)が解決。
Xcodeにはコマンドラインで作ったScanner.h

$ flex -o Scanner.cpp Scanner.l

を後から読み込ませれば世はすべて事もなし。

● (2) bison ver2.x:「%define parser_class_name { Parser }」が通じない

$ brew install bison
$ brew link bison --force

そして

$ bison -o Parser.cpp Parser.y

を後からXcodeに読み込ませる。

● なんとかおしまい

上記でビルド成功(ちょっぴりwarningまだ出るけどね)。

次は

● 今まで作ってた

SDL2.0のプログラムとマージしてみる。

コログ

最近のこと。

これは生きたログだから,最近のことをかき殴ろうというわけだ。

● プログラム紀

始まる。
久しぶりに,プログラムを趣味でカタカタやる。

もっぱら

● flex & bison in C++

というやつだ。
flexとbisonを使って,簡単すぎるインタプリタぐらいまでは作れそうな感じに。

bison -> flex へのヘッダファイル提供。
実際には,bisonで言語ルールまで書いて%tokenや%typeで宣言した部分を,
後に flex で#includeして使うということのよう。

これには,

● これに

めっぽうお世話になりました。
動物の柄のこの本,学生時代から憧れの象徴。

実際には,2年前ぐらいか。秋ぐらいから寝床で読んでは
単語がわからずiphoneとかで調べる。

  • precedence:優先順位(計算機演算ではpriorityて言わないのかな)
  • arbitrary:任意の
  • adequate:十分な
  • punctuation:句読点(句読法か)
  • glue to:接着する
  • simultaneously:同時に
  • albeit:〜であるが。
    (p12. “This is a hack, albeit a very useful one, since most of the time it does the right thing.”)

いくつかは入試レベルな気もし。
albeitって,そういう意味で使うんだ。など。

● 下記は,去年の夏に書いてボツにしたブログから

−−−−−−
● 学生のとき(1994〜2000年ぐらい)

大学の授業でBNF記法というのを学んだわけだが、まあ

→ 学べてなかった

単位はもらえたんだっけ。という。
bisonでは、言語仕様をBNF風に書かねばならなかったはず。

● 戸塚時代(2002年〜2007年ぐらい)

よーしいっちょう、flexでも勉強して、新種のプログラミング言語でも発明してやりますかぁ〜
と意気込み、再三挫折。

ギリflexまでは分かる。
けどbisonで何度やってもどうやっても僕の書いたBNFの言語仕様が

● ambiguous grammar

ていうエラーになる。
訳すと「曖昧な文法」。何が曖昧じゃい。曖昧な日本の私のプログラム言語の仕様。

僕にはもう、bisonを使う才能とか、生きている価値とか、死なない権利とか、笑う勇気とか、

● 何にもないに違いない

と咆哮したり呻いたりして畳の目に逆らって爪を立てたり、足の裏で敷居をゴシゴシしたりしては、とにかく、諦めていた訳だ。
−−−−−−

● という

存外に元気な感じでやってたわけだ。
やがて分かりかける。

● 飯も自炊し

再び去年の盆に書いてボツにしたブログから引用する。

−−−−−−
● で

何に感動したかというと、この『flex&bison』の「計算式を入力すると、加減乗除を優先順位を守って計算する」という
サンプルプログラムをつくる中での p.14 だ。

またしばらくすると、仕事で頭が一杯になって、何を理解したのか忘れると思うので、備忘録として残す。

Ambiguous Grammars: Not Quite
The reader may be wondering at this point whether the grammar in Example 1-5 is needlessly complicated. Why not just write this?
(読者はExample 1-5が不必要に複雑だと思っているかも知れない。こう書いてはだめかと。)

exp: exp ADD exp
   | exp SUB exp
   | exp MUL exp
   | exp DIV exp
   | ABS exp
   | NUMBER

そうそう、まさにそう。↑みたく書いちゃなんでダメなんだって十年来わからなかった。
この辺、わくわくしながら読んだ。

ちなみに「Example 1-5」というのは、bisonへ渡す言語仕様を書いたもので p.11 にはこうある。

Bison’s Rule Input Language
Bison rules are basically BNF, with the punctuation simplified a little to make them easier to type. Example 1-5 shows the bison code, including the BNF, for the first version of our calculator.
(bisonに渡すコードは基本的にBNFだが、容易に書けるよう記法を少し簡単にしている。Example 1-5 に計算機の一番最初のバージョンのためのbison用のコード(BNFを含む)を示す。)
Example 1-5 Simple calculator fb1-5.y

 <前略>

calclist: /* nothing */
  | calclist exp EOL { printf("= %d\n", $1); }
  ;

exp: factor
  | exp ADD factor { && = $1 + $3; }
  | exp SUB factor { && = $1 - $3; }
  ;

factor: term
  | factor MUL term { $$ = $1 * $3; }
  | factor DIV term { $$ = $1 / $3; }
  ;

term: NUMBER
  | ABS term { $$ = $2 >= 0? $2 : -$2; }
 ;

<後略>

そうコレなのだ。僕が戸塚時代にメロメロになったやつ。
よく入門書なんかに書いてあるやつだ。

何でこんなに分けて、わざわざ複雑に書かねばならんのだと。謎だった。

p.14でLevine先生が言う「The reader wondering at the point」こそ僕だ。

そしたらそのp.14にはこう続く。

There are two answers: precedence and ambiguity. The separate symbols for term, factor, and exp tell bison to handle ABS, then MUL and DIV, and then ADD and SUB.
(答えは2つある。優先順位と曖昧さだ。termとfactorとexpを分けて書くことで、bisonにまずABSを、その次にMULとDIVを、そしてその次にADDとSUBを処理するよう指示している。)

興奮して音読していた。
そういうことだったんだ。今までこの世のどこにもなかった答えが初めて身に染み入る。ッアー!
−−−−−−

● 何やら

感動している。
スピッツのメドレーをyoutubeで流しながら,暑い日,来る日も来る日も

● 新築の

家の中で猫と僕だけ住んでる状況。
その中で,ずっとプログラム三昧。何度かラム肉食って赤ワイン飲みまくって吐く。

● 分かったことは

C++でflex, bisonを利用することは可能ということと,
ヘッダファイルで

#undef YY_DECL
#define YY_DECL \
yy::Parser::token_type \
Scanner::scan(yy::Parser::semantic_type* yylval, \
			  yy::Parser::location_type* yylloc, \
			  ParseDriver& driver)

とかやったり,かなりトリッキーだということと。

Parser.y内で,


%{
#include "ParseDriver.hpp"

//yylex()のオーバーロード
yy::Parser::token_type
yylex(
yy::Parser::semantic_type* yylval,
yy::Parser::location_type* yylloc,
ParseDriver& driver) {
	return driver.scanner->scan(yylval, yylloc, driver);
}

// parser's error routine <- it's need to be implemented by us
void
yy::Parser::error(
const yy::Parser::location_type& l,
const std::string& m) {
	driver.error(l, m);
}
%}

なんていう,なかなか香ばしいことを書く必要。

● なんか

もともと flex, bison が広域変数使いまくったり,
#ifndefや#defineつかって,凄いことになってたりする中,

● flex, bison in C++も

C++のクラスを使う上で,かなり凄いことになってる。ということのよう。
勉強したのは下記。

  • Blog Alpha Networkingめっちゃお世話になりました。GW前〜GW中@ハトヤ。ずっと解読してました。言ったら実際に手で打って写してました。
  • bison-test@GitHub日本人の方のソース。めっっっっっちゃ分かりやすかったっす。ありがたい。
  • flatB-Compiler-and-Interpreter@GitHubAST(Abstract Syntax Tree:抽象構文木)をC++で作ろうという場合の,B-flatというC言語ぽい言語の,(1)文法チェック(2)インタプリタ(3)コンパイラの例示。すげえ。
  • 10.1.4 C++ Parser InterfaceGNUか何かの,てほどき。bison側の。
  • Generating C++ scannersGNUか何か。flex側の。

やっと,コンパイルフリーなBison/Flexのtinyセットを作成できた。
コレを元に,ASTつくって逐次実行するサンプルができたら,

● やっと

1年以上ぶりにyoutubeのサイトを更新できそうだ。
今日はプログラム紀について。

● 次回は音楽編

そんで次は,最近の人生観について。
順次追記していく。

flex&bisonの勉強

をしてる。

IMG_9153

これ。
今わかった所までの覚え書き。

● 近況

 youtubeへは下記をアップロード。

 ゲームのメインループをクラスに切り出してみたという話。

● で、いよいよ次は

 スクリプトの解析をする処理。アドベンチャーゲームだから。
 シナリオを書いたテキストファイルを読み込んで、ゲームを動かしてみたい。

 で現状下記がボツに。

  1. logo.gif lua :スクリプト言語。いろいろ目処立たず。
  2. kirikiri_inside_small吉里吉里:windows版のよう。なのと、すごい存在感。手を出すとここまで撮った動画が無為になるため見て見ぬふり。

 というわけで自分でつくることにした。

● スクリプトファイルを

 単語単位に分けるのがflex

fade 0           画面の輝度を0に
load "awesome.jpg"    背景画像をロード
fade 0 to 100 in 500   画面の輝度を0から100%まで500ミリ秒で

wait            ユーザ入力を待つ

 こういうのを。

fade
0
load
awesome.jpg
fade
0
to
100
in
500
wait

 こういう風に直してくれるのがflex
 ありがとうflex

● これやるためのflexコードが

 こんな感じ。

%{
#include "myparser.tab.h"
%}

%%

<INITIAL>"fade"		{ return FADE; }
<INITIAL>"load"		{ return LOAD; }
<INITIAL>"to"			{ return TO; }
<INITIAL>"in"			{ return IN; }
<INITIAL>"wait"		{ return WAIT; }
<INITIAL>[0-9]+		{ yylval.integer_value = atoi(yytext); return INT_VALUE; }
<INITIAL>[ \t]		{ }
<INITIAL>"\""			{ yylval.string_literal[0] = '\0'; BEGIN _LITERAL; }
<_LITERAL>"\""		{ BEGIN INITIAL; return STR_LITERAL; }
<_LITERAL>.			{ strcat(yylval.string_literal, yytext); }

%%

 flexにお願いするとこれを元に、C言語のコードを生成してくれる。
 そのC言語のコードの冒頭あたりに

#include "myparser.tab.h"

 が挿入される。

 また、

<INITIAL>"fade"		{ return FADE; }

 と書いておくと、
 入力されたファイルの中に「fade」という単語が見つかったら、「return FADE;」を実行するようなC言語のコードが生成される感じだ。

 このときFADEは記号定数だが、宣言部分を生成してくれるのはbison

● bisonの方のコードが

 これで

%{
#include "stdio.h"
extern int yylex();
extern int yyerror(char *);
%}

%union {
	int integer_value;
	char string_literal[2048];
}

%token FADE LOAD TO IN WAIT
%token <integer_value> INT_VALUE
%token <string_literal> STR_LITERAL

%%

program			: /* empty or.. */
				| program command
				;

command			: FADE INT_VALUE { printf("fade to %d\n", $2); }
				| LOAD STR_LITERAL { printf("load the file named: '%s'\n", $2); }
				| FADE INT_VALUE TO INT_VALUE IN INT_VALUE { printf("fade from %d to %d in %d milli second\n", $2, $4, $6); }
				| WAIT { printf("ordered to wait.\n"); }
				;

 これの

%token FADE LOAD TO IN WAIT

 ここで指定したやつが”myparser.tab.h”に

#define FADE 258
#define LOAD 259
#define TO 260
#define IN 261
#define WAIT 262
 :

 みたく展開される。これをさっきflexのほうで

#include "myparser.tab.h"

 として読み込んでいる。
 だからflexが読み込むファイルの中に

<INITIAL>"fade"		{ return FADE; }

 とあっても、FADEがdefineされているので通る。

● あとは

mylange.c

#include <stdio.h>
#include "myparser.tab.h"

int yyerror(char *s) {
	printf("yyerror(): %s", s);
	return -1;
}

int yywrap(void) {
	return 1;
}

extern int yyparse(void);

int main() {
	yyparse();
	return 0;
}

 これでmain()からyyparse()を呼び出す。
 yyparse()が、bisonが生成したコード(構文解析器)の処理呼び出しになっている。
 yyparse()の中では、flexが生成したコード(字句解析器)の処理(単語単位で取り出す処理)を使うという寸法。

 yyerror()とyywrap()はこんな感じで定義しておくらしい(いい加減)。

● 実行結果

 こんな感じ。

$ ./mylang < sample.txt
fade to 0
load the file named: 'awesome.jpg'
fade from 0 to 100 in 500 milli second
ordered to wait.
$

 なんか元のスクリプトと同じような出力にしてしまった・・。
 けど正真正銘、字句解析器→構文解析器を通した結果出力。

● はじめ

 特に理解がいかなかったのがflex生成コードと、
 bisonが生成したコードの結びつき具合。

● 現在は

 flexとbisonが出してくれたCコードを、
 ゲームメインのC++から呼び出すときの齟齬が出ないか恐る恐るリンク中。

xcodeでsdlのヘッダに出てくる謎のワーニングを回避するメモ

 というわけで、今までつくりためたsdl関係のC++クラスを使って、

wwwthumbnail.php

 アクションゲームを作りたくなってきている。(画面は2008年に作りかけてたときのやつ)
 んだが。

● ふと気づくと

 sdl2.0のヘッダファイルをインクルードすると

● ワーニングが

スクリーンショット 2017-06-02 13.49.17

 表示されるようになってた。
 息子が横で見てて、

ー何それー?ねえ、全部消してね、全部ちゃんと消して〜

 と言う。
 んん。まあ、動くからいいじゃん、とも思いつつ気になるので調べてみた。

● どうも

 よく見ると

スクリーンショット 2017-06-02 13.49.28

 「Documentation Issue」とのことで、なんでも

– ‘\return’ command used in a comment that is attached to a function returning void

 だそう。意訳すると

ー戻り値の型がvoidの関数に付随するコメント内で、戻り値があるかのようにreturnコマンドについて書かてるからおかしいよ。

● 見ると

 SDL_assert.hとか、ヘッダファイル内を指してるぽい。

 で、見てみると

スクリーンショット 2017-06-02 13.50.16

 コメントがワーニング・・だと。

● んなアホなと。

● 思いつつ

 どうも

● コメント内に関数とかそういうのの

 仕様を記述しておくものらしい。

 ツールを通して、自動で仕様書?みたいな「ドキュメント」を作るような支援機能用なのか、
 後からそこを追いかけて、IDEのエディタがカーソル付近に情報を表示してくれるのか。

● これは

 絶対、オフにするオプションがあるハズ、と思ってネットを当たってみたが
 日本語のページを探し当てられず、
 出てくるのは

ー Hi im having a big trouble in ほにゃらかほにゃらか

 みたいな英文ばかり。

 なので、メモしとく。

● 下記

スクリーンショット 2017-06-02 13.50.40

 だ。
 これをNoに設定すればワーニングは消える。

 じゃ次は、いま上げてるyoutubeのプログラム動画の次のテーマを
 アクションゲームづくりにできそうかどうか実験してみる。

XMedia Recodeで動画の音量を大きくするメモ

 GW中に動画を正月以来5ヶ月ぶりに撮ったら

スクリーンショット 2017-05-08 17.49.19

 声が小さ〜い。(SDL2.0 C++でゲームをつくる

● このままでは

 youtubeで再生した動画が
 「40過ぎのおっさんが、ひたすら延々、ボソボソ語りかけてくる」なんていうのになる。そんな

● ある意味ドSな

 動画なんかだれも見ない。
 俺だって見ない。
 40過ぎのおっさんだけど。俺は。

 というわけで、思いのほか小さい声量に対し、相対峙し

● はい、もういっちょ、元気よーく

 ウィーッス!(撮り直しー!)

 と

● やる元気も

 ない四十路。
 動画ファイルの声だけ大きくするような、便利な道具が欲しい。

 そこで、どこでもドアやタケコプターの飛ぶこの時代

● 絶対あるはず

 と高をくくってググると

● 確かにある

 フリーの動画の編集ソフト。
 動画アップ前に使ってるiMovieだと、なんかそれほど大きくならないのだ。

● という

 わけで、
 7歳の息子が後ろで「ねぇねぇ見て見てぇ〜これさぁ〜」と言う中
 2歳の娘がミニ鯉のぼりの竿を振り回す2LDKの一隅で

● 何度もミスりながら

 色々ググっては、フリーと言えども制限のある商用ソフトだったり、何だりしながら

● これでした

 XMedia Recode
 窓の杜
 本家HP(ドイッチュ!)(右上の「English」に気づくまでテンパった)

 下記、メモ。

● まず

 ドラッグアンドドロップでもメニューでも何かしらで、動画ファイルを開く。

01-FileDropped

● 「映像」タブ

 「モード:」で「コピー」を選ぶ。

02-NoVideoSelect

 動画の変換をするとは言え、音量だけなので、映像自体はただの「コピー」で何も手を加えない。

● 「音声」タブ(画像では「音声トラック1」タブ)

 左のリストから「音量補正」を選択する。と右側が画像のように少なめ項目に。

03-ModifySoundVolume_

 で、「音量補正:」で「音量変更」なら%単位で指定できる。
 最大500%。
 今回500%で十分だった。

 この後で少しハマり、くじけそうになったが

● 「リストに追加」をクリック

 下の画像のように、「リスト」タブを選ぶと、変換する対象が一つもない。

04-NotAddToListYet_

 この状態だと、肝心の「エンコード」が単色表示のまま。
 なので「エンコード」の左の「リストに追加」をクリックすると

05-AddedToList_

 上の画像のように、リストに追加されて、「エンコード」が有効表示に変わる。
 で、「エンコード」をクリック。

● しばし待つと

 次のように変換が終わる。

06-Converted

 22分の動画の変換が47秒!速い。

 これでやっとiMovieで動画編集に入れるわけだが、もうGWは終わるわけだ。

 またボソボソ録画したとき用にメモを残しておく。

SDL2 C++/フレームレートの調整

というのをyoutubeにアップロードしてみた。

収録は6月。
いまは10月。

この間,まったく余裕なく。

最後は原因不明の高熱が1.5週間続くという。

● 寄る年波

昔からこの時期(秋口ぐらい)に,37.2度ぐらいが出続けるというのはあったが,
先週の金曜日未明は40.1度。

6月末からまともな2連休がなかった。身体がもうだめっすーと言ってたのか,何だったのか。
さすがに塾の仕事をずっと続けてくのに自信を失いかける。
が,まあやるしかないか。

● というわけで

6月撮影のファイルを見てたら,下記3つがあって,これって前回アップロードした第7回の前,
第6回の後に入るべきだったきがしてきた。
というか,べきだった。

・キー入力で終了する
・文字列を表示する
・画面のフェード処理を実験する

● なので

第6.5回としてアップロードせざるを得ず。

した。
これから出かける。

macでSDL2.0とC++でゲーム画面を表示

するところまでいった。

スクリーンショット 2016-05-09 22.12.14

※フリー背景素材:きまぐれアフターさん
ありがとうございます!!

第3回:画像を表示する

いやー面白いけど色々考えねばで、通勤の行き来が楽しい。

● といいつつ

動画だけは撮り溜めてる。
あと6回ぐらい先で、luaを使うかも知れず。

● lua

スクリプトとしてのluaという言語はすごいぽい。

>>lua
 ホームページ。英語でよくわからん。

>>lua @wiki
 そろそろ寄付すべきか。
 なるほど。lua=月の意ね。

(ゲームメインC/C++)←→(lua state)←→(luaソースコード(スクリプト))

● わかりやすいページで

勉強。

ゲームつくろー(Lua組み込み編)

すごい勉強になる。
というか、デザインパターン習得編とか、すごい気になる。

しかも管理人の方が同い年らしいという。

・・・。
とりあえずmacで動作確認はできた。
第10回目かそこらで、アドベンチャーゲームのそもそものスクリプトはluaで実装してみようかとか。

SDL2とC++でゲームを作る、という動画を

撮ってみた。
SDL2というライブラリを使って、C++でゲームをつくれないかなあという。

まだ途中。

第1回:

第2回:

毎週末にアップしてったらいいなあ。
キー入力とテキスト表示、それからフェード(イン/アウト)の掛け方まで調査済み。

今日から仕事だー。

SDL2.0でつくった昔のWinプログラムをMacで動かしてみた

明けてた。
気が付くと1月8日。

● 冬期講習の

あとの1日休みがあったので,昔Windows上で作りかけてたゲームをMacでコンパイルしなおしてみた。

そしたら動いた。

● 画像と音楽とかのライブラリに

SDL2.0というのを使わせて頂いてた。
SDL2.0は,WindowsやMacやlinuxまでサポートするライブラリ群。

画像処理と,音関係と,フォントとかを,どのwindowsだろうがmacだろうがlinuxだろうが共通の関数で呼び出せる。
日本語リファレンスもある。

ありがたいです。

当時は将来macを買うとは思ってもいなかったが,

● 試しにmacの開発環境のxcodeで

OnaPuMacSrc01

ビルドし直すと,そのまま動いた。

そのままと言いつつも,ヘッダファイルのパスが違ったのでそれだけ全ファイル手直し・・・。
ただ,ステージ表示がなんか,画面消去されずに出てくる・・。

logicoolのbluetoothキーボード

を買ってみたわけだ。

image

TF715SG1。
価格.comで価格推移を見たら,発売当初は10,800円。

● これが

ソフマップで1780円。
9,020円引き。

まあ安いからには,ラックに入ってるからには

● 訳あり商品らしい

買う前にスマホで評判をチェックすると

  • ipadと物理的に接続がうまくいかない
  • 畳むと本体とipadの間にすきまがある。個体差とかでなく、すべて

など、結構なことが書かれてる。
が、

● amazonの

何を信じるのかと言われればそれまでだが、
amazonのレビューを見る限り、星5〜3のほうがかなり多め。

まあ1780円だし、今mac book airでミーティングの時カチャカチャやってるけど
正直そうは言ってもなかなか持ち運びは重い。

● 運良く

カバーぽく機能すればよし、まあきっちり閉じなかったり、
万が一傷がつきそうなことがあったら持ち歩かずに、
家の食卓で軽いタッチでネットする用でもいいかなと。

10分ほど逡巡した上で、敢えて衝動買い。

● 使ってみた結果

まあまあいい。
というか、閉じ具合は案の定、適当な性格の僕から見たら

● 閉じてる閉じてる

うん。
で、キータッチ感はというと

● ここまで打ってきただけで

めちゃ慣れてきた
打鍵の音も好きなタイプ。軽くカシャカシャ言う感じだ。

● なんと
image
1780円、かなりやるな。。。という。

● ただ

難点といえば下記2つあり。

(1)「地球儀ボタン」で日本語/英字切り替えにならない
これはwebにかなり載ってた。
appleの仕業らしい。
ios9になって、入力切り替えのキー配置が変わったそう。うぬぅ。

もともとのlogicoolのキーボードは、「地球儀ボタン」を
従来のキー組み合わせを発信するように作り込んであったのだろう。気の毒な話だ。

ずっと使っててios8からios9にアップデートした人は怒り心頭のよう。

(2) 「1」を押そうとして「ホームボタン」を押しちゃう
これをやると、wordpressが怒るようで、
なんどかこの文章がフリーズした。まあこれは自分頑張れだ。