コグノスケ


link 未来から過去へ表示  link 過去から未来へ表示(*)

link もっと前
2020年4月21日 >>> 2020年5月18日
link もっと後

2020年4月22日

Transport Fever 2ひと段落

目次: ゲーム

Transport Fever 2の実績コンプリートしました。やはり最後になったのは「大都会」で、何度かやり直す羽目になって、とても時間が掛かりました。


Transport Fever 2の実績コンプリート

都市のターゲット人口が271 +470% で1500人達成できました。+460% = 1518だとダメでした。基本的には都市の人口はこのターゲット人口に近づこうとするんですが、時に越えたり時に越えなかったりします。良くわからない数字です。


1500人超え達成

フリーマップはランダム生成なので、必勝法は無いです。ただまあ、何回かやり直す中で最初にこだわっておいた方が良いなと思った条件は、

1800年スタート
1800年〜1900年後半くらいまでは、都市のベース人口が勝手に増える(1年に1増えるかどうかくらい)からです。2000年スタートだと全く増えませんし、クリアできるほどのベース人口になりません。
1960年〜1970年までが勝負
2000年に近づくほどマイカー渋滞が増え、都市内の物資配達が滞って人口が安定しなくなります。渋滞をうまく捌ける人は気にしなくて良いです。
マップは中サイズ以上
人口に一番影響するのは公共交通機関の利用者数で、小サイズだと街の数が少なくて、公共交通機関の利用者数が増えないからです。私の場合は、中サイズを使いました。
たぶん広い方が良いと思いますけど、PCスペック次第ですね。私のノートPCはスペックが低くて、大サイズだと時間の経過が遅すぎてダルかったです。
マップの街と産業は高密度以上
低密度だと街が少なく、公共交通機関の利用者数が増えず、人口が伸びないからです。
ターゲット人口の初期値が最大の街を育てる
ターゲット人口は時間経過で増えるとはいえ、限度があるからです。どこまでもは増えません。初期値は高い方が良いです(1800年だと最大200かな?)。
人口の初期値が高い街が真ん中付近に3つ出るまでガチャる
公共交通機関の利用者を増やすためです。大都市3つはあくまで目安ですが、公共交通機関は街と街の行き来に使うため、大きい街が1つだけだと利用者が伸びませんでした(これで1回やり直した)。
私は初期人口190くらいの街がほどほどの距離に3つ出るまでリスタートしまくりました。
編集者:すずき(2023/09/24 13:18)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年4月23日

Transport Fever 2大都市達成のヒント

目次: ゲーム

「大都市」達成を目指すとき、ゲーム進行で気を付けていたところの紹介です。前回も言った通り必勝法はないですが、ヒントになれば幸いです。

全都市を鉄道で繋ぐ
輸送量の関係で、道路+バス、空路は、キャパオーバーでうまくいかず、海路のみでは全都市にアプローチできないからです。私は使いませんでしたが、海路+鉄道ならば有効かもしれません。
鉄道でさえ大都市間の輸送はキャパオーバー気味で、駅に300〜400人溜まります。あと、私は都市間の道路は整備せず、初期状態で放置でしたが、マイカーの利用者数は時代が進むにつれ勝手に伸びました。
都市内はバスを走らせる
人口に影響が大きい、公共交通機関(=駅)の利用者を増やすためです。
バス停は住宅地、商業地、産業地をもれなくカバーするよう配置します。バス停に大量の人が溜まると人々は家に帰ってしまう(駅利用者が減る)ので、混んでいたら適宜バスを増発し、駅と各地域の人を行き来を増やします。
街の拡大に対応する
街は勝手に広くなるので、トラックの荷物輸送や、バス停のカバー範囲を広げてください。
物資は800個分確保する
物資を産業、商業それぞれ800個分(最終工場2つ分)確保します。少なくとも500以上は必要です。
簡単な「燃料」「資材」「道具」辺りを要求する街だと運用が楽ですが、多少引きが悪くても1935年に出てくるOPEL Blitzトラックを20台くらい使えば、どんなものでも力業で運べます。マップの端から端に運ぶとかでもない限り、気にしなくて良いです。
物資供給用の道路を新設する
物資が滞ると人口が減るためです。 トラック専用の道路を引き、街と街を繋ぐ道路を高架かトンネルで越えるようにすると、渋滞も起きないし、物資供給も安定します。
編集者:すずき(2023/09/24 13:17)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年4月28日

Transport Fever 2初めの一歩 - その1

目次: ゲーム

Transport Fever 2の基本となる片道の輸送について紹介します。画像をできるだけ使うようにしました。ゲームの雰囲気を感じてもらえたら嬉しいです。

参考までにフリープレイの条件は、ヨーロッパ、温暖、1950年、難易度イージー、街の密度は中、産業の密度も中です。

輸送するターゲットを見つける

最初に時間を止めます。なぜかというとこのゲームの初期資金は借金だからで、ぼうっとしているだけで、利子をどんどん取られて資金がなくなります。世知辛いね……。

輸送する対象を探します。今回は「森(右下)」から「製材所(左上)」に木材を運びたいと思います。画面に両施設の位置関係を示します。


森(右下)と製材所(左上)

どの施設が何のアイテムを消費or生産するのか?については、矢印のアイコンを見るとわかります。薄いグレーの背景が消費、濃いグレーの背景が生産です。消費側はない場合もあります。例えば森であれば「木材」を生産し、製材所であれば「木材」から「板」を生産することが分かります。


森のアイコン、何も消費せず、木材を生産


製材所のアイコン、木材を消費(左側)して、板を生産(右側)

他の消費と生産の組み合わせについては、今回の本題ではないので割愛します。

道路を作ろう

木材はトラックで運びたいので、両施設を道路で結んで、トラックが行き来できるようにしなければなりません。既存の道路も使えますが、今回は道路を新設してみます。道路アイコンを選び、両施設の間にズドンと真っ直ぐ引きましょう。


道路建設の手順


道路を真っ直ぐ引いた

トラックが貨物をピックアップする場所「トラック駅」を建設します。駅へ引き込む道路がそっぽを向いていたらShift + ドラッグで、回転させることができます。画像のように先ほど引いた道路とくっつくように近づけて建設してください。


トラック駅建設の手順

実はこれではダメで、施設から木材をトラック駅に持ってきてもらうためには、道路を施設に「接続」する必要があります。もう一度、道路建設アイコンを選び、道路を施設の近くまで引っぱると、施設にヒゲのような細い道路が表示されます。


道路を施設に接続

接続できたかどうか確認する簡単な方法は、付近のトラック駅をクリックすることです。もし道路の接続に成功していたら、トラック駅付近の施設が白く光り、失敗していたら光りません。道路が接続できていなければ、道路を引き直しましょう。


道路を施設に接続(成功)


道路を施設に接続(失敗)

道路が接続出来ていても、トラック駅が遠すぎても施設が光りません(=木材を持ってきてくれません)。その場合はトラック駅を配置しなおしましょう。

製材所の方も同様にトラック駅を建設して、道路を接続しましょう。うまくいっていれば、両施設のトラック駅をクリックすると、両施設とも白く光るはずです。


トラック駅建設&道路接続

トラックを購入するには「道路発着所」を建設し、トラックを走らせたい道路と繋げてある必要があります。つなげ方はトラック駅と同じです。


道路発着所建設の手順

続きは次回。

編集者:すずき(2023/09/24 13:15)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年4月29日

Transport Fever 2初めの一歩 - その2

目次: ゲーム

昨日(2020年4月28日の日記参照)に引き続きTransport Fever 2の基本となる片道の輸送について紹介します。画像をできるだけ使うようにしました。ゲームの雰囲気を感じてもらえたら嬉しいです。

輸送する路線を作る

道路で繋いだだけでは貨物は輸送されません。路線を作成して、どこからどこへ輸送するか決めます。


路線の作成

「森(右下)」から「製材所(左上)」に木材を運びたいので、2つのトラック駅を路線に追加します。トラックでも何でもそうですが、輸送車両は「終点」までたどり着いたら、次は「始点」に戻ります。例えばA, B, C, Dという経路を作ったら、A B C D A B C D ... という順に巡回します。


路線にトラック駅2つを追加

今回は2駅しかないピストン輸送ですので、始点と終点はどちらが先でも気にしなくて良いです。

トラックを配備する

最後にトラックを購入、路線に配備します。発着所をクリックするか、車両マネージャから発着所を選択します。大抵の場合は前者の方が楽です。


道路発着所

トラックを購入します。車両マネージャーから購入画面を出して、Opel Blitz防水布トラックを購入します。目的の貨物(木材)が搭載できれば何でも良いです(Benz製防水布トラック、Saurer C Type防水布トラックなどでも大丈夫)。


トラックを購入

運送車両の種類によって、積めるものに制限がありますので、車両購入の際は「貨物の種類」をチェックしましょう。例えばOpel Blitzタンクトラックは石油や燃料のような液体しか積めず、木材を運ぶことはできません。

輸送手段即時性輸送力貨物の種類制限備考
トラック×〜〇×〜〇自由 時代が進むと性能が桁違いに上がる、街のマイカーに邪魔される
船舶 × △〜〇割と自由時代が進むと性能が上がる、石油系とその他に分かれていることが多い
鉄道 △〜〇△〜〇厳しい 時代が進むと性能が上がる
航空機 × 自由 使用可能になる年代が遅い

各輸送手段の違いは上記の通りです。トラックは1850年代は遅いし輸送力も低いですが、時代が進むと割と万能になります(スピードが速く「すべての貨物」が積める)。ただし道路の他の車(マイカー、バス)により、邪魔される点には注意しないといけません。

個人的なオススメは、鉄道とか船舶とか癖の強いものに挑む前に、1950年(良いトラックが使える)開始で、トラックを使った輸送の仕方を色々試すことです。ストレスも少ないし、慣れるのも早いと思います。キャンペーンの最初の方をやってみるのも一興ですね。

輸送開始

購入したトラックを、先ほど作成した路線に配備すると、木材の輸送が開始されます。森の近くのトラック駅を眺めると、木材がどんどん積まれていく様子が見えるはずです。


トラック配備の手順

無事、車両の配備まで成功したら、こんな風になるはずです。


トラック配備の手順

上記はトラック1台だと寂しいので、トラックを10台ほど同じ路線に配備した状態です。せっせと働くトラックを眺めるのは楽しいですよね。

うまくいかない?

森のトラック駅に何もなく、トラックの積み荷がずっと空っぽの場合は、下記をチェックしてみてください。製材所側のトラック駅には何もないのが正しいです。

  • 施設と道路の接続ができていない
  • トラック駅が施設から遠すぎる

このゲームの特徴として「生産施設は、消費施設へ貨物の運送経路が確立するまで稼働しない」という点があります。さすが輸送ゲームらしい仕様ですね。

  • 施設間の道路を引く、もしこれがダメだと「路線が作成できない」「車がやたら遠回りする」
  • 施設と道路を繋げる、もしこれがダメだと「貨物がトラック駅に来ない」
  • トラック駅を道路に繋げる、もしこれがダメだと「路線が作成できない」
  • 適切な路線を作成する、もしこれがダメだと「トラックが配備できない(配備先が出てこない)」
  • 適切な路線にトラックを配備する、もしこれがダメだと「道路にトラックが出てこない」「何も運送されない」

今回やったことは、上記の5つです。どれが欠けても生産施設は稼働しません。

編集者:すずき(2023/09/24 13:15)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年4月30日

Transport Fever 2初めの一歩 - その3

目次: ゲーム

昨日(2020年4月29日の日記参照)に引き続きTransport Fever 2の基本である、生産量について紹介します。画像をできるだけ使うようにしました。ゲームの雰囲気を感じてもらえたら嬉しいです。

生産量の概念は、私が最初に躓いたというか、一番訳の分からなかったところです。うまく説明できると良いんですけど。

生産施設と消費施設

Transport Fever 2のフリープレイで出現する生産者、消費者は5段階に分類できます。カテゴリの正式名がないため、私が適当に名付けています。間違っていたらごめんなさい。


生産施設と消費施設の相関図

図の見方を一応説明しておくと、食料加工プラントの場合、農場から「穀物」を2つ運ぶと、1つの「食料」が生産される、という風に見ます。生産がダントツで面倒くさいのは「商品」ですね。

経路がシンプルな「穀物」→「食料」にも罠があります。施設の生産キャパシティは基本的に最大400ですが、なぜか農場だけ200 しかありません。レベル最大の食料加工プラントで食料を400生産するには、穀物が800必要になりますから、農場4つから穀物を運ばなければなりません。

ちなみに…、「製油所」が2つ出てくるのは誤植ではありません。「製品」工場が「商品」を作るのも、「工場」と「プラント」が混ざっているのも誤植ではありません。Transport Fever 2の日本語はポンコツなので、突っ込み出すとキリがないです。

中間、最終生産のレベル

中間と最終生産を担う工場にはレベルがあり、生産上限がレベルで決まります。レベルは各施設をクリックすると出てくる概要に表示されています。


製材所はレベル1、森(一次生産)はレベルがない

ただまあ、工場のレベルを上げるぞ!!と思って上げることはあまりなくて「たくさん原料を運び込んで」「生産したものを全部消費」しているうちに、勝手に上がっていることが多いです。

生産と消費の条件

生産と消費がTransport Fever 2で一番わかりにくい概念だと思います。生産施設は常に「必要とされた分」しか作りません。私は最初、この概念が全く分かりませんでした。

先日作った経路で説明しましょう。森から製材所への運送経路を1つだけ作りました。生産(森)と消費(製材所)の関係はこうなります。


製材所と森の消費・生産の関係

基本的に消費側(製材所)の要求数 = 生産側(森)の生産数(2番目の「輸送」の数字)になります。正確に言えば、下記のロジックで決まります。

  • 板を作るのに、木材は2つ必要 -- (A)
  • 消費側(製材所レベル1)の生産上限は、板200個/年 -- (B)
  • 製材所は経路が繋がっている生産側(森)「全て」に「合計」(A) x (B) = 2 x 200 = 400個/年の木材を要求
  • 森は要求された数(400個/年)を満たす木材を生産

消費側は繋がっている生産側「全て」に要求するというのが、わかりにくいんですけど、結構大事です。

もし製材所レベル1に、森A、森Bを2つ繋いだとすると、森2つに対し「合計400の木材が要求」され、森の生産力が余ります。すると、森Aは100、森Bは300のように分散して生産し始めます。

このダイアログの情報は難しい部類ですが、日本語が完全に本当にポンコツです、全く説明になっていません。特に「輸送」を違う意味で2つ並べた人は何を考えているんでしょう?どう見てもおかしいでしょう??

路線の輸送力

これはわかりにくいというより、紛らわしい数字が表示されることが多いので、説明しておきます。トラック駅をクリックして、路線をクリックすると、路線の情報が表示されます。

ほとんど見ればわかる系の情報なのですが「割合」は注意が必要です。数字は路線の年間輸送力を意味しています。これもポンコツ翻訳のひとつですね……。

この路線は400の木材を森から製材所に運ぶために作ったことを思い出せば、400前後の輸送力にしておくと無駄がないことが分かると思います。


路線の情報

路線のコースを変えたり、トラックの種類や数を変更すると、すぐに年間輸送力の数字が変化します。例えばこの路線だと、トラックを1台から12台にすると、400くらいの値が表示されました。

しかしながら、この数字は実際の輸送力とかけ離れている場合があります。ある程度待つと、実情に近い値に補正されます。この補正がかなり劇的で、路線の変更直後は400だったのに、しばらく経つと480など大幅に増えたり、逆に激減したりすることが多々あり、気づかないうちに輸送力が不足したり、無駄になったりします。

ですから路線の輸送力を変更したときは、ちょっと時間をおいてから再チェックすることをお勧めします。

私の個人的な感覚では、トラックは最初の数字が低めに出る傾向(=後で増える)、鉄道と船舶は最初の数字が高めに出る(=後で減る)傾向があるように感じます。

編集者:すずき(2023/09/24 13:16)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年5月1日

Amazonでよくあること

Amazonでハンダごて一式を購入しました。

まず、ハンダが来ました。

次に、ハンダこて台、ハンダ吸い取り線が来ました。

肝心の、ハンダごてが来ません……(後日、ハンダごても届きました)。

Amazonは一括で注文できますが、発送元の違いで一括で発送されないことは良くあります。たまに不思議な順番で送られてきてちょっと面白いですよね。

メモ: 技術系の話はFacebookから転記しておくことにした。

編集者:すずき(2020/05/06 22:29)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年5月2日

ThinkPadと追加のGPU

今、使ってるノートPC(ThinkPad E480カスタムオーダー)には、Intelのグラフィクスと、Radeon RX 550が搭載されています。

Radeon RX 550はモバイル用としては結構強力で、主にゲームの時に助かっているのですが、Radeonを使ってゲームをしばらくやっていると、本体が触れないくらい熱くなり、しまいに熱暴走でクラッシュしてしまいます。

せっかくカスタムオーダーで追加したのに微妙な奴だな〜。

ドライバが挙動不審

このGPUはもうひとつ変なところがあって、デバイスマネージャでRadeon RX 550を「無効」にしてPCを再起動すると、冷却ファンが唸り続けます。

CPU利用率は極めて低いままにも関わらず、冷却ファンが全力稼働しているので、ファンの制御がおかしくなっているように思います。GPUの負荷を勘違いしているのだろうか?

プロセスを片っ端から終了させても収まらなかったところをみると、恐らくドライバが変なところにハマっている?のでしょうか。

デバイスを有効にするか、有効にしたあとに再度無効にすれば、CPUファンは静かになりますが、なんだか挙動不審ですよね……。

編集者:すずき(2020/05/06 23:40)

コメント一覧

  • hdkさん(2020/05/07 20:30)
    デスクトップ用のNVIDIA Quadro FX 1400は電源投入時から冷却ファンが全開稼働で、グラフィックスドライバーが読み込まれる(Windowsの起動中画面が切り替わるとか、FreeBSDでプロプライエタリドライバーを入れたXサーバーが起動するとか)までそのままだったと思います。ノートPCでGPU用冷却ファンが別に搭載されているのかどうかは知りませんが、別に搭載されているなら似たような話がありそうですね。
  • すずきさん(2020/05/08 15:23)
    結構、怖い制御に見えますね……。
    その世代の GeForce と Quadro って、ドライバがバグるとファンが回らなくなって、コアが焼けるやつでしたっけ?
  • すずきさん(2020/05/08 15:43)
    ちょっと調べたところ、コアが焼けると騒ぎになった GPU Killing Driver が、
    GeForce/ION Driver 196.75
    というバージョンで、その世代の GPU は GeForce GTX 280 辺りでした。

    2004, NV40/41/45(130nm): GeForce 6800 GT: Quadro FX 1400
    2006, G71(90nm): GeForce 7900 GTX
    2007, G84(80nm): GeForce 8600 GT
    2008, G92(65nm): GeForce 9800 GTX
    2008, GT200(65nm): GeForce GTX 280

    Quadro FX 1400 は GeForce でいうと GeForce 6800 くらいなので、結構前ですね。前からこういう制御なのか……。怖い作りだなあ。
open/close この記事にコメントする



2020年5月4日

C言語のマクロ

目次: C言語とlibc

C言語のマクロによる置換を、循環参照させたらどうなるでしょう?

循環するマクロ定義

A B C D
#define A B
A B C D
#define B C
A B C D
#define C A
A B C D

結論から言うと問題ありません。下記のような結果になります。

循環するマクロ定義、置換結果

A B C D

B B C D

C C C D

A B C D

4つ目の結果は、置換前のA B C Dと何も変わっていないように見えますが、実はそうではありません。下記のように定義するとわかります。

循環するマクロ定義、マクロによる置換結果を見やすくする

A B C D
#define A 1 B
A B C D 
#define B 2 C
A B C D 
#define C 3 A
A B C D
循環するマクロ定義、置換結果が見やすいはず

A B C D

1 B B C D

1 2 C 2 C C D

1 2 3 A 2 3 1 B 3 1 2 C D

4つ目の結果の「A」を例にとると、A -> B -> C -> Aと3回のマクロの置換が行われた結果、Aに戻っているわけです。#define A Bのマクロは1度しか適用されないようです。

C言語の仕様

C言語の仕様(C11 final draft (N1570) - 6.10.3.4 Rescanning and further replacementの第2項)を見ると、

2
If the name of the macro being replaced is found during this scan of the replacement list (not including the rest of the source file's preprocessing tokens), it is not replaced. Furthermore, if any nested replacements encounter the name of the macro being replaced, it is not replaced. These nonreplaced macro name preprocessing tokens are no longer available for further replacement even if they are later (re)examined in contexts in which that macro name preprocessing token would otherwise have been replaced.

(直訳)
2
置換されるマクロの名前がreplacement listのスキャン中に見つかった場合(ソースファイルの残りの前処理トークンは含まれません)、そのマクロは置換されません。 さらに、入れ子になった置換が、置換されているマクロの名前に遭遇した場合、それは置換されません。 後にそのマクロ名の前処理トークンが置換されていたであろうコンテキストで(再)検査されても、これらの置換されていないマクロ名の前処理トークンはそれ以上の置換はできなくなります。

正直言って何言ってんだお前……?って感じがしますけども、平たく言うと同じマクロを2回適用しない、ように読めます。

複雑版

下記のように同じマクロで何度も置換できそうなマクロを定義してみます。

循環するマクロ定義、より複雑版

#define A B C
#define B C A
#define C A B
A B C D
循環するマクロ定義、より複雑版、結果

A B A A C A B C B B A B C A C C B C D

1つ1つのトークンがどのマクロで展開されているか図示します。


循環するマクロ定義、展開の様子

複雑に見えますが、どのトークンを見ても同じマクロを2回適用されたものはないことがわかります。

関数型マクロの謎

しかし関数型マクロの場合は、不思議な挙動を示します。

循環する関数型マクロ定義

#define F(a) a G
#define G(a) a F(a)

F(7)(8)(9)
循環する関数型マクロ定義、結果


7 8 8 G(9)

展開の様子は下記のようになると思われますが、


循環する関数マクロ定義、展開の様子

どうして7 8 8 G(9) で展開が終わるのかが良くわかりません……。マクロF(a) を2回適用しない、というルールならば、7 8 F(8)(9) で止まらなければおかしいように思いますが、結果を見るとなぜかF(8) も展開されています。

編集者:すずき(2023/02/04 20:17)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年5月5日

プレーヤー人口が増えるのは良いことだ

Splatoon 2のガチマッチ(Cランク)の難易度が下がった気がします。

1〜2か月前は、20kill対0killで負けたり、1分でノックアウトされたり、超フルボッコで負けまくるのが当たり前で、すっかりやる気がなくなっていましたが、今日久しぶりにやったら一度も負けず、あっさりC+ ランクになりました。

アクションゲームの腕は1か月やそこらで急に上達しないので、私が上達したというよりも、絶対勝てないおかしいレベルのプレーヤーとマッチする割合が減った、そんな感じです。

Stay Homeとかゴールデンウイークとかで、Splatoon 2のプレーヤー人口が盛り返して、初心者クラス(C-〜C+ ランクあたり)に合う人が増えたんじゃないかと推測しています。

最初からこのくらいの難易度だったら、ガチマッチ嫌いにならずに済んだんですけど、すっかりガチマッチ嫌いになってしまった(レギュラーマッチは好き)ので、もう遅いんだよな〜……。

編集者:すずき(2020/05/06 23:21)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年5月8日

RISC-Vのgas

目次: RISC-V

マクロの名前にTypoと思しきものがあったので、riscv-binutils-gdb(サイトへのリンク)にPull Requestをしてみました。

RISC-V向けのgasの実装では、命令に対応した名前のマクロがあります。

命令の名前とマクロの名前の関係

//opcodes/riscv-opc.c

//通常は命令の名前からドットを除いて、大文字にした名前
//    vadd.vv -> MATCH_VADDVV

{"vadd.vv",    0, INSN_CLASS_V,  "Vd,Vt,VsVm", MATCH_VADDVV, MASK_VADDVV, match_opcode, 0 },
{"vadd.vx",    0, INSN_CLASS_V,  "Vd,Vt,sVm", MATCH_VADDVX, MASK_VADDVX, match_opcode, 0 },
{"vadd.vi",    0, INSN_CLASS_V,  "Vd,Vt,ViVm", MATCH_VADDVI, MASK_VADDVI, match_opcode, 0 },


//Reduce系の命令だけ名前が違う
//    vredsum.vs -> MATCH_VREDSUMV"S" のはずなのに、MATCH_VREDSUMV"V" になっている

{"vredsum.vs", 0, INSN_CLASS_V, "Vd,Vt,VsVm", MATCH_VREDSUMVV, MASK_VREDSUMVV, match_opcode, 0},

パッチの中身は簡単で、ベクトル命令の一部で、命令の名前とマクロの名前が違っていたので修正しただけです。この手の間違いがいくつあるか分からなかったので、ちょっとしたPythonスクリプトを書いてチェックしました。

マクロの名前チェックに使ったスクリプト

#!/usr/bin/python

import re
import sys

fname = sys.argv[1]
f = open(fname, 'r')

line = f.readline()
while line:
	if not line.startswith('{"'):
		line = f.readline()
		continue;
	line = line.strip().replace('}', '')
	line = re.sub('\{"([^,]*)",', r'\1,', line)
	line = re.sub('".*",', '', line)
	line = re.sub(' *', '', line)
	items = line.split(',')

	insnOrg = items[0]
	insn = items[0].upper()
	classInsn = items[2]
	matchInsn = items[3]
	maskInsn = items[4]
	aliasInsn = items[6]
	if not classInsn.startswith('INSN_CLASS_V'):
		line = f.readline()
		continue;
	if not matchInsn.startswith('MATCH_') or not maskInsn.startswith('MASK_'):
		line = f.readline()
		continue;
	if aliasInsn.startswith('INSN_ALIAS'):
		line = f.readline()
		continue;

	insn = insn.replace('.', '')
	matchInsn = matchInsn.replace('MATCH_', '')
	maskInsn = maskInsn.replace('MASK_', '')
	if matchInsn != maskInsn:
		print("MATCH != MASK: {:s} != {:s}".format(matchInsn, maskInsn))
	if insn != matchInsn:
		print("INSN != MATCH: {:s} != {:s}".format(insnOrg, matchInsn))
	line = f.readline()

条件を適当に継ぎ足して書いたのと、Pythonの経験値が低いのが相まって、エレガントさの欠片もないですね。仕方ない。実行結果はこんな感じです。

マクロの名前チェックに使ったスクリプト
$ ../checker.py opcodes/riscv-opc.c

INSN != MATCH: vzext.vf2 != VZEXT_VF2
INSN != MATCH: vsext.vf2 != VSEXT_VF2
INSN != MATCH: vzext.vf4 != VZEXT_VF4
INSN != MATCH: vsext.vf4 != VSEXT_VF4
INSN != MATCH: vzext.vf8 != VZEXT_VF8
INSN != MATCH: vsext.vf8 != VSEXT_VF8
INSN != MATCH: vredsum.vs != VREDSUMVV
INSN != MATCH: vredmaxu.vs != VREDMAXUVV
INSN != MATCH: vredmax.vs != VREDMAXVV
INSN != MATCH: vredminu.vs != VREDMINUVV
INSN != MATCH: vredmin.vs != VREDMINVV
INSN != MATCH: vredand.vs != VREDANDVV
INSN != MATCH: vredor.vs != VREDORVV
INSN != MATCH: vredxor.vs != VREDXORVV
INSN != MATCH: vwredsumu.vs != VWREDSUMUVV
INSN != MATCH: vwredsum.vs != VWREDSUMVV
INSN != MATCH: vfredosum.vs != VFREDOSUMV
INSN != MATCH: vfredsum.vs != VFREDSUMV
INSN != MATCH: vfredmax.vs != VFREDMAXV
INSN != MATCH: vfredmin.vs != VFREDMINV
INSN != MATCH: vfwredosum.vs != VFWREDOSUMV
INSN != MATCH: vfwredsum.vs != VFWREDSUMV
INSN != MATCH: vcompress.vm != VCOMPRESSV

明らかにTypoに見えるのはvred/vfred/vcompress系の命令で、vsとvvを取り違えています。

微妙なところなのはvzextです。他はドットを除いた名前なのに、vzextだけドットをアンダースコアに置換した名前です。ルールに一貫性が無いだけか、Typoか、どちらとも言い難いため、今回出したPull Requestでは修正していません。

Pull Request受け付けてるのかな?

リポジトリを見ていてちょっと気になったのはSiFiveの人以外、変更がほとんどないことです。著名プロジェクトでは珍しいです。もしかするとGitHubでPull Requestを受け付けてない(※1)可能性があります。

変更を提案するのはここじゃないとか、そもそも変更は受け付けてませんとか、何でも良いので反応があると嬉しいですね、週明けまで待ちましょうかね……。

(※1)本家および開発の場がGitHub以外に存在していて、GitHubをミラーにしているプロジェクトの場合、GitHub上で何か言っても無視されることがあるようです。

編集者:すずき(2023/09/24 13:12)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年5月9日

Kindle for PCはダウンロードが遅い?

目次: Kindle

KindleのアプリはKindle Fire版、Android版、PC版など、いくつか種類があります。普段使っているのはKindle FireとKindle for PCです。どうもKindle for PCのダウンロードが遅い気がします。

Kindle Fireも決して速いとは思いませんが、大抵はマンガ1冊が1〜2分でダウンロードできているので、5Mbpsくらいは出ているんじゃないかと思います。

Kindle for PCはかなり遅い(1〜2Mbpsくらい、日によって違う)です。同じネットワークを使っているのに、差が出るものですかね?PC向けだけ帯域ケチるとか、そんな面倒なことしないよなあ?うーん?

Kindleアプリの動きがまた変わったけど、いつもどこかがダメ

Kindle Fire HDのアプリはたまにアップデートされて動きが変わります。今年の頭くらいだったか?覚えてないですけど、また動作が変わりました。

良くなったところ
フィルター「すべて」を選択したとき、本が多すぎると、数十秒フリーズしたり、アプリがクラッシュするバグが直ったこと
悪くなったところ
本のグループが意図せず表示されてしまうバグが埋め込まれたこと

新たなバグは再現率100%です。再現方法も簡単です。

  • ホーム → 「本」のタブ → すべての本を表示、をタップ
  • 本の一覧が表示される
  • グループ化された本をタップ(マンガの1〜最新巻までをグルーピングする機能)を選択
  • ホームボタンでホームへ → 「本」のタブ → すべての本を表示、をタップ
  • 先ほど見ていたグループ化された本が表示される(バグ)

この順に操作したとき、本来は本の一覧が出なければなりませんが、グループ化された本が再表示されてしまいます。明らかにバグってます。

このバグは、ユーザー側の操作で回避可能です。

  • グループ化された本が意図せず表示される(バグ)
  • ホームボタン「ではなく」戻るボタンでホームに戻る
  • もう一度、すべての本を表示、をタップ
  • 本の一覧が表示される

ユーザーの操作に影響が出るバグですし、テスターに触らせたら数分で見つけそうなのにね?KindleってUIのテストしてないのかなあ??

編集者:すずき(2021/12/08 03:49)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年5月10日

Pythonの変なAPI

Pythonの文字列置換は "string".replace() ですが、正規表現ライブラリreだと、なぜかre.sub() です。同じ機能なのに、APIの名前も、引数の指定順序も違います。どうしてこうなった。

改定の度に魔界化するC/C++ に比べると、Pythonは明瞭に思えます。とはいえPythonも何だかんだ長い歴史ですし、祓いきれない闇があるんでしょうねえ。

メモ: 技術系の話はFacebookから転記しておくことにした。

編集者:すずき(2020/05/13 21:44)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年5月11日

ヤマザキ春のパン祭り

今年のヤマザキ春のパン祭りは、2枚もゲットできました。


2020年、春のパン祭りの戦利品

去年は品川勤務かつコンビニ昼飯がメインだったので、ヤマザキパンを買う機会がほぼなく、お皿をもらえるほど点がたまりませんでした。今年はCOVID-19による在宅勤務で、近所のスーパーでパンを買う機会が大幅に増えたため、2枚も手に入ったわけです。在宅勤務の意外な効果です。

コンビニに行かない人にとっては意外かもしれませんが、コンビニはヤマザキパンをほとんど置いていません。自社のプライベートブランドのパンばかりです。10年位前は他社のパンも置いていたんですが、今やコンビニは9割方がプライベートブランドのパンです。

コンビニのプライベートブランドのパンは、大手メーカー(ヤマザキパン、敷島製パン、フジパンなど)が作っていますが、コストの都合か何だか知りませんが、味に劣る気がします。好みの問題なのかな……?

強化ガラス

パン祭りのお皿、裏側に何か書いてるなーと思って写真を撮ってみました。


お皿の裏の説明

ちょっと見づらいので文字に起こすと、

ARTICLE YAMAZAKI
MADE IN FRANCE

ZENMEN
BUTSURIKYOUKA
GARASU

「全面物理強化ガラス」ってローマ字で書いてありますね。フランス製なのに何でローマ字?フランス語で書かれても読めないから?

見ていて素朴な疑問が沸きました。あえて「全面」と強調する理由はなんでしょうね?皿のように厚みのない製品で「片面」物理強化ガラスにすることは可能?可能だったとしてもやる意味がある?

編集者:すずき(2020/05/13 23:29)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年5月12日

GCCを調べる - その9 - ベクトル型用マシンモードの追加

目次: GCC

以前(2020年3月27日の日記2020年3月28日の日記2020年3月29日の日記参照)ベクトルレジスタを扱えるようにした際に、下記の問題が残っていました。

  • 変数がintなのでsizeof(v) が4になる、ベクトルを扱いたい
  • 最適化オプションをO0にするとコンパイラがinternal errorを出す

1つ目の問題に取り組んでいきたいと思います。RISC-V 32の場合、intの変数は32bit整数のデータ型として扱われます。GCC内部の表現(RTL)ではSImodeというマシンモード(※)で表されます。他の大きさのデータ型を示すマシンモードも当然存在していて8, 16, 64bit整数はそれぞれBImode, HImode, DImodeで表されます。

普通の型に対応するモードはGCCが定義済みですが、ベクトル型を表すモードは標準では存在しないため、自分で新規に定義する必要があります。

(※)マシンモード(Machine Mode)については、GCC Internalsの14.6 Machine Modesに簡単な説明と標準的なモードの一覧が載っています。これによればSIはSingle Integerの略らしいです。変な名前だなあ。

マシンモードはどこにある?

以前(2020年3月14日の日記参照)説明したとおりですが、軽くおさらいすると、標準的なマシンモードはgcc/machmode.def、アーキテクチャ固有のマシンモードはgcc/config/arch/arch-modes.defにあります。例えばRISC-Vならgcc/config/riscv/riscv-modes.defです。

現在のところRISC-V固有のマシンモードは1つしか定義されていません。

riscv-modes.def

FLOAT_MODE (TF, 16, ieee_quad_format);

このファイルにベクトル型を表すマシンモードを追加します。

riscv-modes.defに追加したモード

VECTOR_MODE (INT, SI, 8);
VECTOR_MODE (INT, SI, 16);
VECTOR_MODE (INT, SI, 32);
VECTOR_MODE (INT, SI, 64);

とりあえず整数(INT, SI)が8, 16, 32, 64(それぞれ32, 64, 128, 256バイト)個連結されているデータ型を想定して作りました。ベクトル型を語る上では浮動小数点型も大事ですが、とりあえず今回は整数型のみを定義しています。

マシンモード追加できたかな

マシンモードを正しく追加できたか確かめる方法は色々あるのでしょうけど、個人的に簡単だと思うのは一旦ビルドしてしまう方法です。

GCCをビルドするとビルド用のディレクトリ(以降build_gccと呼びます)に、モードが全部書いてあるヘッダinsn-modes.hが生成されます。生成されたヘッダを検索すれば一発です。

モードが定義されているヘッダ

// gcc/build_gcc/insn-modes.h

enum machine_mode
{
  E_VOIDmode,              /* machmode.def:189 */
#define HAVE_VOIDmode
#ifdef USE_ENUM_MODES
#define VOIDmode E_VOIDmode
#else
#define VOIDmode ((void) 0, E_VOIDmode)
#endif
  E_BLKmode,               /* machmode.def:193 */
#define HAVE_BLKmode
#ifdef USE_ENUM_MODES
#define BLKmode E_BLKmode
#else
#define BLKmode ((void) 0, E_BLKmode)
#endif

...

  E_V32SImode,             /* config/riscv/riscv-modes.def:26 */
#define HAVE_V32SImode
#ifdef USE_ENUM_MODES
#define V32SImode E_V32SImode
#else
#define V32SImode ((void) 0, E_V32SImode)
#endif
  E_V64SImode,             /* config/riscv/riscv-modes.def:27 */
#define HAVE_V64SImode
#ifdef USE_ENUM_MODES
#define V64SImode E_V64SImode
#else
#define V64SImode ((void) 0, E_V64SImode)
#endif

...

新たなマシンモードV64SImode(SIが64個連結されたデータ型)が追加されたことがわかると思います。コメントにマシンモードの定義されている場所も書かれていて、とても親切です。

ほぼ全域に渡って意味不明コードだらけのGCCでは珍しい部類の、わかりやすさ&親切さです。自動生成コードには気を使っているんでしょうか?他のところもこれくらい親切だと嬉しいんですけどねえ。

編集者:すずき(2023/09/24 11:48)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年5月13日

ノートPCのファンがうるさい

ノートPC(ThinkPad E480)の冷却ファンが回り続けていてうるさいです。特に何かしている訳でもないのに、良い勢いでファンが回ってます。

ここ最近、ノートPCを酷使(ゲーム、在宅勤務など)したため、ファンに埃が詰まって、冷却能力が下がったか?と予想して、頑張ってThinkPadの裏蓋を開けました。しかし思ったほど汚れていません。

どうしてファンが回りっぱなしなんでしょう?純粋に冷却能力が足りないだけなんだろうか??

ThinkPadの裏蓋

ThinkPad E480の裏蓋はめちゃくちゃ開けにくいです。ネジ9か所と爪で止まっているので、ネジを緩めた後、マイナスドライバーでこじ開けるしかありません。

爪を外すとき、バキっ!ベキっ!というすごい嫌な音がします。案の定、ヒンジ付近(ノートPCとノートPCディスプレイが接続されている方)の爪が4か所ほど折れました。

せっかく裏蓋まで開けたにも関わらず、何も収穫がありませんでした。裏蓋を止める爪が4か所壊れただけです。相変わらずファンはうるせーし、嬉しくない結末です。
編集者:すずき(2020/05/14 00:24)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年5月16日

GCCを調べる - その10-1 - ベクトル型を使うとエラー(TARGET_VECTOR_MODE_SUPPORTED_P追加編)

目次: GCC

以前(2020年3月27日の日記2020年3月28日の日記2020年3月29日の日記参照)ベクトルレジスタを扱えるようにした際に、下記の問題が残っていました。

  • 変数がintなのでsizeof(v) が4になる、ベクトルを扱いたい
  • 最適化オプションをO0にするとコンパイラがinternal errorを出す

前回(2020年5月12日の日記参照)はベクトル型に向けてマシンモードを追加しました。引き続き、1つ目の問題に取り組んでいきたいと思います。

ベクトル型は基本型(SI, DI, SF, DFなど)が複数連結されているデータ型です。個数は2のべき乗(2, 4, 8, 16, ...)でなければなりません、3個や10個はダメです。型は通常GCCの実装で定義します。ベクトル型も当然同じでGCCの実装で定義しますが、ベクトル型はやや特殊で、GCCのattributeでも定義することができます。今回はattributeを使ってみます。

ベクトル型を使ったコード

typedef int __v64si __attribute__((__vector_size__(256)));

void _start()
{
	int b[100];
	__v64si v1;

	__asm__ volatile ("vlw.v %0, %1\n"
		: "=&v"(v1) : "A"(b[10]));
}

ベクトル型を使ってインラインアセンブラを書くとエラーが出ます。

ベクトル型を使うとimpossible constraintエラー
$ riscv32-unknown-elf-gcc -Wall -march=rv32gcv b.c -O2 -nostdlib -S

b.c: In function '_start':
b.c:7:2: error: impossible constraint in 'asm'
    7 |  __asm__ volatile ("vlw.v %0, %1\n"
      |  ^~~~~~~

このエラーは以前(2020年3月6日の日記参照)、register constraintに 'v' を追加したときに解析した部分で見ました。詳細は昔の日記を見ていただくとして、以前との差を示します。

エラーになる箇所

// gcc/recog.c

int
asm_operand_ok (rtx op, const char *constraint, const char **constraints)
{

...

	default:
	  cn = lookup_constraint (constraint);
	  switch (get_constraint_type (cn))
	    {
	    case CT_REGISTER:
	      if (!result
		  && reg_class_for_constraint (cn) != NO_REGS  //★★以前引っかかっていたのはこちら
		  && GET_MODE (op) != BLKmode        //★★今回はこちらの条件に引っかかる
		  && register_operand (op, VOIDmode))
		result = 1;
	      break;

新たなマシンモードV64SImodeを追加(2020年5月12日の日記参照)を追加したのに、どうしてBLKmodeが選択されてしまうのでしょう?

オプション --dump-tree-all --dump-rtl-allを付けて、BLKmodeが選ばれるタイミングを追うと、パスexpandが終わった時点でBLKmodeになっていました。

236r.expandの抜粋

(insn 26 7 10 2 (set (mem/c:BLK (plus:SI (reg/f:SI 99 virtual-stack-vars)  ★★mem/c:BLKになっている
                (const_int -1168 [0xfffffffffffffb70])) [1  A128])
        (asm_operands/v:BLK ("vlw.v %0, %1") ("=&v") 0 [
                (mem/c:SI (plus:SI (reg/f:SI 99 virtual-stack-vars)
                        (const_int -872 [0xfffffffffffffc98])) [1 b+40 S4 A64])
            ]
             [
                (asm_input:SI ("A") b.c:7)
            ]
             [] b.c:7)) "b.c":7:2 -1
     (nil))

パスexpandはGIMPLEからRTLという中間表現に変換するパスです。RTLに変換した直後からBLKmodeですから、かなり最初の方からダメだってことがわかります。何が悪いかわからないのでexpand辺りのコードを探ってみます。

BLKmodeになる箇所

// gcc/cfgexpand.c

static void
expand_asm_stmt (gasm *stmt)
{

...

  for (i = 0; i < noutputs; ++i)
    {
      tree val = output_tvec[i];
      tree type = TREE_TYPE (val);
      bool is_inout, allows_reg, allows_mem, ok;
      rtx op;

...

      if ((TREE_CODE (val) == INDIRECT_REF && allows_mem)
	  || (DECL_P (val)
	      && (allows_mem || REG_P (DECL_RTL (val)))
	      && ! (REG_P (DECL_RTL (val))
		    && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type)))
	  || ! allows_reg
	  || is_inout
	  || TREE_ADDRESSABLE (type))
	{

...
	}
      else
	{
	  op = assign_temp (type, 0, 1);  //★★これ
	  op = validize_mem (op);
	  if (!MEM_P (op) && TREE_CODE (val) == SSA_NAME)
	    set_reg_attrs_for_decl_rtl (SSA_NAME_VAR (val), op);

	  generating_concat_p = old_generating_concat_p;

	  push_to_sequence2 (after_rtl_seq, after_rtl_end);
	  expand_assignment (val, make_tree (type, op), false);
	  after_rtl_seq = get_insns ();
	  after_rtl_end = get_last_insn ();
	  end_sequence ();
	}


// gcc/function.c

rtx
assign_temp (tree type_or_decl, int memory_required,
	     int dont_promote ATTRIBUTE_UNUSED)
{
  tree type, decl;
  machine_mode mode;
#ifdef PROMOTE_MODE
  int unsignedp;
#endif

  if (DECL_P (type_or_decl))
    decl = type_or_decl, type = TREE_TYPE (decl);
  else
    decl = NULL, type = type_or_decl;

  mode = TYPE_MODE (type);  //★★これ


// gcc/tree.h

#define TYPE_MODE(NODE) \
  (VECTOR_TYPE_P (TYPE_CHECK (NODE)) \
   ? vector_type_mode (NODE) : (NODE)->type_common.mode)    //★★これ


// gcc/tree.c

/* Vector types need to re-check the target flags each time we report
   the machine mode.  We need to do this because attribute target can
   change the result of vector_mode_supported_p and have_regs_of_mode
   on a per-function basis.  Thus the TYPE_MODE of a VECTOR_TYPE can
   change on a per-function basis.  */
/* ??? Possibly a better solution is to run through all the types
   referenced by a function and re-compute the TYPE_MODE once, rather
   than make the TYPE_MODE macro call a function.  */

machine_mode
vector_type_mode (const_tree t)
{
  machine_mode mode;

  gcc_assert (TREE_CODE (t) == VECTOR_TYPE);

  mode = t->type_common.mode;  //★★このモードはV64SImodeになる
  if (VECTOR_MODE_P (mode)
      && (!targetm.vector_mode_supported_p (mode)  //★★この判定文が偽になる
	  || !have_regs_of_mode[mode]))
    {
      scalar_int_mode innermode;

      /* For integers, try mapping it to a same-sized scalar mode.  */
      if (is_int_mode (TREE_TYPE (t)->type_common.mode, &innermode))  //★★256バイトのIntはないから、偽になる
	{
	  poly_int64 size = (TYPE_VECTOR_SUBPARTS (t)
			     * GET_MODE_BITSIZE (innermode));
	  scalar_int_mode mode;
	  if (int_mode_for_size (size, 0).exists (&mode)
	      && have_regs_of_mode[mode])
	    return mode;
	}

      return BLKmode;  //★★BLKmodeになってしまう
    }

  return mode;
}

条件式にあるtargetm.vector_mode_supported_p() がfalseのため、BLKmodeになってしまうようです。

編集者:すずき(2023/09/24 11:49)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年5月17日

GCCを調べる - その10-2 - ベクトル型への対応(TARGET_VECTOR_MODE_SUPPORTED_P追加編)

目次: GCC

前回(2020年3月27日の日記参照)の調査により、targetm.vector_mode_supported_p() がfalseを返すことが原因だとわかりました。この関数ポインタが指す先は、アーキテクチャターゲット(ARMとかi386とかriscvとか)ごとに違います。RISC-Vの場合は下記のようにすれば良いです。

vector_mode_supported_pの追加

// gcc/config/riscv/riscv.c

static bool
riscv_vector_mode_supported_p (machine_mode mode)
{
  if (TARGET_VECTOR)  //★★本当はmodeの値を確認したほうが良いが、今回は手抜き
    return true;

  return false;
}

...

#undef TARGET_VECTOR_MODE_SUPPORTED_P
#define TARGET_VECTOR_MODE_SUPPORTED_P riscv_vector_mode_supported_p

このtargetmもやや魔界感があるので、何でこのdefineで実装が切り替わるのか、についても調べたいところですね。それはさておいて、上記の実装を追加すると無事ベクトル型が使えるようになります。

追加後の236r.expandの抜粋

(insn 70 2 69 2 (set (reg:V64SI 105 [ v1 ])  ★★reg:V64SIになっている
        (asm_operands/v:V64SI ("vlw.v %0, %1") ("=&v") 0 [
                (mem/c:SI (plus:SI (reg/f:SI 99 virtual-stack-vars)
                        (const_int -360 [0xfffffffffffffe98])) [1 b+40 S4 A64])
            ]
             [
                (asm_input:SI ("A") b.c:7)
            ]
             [] b.c:7)) "b.c":7:2 -1
     (nil))

バイナリも正しく出力されます。sizeof(v1) も256が返されます。ちなみにアセンブルしなくても、オプション -Sでアセンブラを見てもほぼ同じです。

追加後のバイナリ
a.out:     file format elf32-littleriscv

Disassembly of section .text:

00010054 <_start>:
   10054:       7165                    addi    sp,sp,-400
   10056:       103c                    addi    a5,sp,40
   10058:       1207e007                vlw.v   v0,(a5)
   1005c:       6159                    addi    sp,sp,400
   1005e:       8082                    ret

良かった良かった。オプションO0の問題はまた今度です。

編集者:すずき(2023/09/24 11:49)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2020年5月18日

航空科学博物館を支援

Twitterで「収入ほぼゼロ」「来館者9割減」 危機に陥っている「航空科学博物館」がクラウドファンディングで支援募集 - ねとらぼ、の記事を目にしたので、微力ながら5,000円を支援しました。後で入場券が2枚送られてくるそうな。

100万円のコースはさすがに高すぎなのか支援者がまだ現れていませんが、30万円のコースは3人ほど支援者がいました。愛されていますね。

公営の博物館(公益財団法人 航空科学博物館)は、国や自治体が支援するのが筋だろう、という意見も目にしましたし、言い分はわかるんですが、うだうだ言っている間に潰れてしまっては元も子もないです。クラウドファンディングで助けを求めるのは良い手段だと思います。

編集者:すずき(2020/05/23 02:56)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2020年4月21日 >>> 2020年5月18日
link もっと後

管理用メニュー

link 記事を新規作成

<2020>
<<<04>>>
---1234
567891011
12131415161718
19202122232425
2627282930--

最近のコメント5件

  • link 24年6月17日
    すずきさん (06/23 00:12)
    「ありがとうございます。バルコニーではない...」
  • link 24年6月17日
    hdkさん (06/22 22:08)
    「GPSの最初の同期を取る時は見晴らしのい...」
  • link 24年5月16日
    すずきさん (05/21 11:41)
    「あー、確かにdpkg-reconfigu...」
  • link 24年5月16日
    hdkさん (05/21 08:55)
    「システム全体のlocale設定はDebi...」
  • link 24年5月17日
    すずきさん (05/20 13:16)
    「そうですねえ、普通はStandardなの...」

最近の記事3件

  • link 24年4月12日
    すずき (07/05 10:40)
    「[台湾東部沖地震に寄付] ささやかではありますが台湾東部沖地震に寄付しました。日本の赤十字社→台湾の赤十字(正式名称...」
  • link 24年4月16日
    すずき (07/05 10:40)
    「[Zephyr SDKのhosttoolsは移動してはいけない、その2 - インストール時のバイナリ書き換え] 目次: Zep...」
  • link 24年4月17日
    すずき (07/05 10:39)
    「[VSCodeとMarkdownとPlantUMLのローカルサーバー] 目次: LinuxVSCodeのPlantUML Ex...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 07/05 10:40