taki のすべての投稿

【クラフトピア】鉱石無限生産機構

やっぱりどの世界でも鉄は大量に必要。

なので、鉄無限生産機構です。

まずは平べったい鉱石がある場所を見つけます。

そこに掘削機を設置します。

そうすると、鉄鉱石を吐き出してくれるので、これをキャッチする感じでコンベアーを設置します。

吐き出す方向は常に同じみたい。

それを自動炉に流し込みます。

自動炉には操作できる箇所が二つあって、

一つは自動炉のチェスト、コンベアーで流し込まれたアイテムが入ります。

自分でアイテムを入れることもできます。

もう一つは生成するアイテムを設定するところ。

ここで設定したアイテムの材料がコンテナ内にあれば、アイテム(インゴット)を生成してくれます。

生成されたアイテムは後ろのコンベアーから流れてくるので、そこにコンテナを接続します。

これで鉄を自動的に掘削し、インゴットを精製してコンテナに入れてくれる装置が完成しました。

鉄無限生産機構の完成です。

この仕組みをもう一組作り、銀も無限生産機構化しました。

あとは、砂無限も欲しいな。

【ラズパイ】プログラムからカメラで動画撮影する。

今回はさらにxキーで動画撮影開始・停止を行います。

プログラムはこのようになりました。

from datetime import datetime
import cv2, os

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')


def main():

  if cap == None:
    return False

  out = None
  capture = False

  while cap.isOpened():
    # カメラから映像を読み込む
    _, img = cap.read()

    cv2.imshow("preview", img)

    if capture:
      if out != None:
        out.write(img)

    key = cv2.waitKey(1)
    if key == ord('z'):
      cv2.imwrite("test.png", img)
    if key == ord('x'):
      if not capture:
        capture = True
        out = cv2.VideoWriter('test.avi',fourcc, 20.0, (640,480))
      else:
        capture = False
        out.release()
        out = None
    elif key < 255:
      break

  # 事後処理
  cap.release()
  if out != None:
    out.release()
  cv2.destroyAllWindows()

if __name__ == '__main__':
  main()
  

今回は新しくVideoWriter_fourcc()というのが出てきました。

引数の文字列は動画コーデックを示しているみたいです。

よく分からんけど。

まぁ、結局はこのコードをコピペして使うんだー

※ちなみに、プログラムをブログに書いたり、gitHubにあげているのは、就職して職場内に行ったとしてもコピペして使えるようにするためです。

VideoWriter()をつかって動画に保存するためのオブジェクトを作成します。

引数は、動画ファイル名、上のfourCC、フレームレート(fps)、解像度です。

オブジェクトを作成したら、フレームデータをこのオブジェクトにwrite()で書き込むだけです。

今回はxキーで録画開始・停止を行うので、xキーオンオフでオブジェクトを作成・解放を操作しています。

次回はいよいよリモートやってみようかな

【クラフトピア】発電して電池を獲得。

夢中になって何時間でもプレイできる。

発電機を設置して、そこに捉えた動物を出現させると、車輪のなかを走って発電し、電池を獲得できます。

自分で走って発電もできるようになったみたいです。

電池とバイオメタノールは自動機構化するには絶対に必要になるアイテムなので、大量に生み出せる機構があれば良いんですけどね。

何か旨い方法は無いだろうか。

あ、ちなみにバイトメタノールは醸造所で小麦粉から作成できます。

なので、大量に小麦を作る必要があります。

まぁ、機構としては簡単ですが、麦農場とスプリンクラーがあれば、回収するだけで無限に小麦を獲得できます。

回転のこぎりがあれば自動回収もできるみたいですが。

ただ、回転のこぎりは別名殺戮マシーンとも呼ばれているので、ちょっと使うのにはためらいがあります。

アップデートのおかげなのか、無限繁殖機構、上に積み上がらなくなったのですが、増えすぎてゲームが重くなってしまいました。

増やすのは良いけれども適度に処理させる必要がありますね。

まぁ、余った肉などは売ってお金に換えれば良いので。

【バズレシピ】レンジでマーボーカレー

レシピはこちら。

今回はちゃんと大さじ小さじのスプーンを購入したので、きちんと分量計りました。

これはカレーだ。

うまい!

そしてめっちゃ辛い!

そりゃそうだ、カレーの辛さにプラスしてラー油と一味唐辛子が入っているから。

汗がドバッと噴き出ました。

でも旨い。

こんな旨いものをレンジで簡単にできちゃうから、本当にリュウジさんはすごい。

これはリピートありだね。

【ラズパイ】プログラムからカメラの画像を保存する

前回までの状況はこちら。

前回はカメラの画像を表示させていただけですが、

今回はこの画像をファイルに保存します。

例えば、zキーを押すことで画像をファイルに保存することにします。

プログラムはこうなります。

from datetime import datetime
import cv2, os

def main():

  cam = cv2.VideoCapture(0)
  if cam == None:
    return False

  while True:
    # カメラから映像を読み込む
    _, img = cam.read()

    cv2.imshow("preview", img)

    key = cv2.waitKey(1)
    if key == 122:
      cv2.imwrite("test.png", img)
    elif key < 255:
      break

  # 事後処理
  cam.release()
  cv2.destroyAllWindows()

if __name__ == '__main__':
  main()

cv2.waitKey(1)が122というのは、押したキーがzキーだったと言うことを示しています。

画像ファイルに保存する場合はimwrite()を使ってフレームデータとファイル名を渡すとカレントディレクトリに指定ファイル名で保存されます。

【ダイエット支援】今後の機能追加について

一通り食事管理機能は完成したのですが、

正直、いまいち使いづらいです。

数値を毎回入力しなければならないので。

過去に入力したデータを再利用できないかな、と思っているのですが、

調べてみると、HTMLのinputタグにはtype=searchというものがありまして、

                                <input type="search" v-model="contents.item" autocomplete="on" list="keyword"/>
                                <datalist id="keyword">
                                    <option value="札幌" />
                                    <option value="札駅" />
                                    <option value="新さっぽろ" />
                                    <option value="東札幌" />
                                    <option value="札束" />
                                </datalist>

こんな感じでautocomplete=”on” list=”キーワード”と記入すると、

こんな感じでdatalistタグのid=”キーワード”の内容が入力候補として表示されます。

これをうまく使えないかと。

品名の一部を入力→入力履歴を検索→候補を表示→履歴からデータを入力

という感じで、うまく処理できないかと思っています。

データベース

本来なら栄養素情報を別テーブルにしてそれを参照するという、正規化が必要なのだと思いますが、

いまからデータベースに変更を入れるのは、既存機能の大規模改修が発生(めんどくさい)ので、

それはそのままに、履歴検索用のテーブルを用意することにします。

それがあれば、入力履歴検索用のAPIを作成すれば行けるような気がします。

UI

datalistの中のoptionタグがv-forでリストを反映させることができると思います。

ただ、大量のoptionが画面に表示されても鬱陶しいので、例えば、検索結果が10件以上だったらあえて表示させない、というのも、一つの手かもしれません。

とりあえず、こんな方針でやってみますか。

次回から着手します。

【Cocos2d-x】画像を使用する

今回は画像を使ってみます。

画像はスプライトと呼ばれる単位で扱われます。

例えば、ただ画面に画像を表示する場合は、

bool SampleScene::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Scene::init() )
    {
        return false;
    }

    auto visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    // add "HelloWorld" splash screen"
    auto sprite = Sprite::create("pipo-charachip001b.png");
    if (sprite == nullptr)
    {
        problemLoading("'pipo-charachip001b.png'");
    }
    else
    {
        // position the sprite on the center of the screen
        sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

        // add the sprite as a child to this layer
        this->addChild(sprite, 0);
    }
    return true;
}

画像をResources/res配下に設置し、

Sprite::create(“[画像ファイル名]”)スプライトの作成。

setPosition()で表示位置を決めてaddChild()でスプライトを設置すれば表示されます。

でも大抵は一枚の絵の中にいくつものパーツがまとめられているのが普通です。

なので、画像をクリッピングして、一部だけを表示させます。

    // add "HelloWorld" splash screen"
    auto sprite = Sprite::create("pipo-charachip001b.png", Rect(0,0,32,32));
    if (sprite == nullptr)
    {
        problemLoading("'pipo-charachip001b.png'");
    }
    else
    {
        // position the sprite on the center of the screen
        sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

        // add the sprite as a child to this layer
        this->addChild(sprite, 0);
    }

    auto sprite2 = Sprite::create("pipo-charachip001b.png", Rect(0,32,32,32));
    if (sprite2 == nullptr)
    {
        problemLoading("'pipo-charachip001b.png'");
    }
    else
    {
        // position the sprite on the center of the screen
        sprite2->setPosition(Vec2(visibleSize.width/2 + origin.x + sprite->getContentSize().width, visibleSize.height/2 + origin.y));

        // add the sprite as a child to this layer
        this->addChild(sprite2, 0);
    }
    return true;

じゃあ、これを使って、アニメーションさせます。


    auto sprite = Sprite::create("pipo-charachip001b.png");
    if (sprite == nullptr)
    {
        problemLoading("'pipo-charachip001b.png'");
    }
    else
    {
        // position the sprite on the center of the screen
        sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

        // add the sprite as a child to this layer
        this->addChild(sprite, 0);
    }

    Vector<SpriteFrame*> animFrames;
    animFrames.reserve(12);
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(0,0,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(32,0,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(64,0,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(0,32,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(32,32,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(64,32,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(0,64,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(32,64,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(64,64,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(0,96,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(32,96,32,32)));
    animFrames.pushBack(SpriteFrame::create("pipo-charachip001b.png", Rect(64,96,32,32)));

    Animation* animation = Animation::createWithSpriteFrames(animFrames, 0.1f);
    Animate* animate = Animate::create(animation);

    sprite->runAction(RepeatForever::create(animate));

    auto moveBy = MoveBy::create(2, Vec2(50, 0));
    sprite->runAction(moveBy);

    return true;

SpriteFrameを組み合わせてAnimationを作成し、それからAnimateを作成します。

これからアクションを作成して、実行させます。

なかなか良い感じじゃないですか?

やっぱりハイスペックである必要は無いということ。

Pixel3からPixel4aに乗り換えたのですが、

非常に快適に動作しております。

Pixel3で動いていたアプリはほとんど動きますし、

最近始めた、戦国RENKAも問題無く動いております。

こういった3Dゲームでも問題ありません。

Pixel3のプロセッサーはSnapdragon 845であるのに対して、

Pixel4aのプロセッサーはSnapdragon 730Gです。

8XX番代はハイエンドプロセッサーにつけられる番号で、

7XX番代はミドルレンジプロセッサーにつけられる番号です。

この下には6XX番代もあり、これは低価格帯のスマホで使用されているプロセッサーです。

845と730Gは730Gの方が一世代新しいのですが、ハイエンドの845よりも快適に動いているように感じます。

おそらく、これはメモリ容量の差だと思うんですが、

それを考えると、いままではハイエンドの性能を生かし切れていなかったような気がしています。

やっぱり一般人にはハイスペックなんて必要なかった。

性能を生かし切れていない高い端末を買うよりも、安価でそこそこ動く端末の方がお買い得だと思いませんかね?

そう考えると、Pixel4aのコスパは最強で、低価格スマホで失敗するよりは、多少お金を積んでもPixel4aを勧めます。

ほんと、欠点は防水じゃ無いぐらいしか見つからない。

歩きすぎて足が痛い

こないだの土曜日、

時間があるから、病院(中央図書館付近)からすすきのまで歩いて帰り(この時点ですでに10000歩)

その日の午後、何を思ったか散歩に出かけ、

20000歩オーバーしました。

そのせいか、昨日から足が痛いです。

痛いというか、左足に違和感がある感じです。

骨じゃ無いんだろうな、筋肉なんだろうな。

昨日はそれでも散歩に出かけて、足が痛くなって途中でリタイア。

今日は大人しく自宅で足を休ませています。

散歩の途中で見つけたキノコとアサヒビール園のジンギスカン。

沢山食ったけど、思ったより体重増えてなかった。