mieki256's diary



2023/09/05(火) [n年前の日記]

#1 [hsp] 疑似3D道路その2

_昨日 の続き。HSP 3.6 を使って、疑似3D道路が作れないか試しているところ。

カーブを実装したいのだけど、何をどうしたらいいのやら。とりあえず、セグメントなる概念でデータテーブルを用意しないとカーブにしろ丘にしろ表現しづらい感じがしてきたので、まずはセグメントの形で道路のデータを持てないか試している。

配列変数の初期化について :

HSP は配列変数の初期化をする際に、カンマ区切りでずらずらと数値を書けないようで…。以下のような書き方になってしまう。
    dim a, 5, 3
    a(0, 0) = 20        ; count
    a(0, 1) = 0         ; curve
    a(0, 2) = 0         ; pitch
    a(1, 0) = 30
    a(1, 1) = 10
    a(1, 2) = 0
    a(2, 0) = 20
    a(2, 1) = -10
    a(2, 2) = 0
    a(3, 0) = 20
    a(3, 1) = 0
    a(3, 2) = 2
    a(4, 0) = 20
    a(4, 1) = 0
    a(4, 2) = -2
このへんどうにかならんのか。

マクロを書いて、多少は見た目を改善する方法はあるっぽい。

_配列変数の連続代入について - HSPTV!掲示板
#define set_array(%1, %2,  %3, %4, %5) \
  %1(%2, 0) = %3 :\
  %1(%2, 1) = %4 :\
  %1(%2, 2) = %5 :

set_array a, 0, 20, 0, 0
set_array a, 1, 30, 10, 0
set_array a, 2, 20, -10, 0
set_array a, 3, 20, 0, 2
set_array a, 4, 20, 0, -2

配列の中にdoubleを混ぜたい :

配列変数の中に int と double を混在させたいのだけど、エラーが出てしまった。

double だけを列挙するのであれば、ddim を使えるようだけど…。ddim を使うと、int が記述できなくなる。

仕方ないので、double として使いたい数値は、100倍して int として入れておくことにした。取り出す際に、double(a(0, 0)) * 0.01 とでもすれば、double として扱えなくもないだろう…。

考えてみたらアセンブラで書いてた頃は、256倍なり65536倍なりして固定小数点で色々やってたので、そういう書き方をすればいいのかな。でも、この時代ににそんな書き方はしたくない…。

2022/09/05(月) [n年前の日記]

#1 [prog][windows] GDI+でpng画像を読み込んで描画

Windows10 x64 21H2上で、C/C++ と Windows APIを使って画像を描画する実験をしているところ。Windows API (GDI?)ではbitmap画像しか扱えないけれど、Windows XP から使えるようになった GDI+ なるものを使えばpng画像も扱えるという話を見かけたので試してみた。

環境は、Windows10 x64 21H2 + MinGW (g++ 9.2.0)。MSYS2 + MinGW-w64 ではなく、MinGW (+ MSYS) を使ってコンパイルしている。

ちなみに、GDI+ を使う場合は C++ を使うことになるらしい。

pngファイルを読み込む版。 :

まずは、実行ファイルと同じディレクトリに置いてある png ファイルを読み込んで、描画する処理を試してみた。以下のサンプルや解説を参考にさせてもらった。

_GDI+入門
_GDI+でBMP/PNG/JPEGの読み込みを簡単に | 株式会社ヘキサドライブ


_01_gdiplus01.cpp
#define WINVER          0x0501      // 0x0501 = WindowsXP
#define _WIN32_WINNT    0x0501

#include <windows.h>
#include <gdiplus.h>
using namespace Gdiplus;

#pragma comment(lib, "user32.lib")
#pragma comment(lib, "gdiplus.lib")

#define SCRW 512
#define SCRH 512

#define TM_COUNT1 1
#define FPS    60

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;
  static Image *img;
  static Image *bg;
  static Graphics *g;
  RECT rect;

  static float x, y, dx, dy;
  static int wdw_w, wdw_h;

  switch (uMsg)
    {
      case WM_CREATE:
        // get window size
        GetClientRect(hWnd, &rect);
        wdw_w = rect.right - rect.left;
        wdw_h = rect.bottom - rect.top;

        img = new Image(L"test.png");
        bg = new Image(L"bg.png");

        // int work
        x = (float)(wdw_w / 2);
        y = (float)(wdw_h / 2);
        dx = (float) wdw_w / (float)FPS;
        dy = dx * 0.7;

        SetTimer(hWnd, TM_COUNT1, (int)(1000 / FPS), NULL);
        break;

      case WM_TIMER:
        // main loop
        x += dx;
        y += dy;

        if (x <= 0 || x + img->GetWidth() >= wdw_w) dx *= -1;

        if (y <= 0 || y + img->GetHeight() >= wdw_h) dy *= -1;

        InvalidateRect(hWnd, NULL, TRUE);
        // InvalidateRect(hWnd, NULL, FALSE);
        break;

      case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        g = new Graphics(hdc);

        g->DrawImage(bg, 0, 0, bg->GetWidth(), bg->GetHeight());
        g->DrawImage(img, (int)x, (int)y, img->GetWidth(), img->GetHeight());

        delete (g);
        EndPaint(hWnd, &ps);
        break;

      case WM_DESTROY:
        delete (img);
        delete (bg);

        PostQuitMessage(0);
        break;

      default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

  return 0;
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
  MSG msg;
  GdiplusStartupInput gpSI;
  ULONG_PTR lpToken;

  /* GDI+初期化 */
  GdiplusStartup(&lpToken, &gpSI, NULL);

  HCURSOR hCursor = LoadCursor(NULL, IDC_ARROW);
  HBRUSH hBrush = (HBRUSH)(COLOR_WINDOW + 1);
  WNDCLASS wcl = { 0, WndProc, 0, 0, hInst, NULL, hCursor, hBrush, NULL, "mh" };
  DWORD style = WS_OVERLAPPEDWINDOW | WS_VISIBLE;

  if (!RegisterClass(&wcl) ||
      !CreateWindowEx(0, "mh", "gdiplus test",
                      style,
                      CW_USEDEFAULT, CW_USEDEFAULT,
                      SCRW, SCRH,
                      NULL, NULL, hInst, NULL))
    return FALSE;

  while (GetMessage(&msg, NULL, 0, 0) > 0)
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }

  /* GDI+終了 */
  GdiplusShutdown(lpToken);

  return msg.wParam;
}

せっかくだから、SetTimer() を使って、一定時間毎にタイマーで処理が走るようにして、簡単なアニメーションをするようにしてみた。SetTimer() を使ってタイマーをセットすれば、そこで指定したミリ秒(1/1000秒)が経過すると、WM_TIMER というメッセージがWindowsから送られてくるようになるので、WM_TIMER が送られてきた時の処理を書けばアニメーションができる。また、InvalidateRect() を呼べば、再描画を要求できる(WM_PAINT メッセージが送られてくる)。

ただ、SetTimer() の精度(?)は、Windows NT系OSの場合、10ms らしい。60 FPS を期待して16ms前後を指定しても、おそらく 20ms ぐらいの間隔で処理することになるのだろう…。


使用画像は以下。

_test.png
_bg.png


コンパイルは以下。01_gdiplus01.exe が生成される。
g++ 01_gdiplus01.cpp -o 01_gdiplus01.exe -mwindows -static -lstdc++ -lgcc -lgdiplus -lgdi32
  • GDI+ を使うので、-lgdiplus -lgdi32 をつけないといかんらしい。


実行結果は以下。




たしかに、GDI+ を使うことで、png画像を読み込んで描画することができた。赤いボールのpng画像はアルファチャンネルを持っているので、周辺がちゃんと抜けた状態で描画されている。

ただ、少々問題が…。ウインドウ内がとにかくちらつく。描画処理として、ウインドウ内消去、背景画像相当の描画、ボールの描画を行っているので、その描画過程が見えちゃってちらつくのだな…。まあ、解決策については後で考えることにする。

リソースファイル内のpng画像を利用する。 :

上記のサンプルはpngファイルを読み込んで利用しているけれど、せっかくだからリソースファイル(.exeファイルに含めるデータ群)にpng画像を含めておいて、それを利用するようにしたい。

以下を参考にして作業。

_プログラミングTips : Vistaの透け透けウィンドウにアルファ付き画像を描画する
_winapi - C++ GDI+ how to get and load image from resource? - Stack Overflow
_gdi+ - "undefined reference to `CreateStreamOnHGlobal@12'" error faced on executing gdiplus c++ code - Stack Overflow

リソース内からpng画像を一発で読み込む関数は用意されてないらしくて、いくつかの手順を踏んで処理しないといけないらしい…。


さておき。リソースファイルは以下。

_res.rc
#include "resource.h"

IDI_BALL    RCDATA     "test.png"
IDI_BG      RCDATA     "bg.png"

「RCDATA」を記述することで、何らかのバイナリファイルであることを指定している。「PNG」や「IMAGE」を記述している事例も見かけたのだけど、自分の環境では「RCDATA」にしないと上手く行かなかった。MinGW を使って作業している関係だろうか…?


リソースファイル関連ヘッダファイルは以下。ボール画像とBG画像のID番号を設定している。

_resource.h
#ifndef RESOURCE_H_
#define RESOURCE_H_

#define IDI_BALL    101
#define IDI_BG      102

#endif


C++のソースは以下。

_02_gdiplus_res.cpp
#define WINVER          0x0501      // 0x0501 = WindowsXP
#define _WIN32_WINNT    0x0501

#include <windows.h>
#include <gdiplus.h>
#include "resource.h"

using namespace Gdiplus;

#pragma comment(lib, "user32.lib")
#pragma comment(lib, "gdiplus.lib")

#define SCRW 512
#define SCRH 512

#define TM_COUNT1 1
#define FPS  60

HINSTANCE hInst;

// Load image from resource
Bitmap *LoadImageFromResource(
  HINSTANCE hinst,  // handle instance
  LPCTSTR pName,  // resource ID
  LPCTSTR pType   // resource type
  )
{
  // Search resource
  HRSRC hRes = FindResource(hinst, pName, pType);

  if (hRes == NULL)
    {
      MessageBox(NULL, "Not found resource", "Error", MB_OK);
      return NULL;
    }

  // get resource size
  DWORD Size = SizeofResource(hinst, hRes);

  if (Size == 0)
    {
      MessageBox(NULL, "Resource size = 0", "Error", MB_OK);
      return NULL;
    }


  HGLOBAL hData = LoadResource(hinst, hRes);

  if (hData == NULL)
    {
      MessageBox(NULL, "Failure load resource", "Error", MB_OK);
      return NULL;
    }

  const void *pData = LockResource(hData);

  if (pData == NULL)
    {
      MessageBox(NULL, "Failure lock resource", "Error", MB_OK);
      return NULL;
    }

  // Copy resource data
  HGLOBAL hBuffer = GlobalAlloc(GMEM_MOVEABLE, Size);

  if (hBuffer == NULL)
    {
      MessageBox(NULL, "Failure alloc", "Error", MB_OK);
      return NULL;
    }

  void *pBuffer = GlobalLock(hBuffer);

  if (pBuffer == NULL)
    {
      MessageBox(NULL, "Failure lock", "Error", MB_OK);
      GlobalFree(hBuffer);
      return NULL;
    }

  CopyMemory(pBuffer, pData, Size);
  GlobalUnlock(hBuffer);

  // read image
  IStream *pStream;

  if (CreateStreamOnHGlobal(hBuffer, TRUE, &pStream) != S_OK)
    {
      MessageBox(NULL, "Failure create stream", "Error", MB_OK);
      GlobalFree(hBuffer);
      return NULL;
    }

  Bitmap *pBitmap = Bitmap::FromStream(pStream);
  pStream->Release();

  return pBitmap;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;
  static Gdiplus::Bitmap* img;
  static Gdiplus::Bitmap* bg;

  static Graphics *g;
  RECT rect;

  static float x, y, dx, dy;
  static int wdw_w, wdw_h;

  switch (uMsg)
    {
    case WM_CREATE:
      // get window size
      GetClientRect(hWnd, &rect);
      wdw_w = rect.right - rect.left;
      wdw_h = rect.bottom - rect.top;

      img = LoadImageFromResource(hInst, MAKEINTRESOURCE(IDI_BALL), RT_RCDATA);
      bg = LoadImageFromResource(hInst, MAKEINTRESOURCE(IDI_BG), RT_RCDATA);

      // not work
      // img = LoadImageFromResource(hInst, TEXT("IDI_BALL"), TEXT("RCDATA"));
      // bg = LoadImageFromResource(hInst, TEXT("IDI_BG"), TEXT("RCDATA"));

      if (img != NULL && bg != NULL)
        {
          // init work
          x = (float)(wdw_w / 2);
          y = (float)(wdw_h / 2);
          dx = (float) wdw_w / (float)FPS;
          dy = dx * 0.5;

          // Set timer
          SetTimer(hWnd, TM_COUNT1, (int)(1000 / FPS), NULL);
        }

      break;

    case WM_TIMER:
      // main loop
      x += dx;
      y += dy;

      if (x <= 0 || x + img->GetWidth() >= wdw_w) dx *= -1;

      if (y <= 0 || y + img->GetHeight() >= wdw_h) dy *= -1;

      InvalidateRect(hWnd, NULL, TRUE);
      // InvalidateRect(hWnd, NULL, FALSE);
      break;

    case WM_PAINT:
      hdc = BeginPaint(hWnd, &ps);
      g = new Graphics(hdc);

      if (bg != NULL)
        g->DrawImage(bg, 0, 0, bg->GetWidth(), bg->GetHeight());

      if (img != NULL)
        g->DrawImage(img, (int)x, (int)y, img->GetWidth(), img->GetHeight());

      delete (g);
      EndPaint(hWnd, &ps);
      break;

    case WM_DESTROY:
      delete (img);
      delete (bg);

      PostQuitMessage(0);
      break;

    default:
      return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

  return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
  MSG msg;
  GdiplusStartupInput gpSI;
  ULONG_PTR lpToken;

  hInst = hInstance;

  /* GDI+初期化 */
  GdiplusStartup(&lpToken, &gpSI, NULL);

  HCURSOR hCursor = LoadCursor(NULL, IDC_ARROW);
  HBRUSH hBrush = (HBRUSH)(COLOR_WINDOW + 1);
  WNDCLASS wcl = { 0, WndProc, 0, 0, hInst, NULL, hCursor, hBrush, NULL, "mh" };
  DWORD style = WS_OVERLAPPEDWINDOW | WS_VISIBLE;

  if (!RegisterClass(&wcl) ||
      !CreateWindowEx(0, "mh", "gdiplus test",
                      style,
                      CW_USEDEFAULT, CW_USEDEFAULT,
                      SCRW, SCRH,
                      NULL, NULL, hInst, NULL))
    return FALSE;

  while (GetMessage(&msg, NULL, 0, 0) > 0)
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }

  /* GDI+終了 */
  GdiplusShutdown(lpToken);

  return msg.wParam;
}


使用画像は以下。

_test.png
_bg.png


コンパイル/ビルドは以下。
windres res.rc res.o
g++ -c 02_gdiplus_res.cpp
g++ 02_gdiplus_res.o res.o -o 02_gdiplus_res.exe -mwindows -static -lstdc++ -lgcc -lgdiplus -lgdi32 -lole32
  • 上から順に、「リソースをコンパイルして .o を生成」「C++ソースをコンパイルして .o を生成」「.o群をリンクして.exe を生成」を行っている。
  • CreateStreamOnHGlobal() がリンク時に見つからなかったけど、ole32 が必要になるらしい。リンクの指定として、-lole32 を追加した。


実行結果は以下。




png画像を描画することができている。リソースからpng画像を読み込むこともできると分かった。

まあ、これもウインドウ内のちらつきが酷いけど…。

ダブルバッファを利用。 :

前述のサンプルは、ウインドウ内がとにかくちらついてしまうので、そのあたりを改善したい。ダブルバッファを導入すれば改善されるらしいので試してみる。

以下のページが参考になった。

_VC++でGDI+ そにょ8 ?ダブルバッファリング? - yuyarinの日記
_ビットマップのマルチバッファリング【Windowsプログラミング研究所】

仕組みとしては…。
  • ウインドウと同サイズの、空のbitmapを用意しておく。
  • 一旦、そのbitmapにアレコレを描画。
  • そのbitmapをウインドウ内に描画する。
これで、細かいアレコレを描画している過程を見せないようにする。また、毎回ウインドウ内をクリアしてから描画せずに、前回の画面を残したまま上書き描画することでもちらつきが改善されるらしい。

resource.h、res.rc、使用するpng画像は、前述のものをそのまま利用する。

_res.rc
_resource.h
_test.png
_bg.png

C++のソースは以下。

_03_gdiplus_dbuf.cpp
#define WINVER          0x0501      // 0x0501 = WindowsXP
#define _WIN32_WINNT    0x0501

#include <windows.h>
#include <gdiplus.h>
#include "resource.h"

using namespace Gdiplus;

#pragma comment(lib, "user32.lib")
#pragma comment(lib, "gdiplus.lib")

#define SCRW 512
#define SCRH 512

#define TM_COUNT1 1
#define FPS  60

HINSTANCE hInst;

// Load image from resource
Bitmap *LoadImageFromResource(
  HINSTANCE hinst,  // handle instance
  LPCTSTR pName,  // resource ID
  LPCTSTR pType   // resource type
  )
{
  // Search resource
  HRSRC hRes = FindResource(hinst, pName, pType);

  if (hRes == NULL)
    {
      MessageBox(NULL, "Not found resource", "Error", MB_OK);
      return NULL;
    }

  // get resource size
  DWORD Size = SizeofResource(hinst, hRes);

  if (Size == 0)
    {
      MessageBox(NULL, "Resource size = 0", "Error", MB_OK);
      return NULL;
    }


  HGLOBAL hData = LoadResource(hinst, hRes);

  if (hData == NULL)
    {
      MessageBox(NULL, "Failure load resource", "Error", MB_OK);
      return NULL;
    }

  const void *pData = LockResource(hData);

  if (pData == NULL)
    {
      MessageBox(NULL, "Failure lock resource", "Error", MB_OK);
      return NULL;
    }

  // Copy resource data
  HGLOBAL hBuffer = GlobalAlloc(GMEM_MOVEABLE, Size);

  if (hBuffer == NULL)
    {
      MessageBox(NULL, "Failure alloc", "Error", MB_OK);
      return NULL;
    }

  void *pBuffer = GlobalLock(hBuffer);

  if (pBuffer == NULL)
    {
      MessageBox(NULL, "Failure lock", "Error", MB_OK);
      GlobalFree(hBuffer);
      return NULL;
    }

  CopyMemory(pBuffer, pData, Size);
  GlobalUnlock(hBuffer);

  // read image
  IStream *pStream;

  if (CreateStreamOnHGlobal(hBuffer, TRUE, &pStream) != S_OK)
    {
      MessageBox(NULL, "Failure create stream", "Error", MB_OK);
      GlobalFree(hBuffer);
      return NULL;
    }

  Bitmap *pBitmap = Bitmap::FromStream(pStream);
  pStream->Release();

  return pBitmap;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;
  
  static Bitmap* img;
  static Bitmap* bg;
  static Bitmap* offScrnBmp;

  static Graphics* onScrn;
  static Graphics* offScrn;

  RECT rect;

  static float x, y, dx, dy;
  static int wdw_w, wdw_h;

  switch (uMsg)
    {
    case WM_CREATE:
      // get window size
      GetClientRect(hWnd, &rect);
      wdw_w = rect.right - rect.left;
      wdw_h = rect.bottom - rect.top;

      // create off screen bitmap
      offScrnBmp = new Bitmap(wdw_w, wdw_h);

      // Load image from resource
      img = LoadImageFromResource(hInst, MAKEINTRESOURCE(IDI_BALL), RT_RCDATA);
      bg = LoadImageFromResource(hInst, MAKEINTRESOURCE(IDI_BG), RT_RCDATA);

      // not work
      // img = LoadImageFromResource(hInst, TEXT("IDI_BALL"), TEXT("RCDATA"));
      // bg = LoadImageFromResource(hInst, TEXT("IDI_BG"), TEXT("RCDATA"));

      if (img != NULL && bg != NULL)
        {
          x = (float)(wdw_w / 2);
          y = (float)(wdw_h / 2);
          dx = (float) wdw_w / (float)FPS;
          dy = dx * 0.5;

          SetTimer(hWnd, TM_COUNT1, (int)(1000 / FPS), NULL);
        }

      break;

    case WM_TIMER:
      // main loop
      x += dx;
      y += dy;

      if (x <= 0 || x + img->GetWidth() >= wdw_w) dx *= -1;

      if (y <= 0 || y + img->GetHeight() >= wdw_h) dy *= -1;

      // InvalidateRect(hWnd, NULL, TRUE);
      InvalidateRect(hWnd, NULL, FALSE);  // not clear background
      break;

    case WM_PAINT:
      // draw image to off screen
      offScrn = new Graphics(offScrnBmp);
      
      if (bg != NULL)
        offScrn->DrawImage(bg, 0, 0, bg->GetWidth(), bg->GetHeight());

      if (img != NULL)
        offScrn->DrawImage(img, (int)x, (int)y, img->GetWidth(), img->GetHeight());

      delete (offScrn);

      // draw off screen to window
      hdc = BeginPaint(hWnd, &ps);
      
      onScrn = new Graphics(hdc);
      onScrn->DrawImage(offScrnBmp, 0, 0, offScrnBmp->GetWidth(), offScrnBmp->GetHeight());
      delete(onScrn);
      
      EndPaint(hWnd, &ps);
      
      break;

    case WM_DESTROY:
      delete (img);
      delete (bg);
      delete (offScrnBmp);

      PostQuitMessage(0);
      break;

    default:
      return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

  return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
  MSG msg;
  GdiplusStartupInput gpSI;
  ULONG_PTR lpToken;

  hInst = hInstance;

  /* GDI+初期化 */
  GdiplusStartup(&lpToken, &gpSI, NULL);

  HCURSOR hCursor = LoadCursor(NULL, IDC_ARROW);
  HBRUSH hBrush = (HBRUSH)(COLOR_WINDOW + 1);
  WNDCLASS wcl = { 0, WndProc, 0, 0, hInst, NULL, hCursor, hBrush, NULL, "mh" };
  DWORD style = WS_OVERLAPPEDWINDOW | WS_VISIBLE;

  if (!RegisterClass(&wcl) ||
      !CreateWindowEx(0, "mh", "gdiplus test",
                      style,
                      CW_USEDEFAULT, CW_USEDEFAULT,
                      SCRW, SCRH,
                      NULL, NULL, hInst, NULL))
    return FALSE;

  while (GetMessage(&msg, NULL, 0, 0) > 0)
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }

  /* GDI+終了 */
  GdiplusShutdown(lpToken);

  return msg.wParam;
}


コンパイル/ビルドは以下。03_gdiplus_dbuf.exe が生成される。
windres res.rc res.o
g++ -c 03_gdiplus_dbuf.cpp
g++ 03_gdiplus_dbuf.o res.o -o 03_gdiplus_dbuf.exe -mwindows -static -lstdc++ -lgcc -lgdiplus -lgdi32 -lole32

一応、前述の2つのファイルについても記述した Makefile も置いておく。Makefile があれば、make と打つだけでコンパイル/ビルドができる。

_Makefile


実行結果は以下。




ちらつきがかなり改善された。

まあ、bitmapをウインドウ内に転送している過程が見えちゃってるというか、いわゆるティアリングのような見た目が発生している気もするけれど…。

_ティアリング、スタッタリングについて | ドスパラ サポートFAQ よくあるご質問|お客様の「困った」や「知りたい」にお応えします。

それでも、ダブルバッファを導入してないサンプルと比べたら雲泥の差かなと…。

GDI+は遅いらしい。 :

関連情報をググっていたら、GDI+ は描画が遅いという話を見かけた。GDI+ を使わずに、GDIで済ませられるなら、GDIだけを使ったほうが速いのだとか。

_Windows 10 で描画処理が遅くなる問題について(WebArchive)
_kenjinote/DrawSpeedTest: DWM が有効か無効かで GDI+ の描画速度が異なるのでその検証を行うためのプロジェクトです。
_Pasture | GDI+のビットマップ転送速度

png画像を使えるようになったのはありがたいけど、bitmapだけを使うようにして、GDIで処理したほうがいいのかもしれない…。

#2 [zatta] ハサミを購入

ホームセンターホーマックで、家庭用ハサミ、KOKUYO SAXA スタンダード刃 (ハサ-280B)を購入。税込382円。

今まで、PLUS フィットカットカーブ SC-175SF を使っていたけど、使う時に「ギギギ」「グググ」といった感じの妙な抵抗感があって、ずっともやもやしていたわけで。ググってみたら、フィットカットカーブよりSAXAのほうが軽く切れるという話を見かけたので、この際新調してしまおうかと。

フィットカットカーブを使う前は、SAXA を購入して使ってた時期があるのだけど。その当時の SAXA はハンドル内部にゴムっぽいものがついていて、そのゴムが経年劣化で千切れてアレな状態になってフィットカットカーブに買い換えた、という経緯があり。しかし、今現在販売されている SAXA は、そのゴムっぽいものをつけない形状になっているので、前回よりは長持ちしてくれるかなと期待。

スタンダード刃以外にも、3Dグルーレス刃、フッ素コート等々、シールの類を切った時にべたつきにくいと謳う製品もあったけど。その手のアレコレが付加されると、切る時の抵抗が微妙に増えるという話も見かけたし、実際、今まで使ってたフィットカットカーブがフッ素コート版だったせいか抵抗を感じていたので、今回はスタンダード刃を選んでみた。

2021/09/05() [n年前の日記]

#1 [prog] Qtを少し勉強中

Qt Creator の使い方を少し勉強中。以下の記事を眺めながら Hello World。

_Qt6のUIプログラムでHelloWorldするためのメモ|かつお|note
_Qt をはじめよう! 第5回: Qt Creator を使ってみよう!
_Qt をはじめよう! 第13回: GUI デザイナを使おう
_Qt をはじめよう! 第14回: GUI デザイナでのレイアウトに慣れ~よう!
_Qt をはじめよう! 第15回: GUI デザイナでシグナル/スロットを接続しよう
_Qt をはじめよう! 第16回: GUI デザイナでスロットを作成しよう
_Tutor-1

2020/09/05() [n年前の日記]

#1 [anime] ウルトラマンのデザインについてググってたり

オーストラリアで制作されたという「ウルトラマンG(グレート)」がYouTubeで無料で見れるというニュースを目にして、オープンセット撮影だと印象がどのくらい違うのかが気になって眺めてみたりして、ついでに関連情報をググっているうちに「ウルトラマン神変」なるデザインの存在を知り。そこから、元々のデザインの変遷が気になってググって眺めているところ。

ウルトラマンと言えばこういうデザインと自分達は思い込んでいるけれど、何もなかった状態からデザインしていくソレを目にすると、自分達の世代は、既に出来上がった型に縛られ過ぎている気もするなと…。

さておき、「ウルトラマン神変」のデザインは、後のウルトラマンシリーズに何かしら影響を与えたのかどうかも気になるところだなと。下地が金、ラインが黒のウルトラマンって居たかなあ…。どうだったっけ…。

2019/09/05(木) [n年前の日記]

#1 [nitijyou] 歯医者に行ってきた

近所のS歯科まで電動自転車で。14:00-14:10まで治療。右下の奥歯の歯石取り。SRPと書いてあった。

朝から右下のどこかの歯・歯茎がじんわり痛くて、その旨伝えて治療をしたのだけど、今回歯石を取ったあたりは激痛が走ったわけでもなく。ということは、別の歯が痛いということだろうか…。歯医者さんは、よくわからんので様子見しましょう、と言ってたけれど。

#2 [pc] 無線LAN子機を交換してきた

先日購入した無線LAN子機、BUFFALO WLI-UC-GNM2S だけど。USB扇風機で冷却してみても接続が切れて、抜き差ししても認識されない状態になるのはさすがにおかしいだろうと思えてきて。ググった感じでは、個体によって熱への耐性が違っているようで、交換してもらったら安定動作した、という話も見かけたりしたので、やはりコレは初期不良品ではないのかな、と。

てなわけで、購入したヤマダ電機まで電動自転車で。状況を説明して、初期不良扱いで別個体と交換してもらった。

交換後の個体はすこぶる安定。…と喜んでいたら接続が切れた。ガックリ。コレもハズレなのかな…。ただ、前回購入したソレと違って、抜いて冷やしてからまた差すと再認識してくれる模様。

手元には、WLI-UC-GNM、WLI-UC-GNM2 があって、そちらは一応安定しているのだけど。現行製品は何か内部に変更点でもあるのだろうか…。てっきり、パッケージングを変えて低コスト化したとか、流通の関係で型番を変えたとか、そういう事情ではないかと思い込んでいたけれど…。それとも、以前購入した個体がハズレではなかっただけなのだろうか。

とりあえず、USB扇風機で冷却しながら使ってみるか…。

#3 [ubuntu][gerbera] Gerberaの設定を見直し中

メディアサーバ(DLNAサーバ)、Gerbera の設定を見直し中。階下の REGZA 37Z9000 から認識はされるものの、動画が見れない状態なのでどうにかしたいなと。

以下を参考にして、/etc/gerbera/config.xml 等を設定しているけれど…。

_DLNAサーバーを試す[MediaTomb][ubuntu]編 - REGZAへ認識させる | デジ備忘
_DLNAサーバーを試す[MediaTomb]編 - REGZAからMPEG2動画を視聴する | デジ備忘
_DLNAサーバーを試す[MediaTomb]編 - トランスコードしてREGZAから視聴 | デジ備忘
_yoyoメモ: DLNAサーバのmediatombを使って、REGZA 19RE2で手元の動画を片っ端から再生出来るようにしてみた
_mediatomb DLNA REGZA対応
_Memorandum: DLNAサーバ MediaTomb

相変わらず、 REGZAから見れない…。何故だ…。

どうやら以下の指定が重要っぽいけれど。
        <map from="mpg" to="video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=01;DLNA.ORG_CI=0"/>
        <map from="mpeg" to="video/mpeg:DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=01;DLNA.ORG_CI=0"/>

2018/09/05(水) [n年前の日記]

#1 [cg_tools] まだDrawgraphic 3 Proを触ってる

まだ Drawgraphic 3 Pro を触りつつ、出力結果について調べていたり。

出力した wmf を Inkscape で読み込んでみた。 :

wmf と emf について調べていたら、wmf と emf はサイズの扱い方が違う場合がある、という話を見かけて。

_Enhanced Metafile (EMF) の描画について

となると…。Drawgraphic 3 から出力した emf を Inkscape 0.92.3 にD&Dすると、異様に小さい表示になってしまうけど。ひょっとして、emf ではなく wmf をD&Dしたら、違う結果になるのでは。

試してみた。それらしいサイズで表示された。

つまり、Drawgraphic 3 からベクターデータを出力して、他のソフトに渡したい場合は、emf より wmf にしたほうが良い、と言えるのかもしれないなと。

ただ、図形が、曲線を含んでいる場合は、ちょっとよろしくない結果になるようで。曲線を含んだ図形を Inkscape にD&Dして、グループ解除してみたら、フリーズしたのかと思えたぐらいに、体感で4〜5分待たされた…。

どうやら、Drawgraphic 3 は、wmf / emf で出力する際、曲線を、多数の直線で近似した状態で出力する模様。例えば、以下のように、簡単な曲線でも、膨大な本数の、短い直線になってしまう…。

dg3_ss01.png

しかも、それぞれの短い直線は、一本の直線のように見えても、実際には、面 + 面を取り囲む線 + 接続部分のように見せる面 ―― 3つの要素で構成されているので…。

dg3_ss02.png

これほど膨大な要素数を相手にすると、グループ解除等、一つ一つの構成要素に対して処理をしようとした場合に、とんでもない処理時間がかかってしまうのだろう…。

出力した pdf を Inkscape で読み込んでみた。 :

考えてみたら、ベクターデータとしては、wmf / emf の他に pdf もあるのではないかと思いついた。pdf で出力して、他のソフトに持っていけないか…。

試してみた。Drawgraphic 3 で pdf出力して、Inkscape に D&Dして、グループ解除。

こちらの場合は、数分待たされることはなかった。グループ解除後の見た目からして、曲線を含んだ各図形は、それぞれが一つの図形として pdf に内包されているようで。

dg3_ss03.png

そして、各図形は、シンプルに、面の色、線の色、線幅の情報を持った一つの図形になっていた。

ただ、曲線を、最低限の制御点で表しているわけではないようで…。相変わらず、曲線を、膨大な数の短い線で近似している模様。

dg3_ss04.png

しかも、それぞれの短い線は、曲線ではなく、只の直線…。だから、元図形の制御点が少ないと、分割の間隔が広くなるので、出力された図形の輪郭は、妙にガクガクしている。

dg3_ss05.png

曲線を短い直線で近似するあたりは Inkscape が行っているのではないかと疑問が湧いたけど。Drawgraphic 3 の、ファイル → 環境設定 → 一般 → スムージングの数を変更して pdf出力してみたところ、曲線の分割数が変わった状態になった。

dg3_ss06.png

つまり、曲線を直線で近似するあたりは、やはり Drawgraphic 3 がファイル出力時に行っているらしい。Inkscape は悪くない。たぶん。

もちろん、Drawgraphic 3 のスムージングの値を増やすと、曲線の分割数が増える=制御点の数が増えるので、より重いデータになってしまうはず。

やはり他のソフトと連携することは考えないほうがいいのかもしれず。 :

結局のところ、Drawgraphic で出力したファイルを他のソフトにインポートして、なんてことは考えちゃいけないのかもしれない。

Drawgraphic で作業を始めたら、最終結果のビットマップデータを得られるまで、Drawgraphic上で全ての作業を完結させる ―― ぐらいの覚悟が必要なのではないか…。

でもまあ、年賀状作成ソフトあたりはそういうノリだし。一般的なPC利用であれば、最初から最後まで一つのソフトを使って作業を完結させるのって、別におかしい話じゃないよなと。

#2 [cg_tools] wmf と emf を LibreOffice Draw から出力して確認

Drawgraphic 3 Pro で出力した wmf や emf はなんだかアレ、ということが分かったけれど。LibreOffice Drawあたりで wmf や emf を出力した場合はどうなるのか気になってきたわけで。ちょっと実験して確認してみようかなと。

wmfの場合。 :

まず、前提として…。Drawgraphic 3 で出力した wmf は以下のようになっている。

wmf_by_dg3_ss.png

  • 元の図形が曲線を含んでいると、細かい直線で分割されてしまう。
  • 更に、各直線は、ただの直線のように見えても、実際には3〜4つの要素で作られてる。

LibreOffice Draw で同じことをするとどうなるだろう。こうなった。

wmf_by_lodraw_ss01.png

見るからに、こちらも、曲線を細かい線で分割して近似している模様。

ただ、分割された細かい線の形状が違う。

wmf_by_lodraw_ss02.png

  • 細かい線は、Drawgraphic 3 のように単なる直線ではなく、曲線に見える形で作られている。
  • ただし、それら曲線も、結局は直線で近似してある。
  • Drawgraphic 3 のように、謎のストロークや、線の端を示す面などは作られていない。
  • 線は無くて、全てが面で構成されている。
  • 一つ一つの面が持ってる頂点数は多いけれど、その代わり、面の数は少な目なデータになっている。

曲線を多数の直線で近似すると言っても、異なる分割の仕方があるのだなと…。

emfの場合。 :

emfを出力した場合は、少し違いが出てくる。

Drawgraphic 3 は、wmf で出力しても、emf で出力しても、結果はほとんど違ってこない。おそらく、wmf 用のデータを内部で作ってから、それをそのまま emf に変換して出力しているのではないかと。

LibreOffice Draw の場合は、結果が違ってくる。

emf_by_lodraw_ss01.png

曲線を、多数の線に分割するあたりは、wmf と同じだけれど…。

emf_by_lodraw_ss02.png

曲線はベジェ曲線として持っているようで。制御点の数が最低限の個数で済む。

また、細かく分割されたそれぞれの線も、一つ一つがベジェ曲線で表現されている。

emf_by_lodraw_ss03.png

wmfとemfの違い。 :

調べてみたところ、wmf は、そもそも曲線を持てないフォーマットだそうで。

_WMF(Windows Metafile) - 限られた空間の中何を残せるだろう...
機能的には若干貧弱らしい
ベジェ曲線や非直交楕円などのどちらかというと基本的なグラフィック素子がいくつか欠けている

WMF(Windows Metafile) - 限られた空間の中何を残せるだろう... より


_ASCII.jp:仕事に使えるグラフィックス入門
WMF(左)とEMF(右)の違いは、曲線のオブジェクトを保存したときに現われる。EMFのほうがアンカーポイントが少なく、きれいな曲線で保存できるのだ。図形を拡大すると、この違いが顕著になる。

ASCII.jp:仕事に使えるグラフィックス入門 より


だから、Drawgraphic、LibreOffice Draw、どちらで wmf を出力しても、曲線を直線で近似しているのだろう。良かれと思ってやっているわけではなく、単に wmf の制限で、そうする以外になかったのだな…。

しかし emf は、wmf と違って、曲線を持てるフォーマット。

Drawgraphic の場合は、せっかくの emf の強みをガン無視して、wmf とほぼ同じデータを出力してしまうけど。LibreOffice Draw は、「せっかく曲線を持てるフォーマットなのだから、曲線データを入れるべき」的に、ベジェ曲線を活用して少ない制御点でデータを出力する、といったことをやっているみたいだなと。

そこだけ見ると、有償ソフトの Drawgraphic は、無料で使える LibreOffice Draw より劣ってませんか、という話になるけれど。しかし、LibreOffice Draw は、何か図形を描くたびに選択ツールにリセットされちゃうし、曲線を操るのもなかなか面倒臭くて。操作性の面では Drawgraphic のほうが、はるかに使い易いのだよな…。と、一応フォロー。

svgの場合。 :

ついでに、LibreOffice Draw から svg で出力して Inkscape に読み込んでみた。

svg_by_lodraw_ss.png

  • 面(フィル)、線(ストローク)で構成されてる。
  • それぞれ、ベジェ曲線で表現されてる。
  • 深い階層のコンテナの中に入ってる。

「wmf や emf なんて今時使うもんじゃねえよ。svg でやり取りしたほうがいいよ」という話をあちこちで見かけたけど、こういうことなんだろうなと。最小の制御点の個数で、形状を十分表現できるというか…。emf では無駄なデータが増えるし、wmf なんてもはや編集不可能なデータになっちゃうけれど、svg なら見た目良し、かつ、編集可能なデータとして扱える、みたいな。

2017/09/05(火) [n年前の日記]

#1 [nitijyou] SONY製オーディオセレクターを分解

自分はPCで音を聞く時にヘッドフォンをとっかえひっかえしてるのだけど。一々コネクタの抜き差しをしてたら面倒臭い、ということで、 _SONY SB-A40 というオーディオセレクターを使っていたり。

しかし最近、スイッチを切り替えても接触不良で左右が正しく聞こえない時があって。試しに分解して KURE CRC 接点復活スプレーを吹いてみようかなと。

てなわけで分解。一応写真も残しておいてみたりして。

sony_sb_a40_01.jpg

sony_sb_a40_02.jpg

sony_sb_a40_03.jpg

分解は、底面の2つのネジを外して、前面(?)の薄いほうから開ける感じ。簡単にパカッと開けるわけではなく、マイナスドライバーで少しずつグリグリしながら開けた。何かコツがあるのかな…。

分解してみて驚いたけど、スイッチの機構が謎。4つスイッチが並んでるだけのように見えたのだけど、1つを押すと他の3つがOFFになって軸が上がる。どういう仕組みになってるんだ…SONYは魔法でも使っているのか…。とにかく、昔のSONYにはアイデアマンが居たのだなと。いや、SONYが設計したわけじゃないのかもしれないけど。

とりあえず、スイッチの軸の、微妙に凹みがあるところから、接点復活スプレーをかけてみたけど。これで効果は期待できるのだろうか…。中にちゃんと入ってるのかな…。

中国企業にコピーしてほしい一品。 :

この SB-A40、もう販売してないんだよなあ…。とっても便利なのに…。ここはぜひとも中国企業にガツンとコピーしてもらって市場・店頭に流してもらいたい。今の中国の技術力ならできるはず。ていうか裏面には「MADE IN CHINA」って書いてあったし。

「今時は皆、Bluetoothヘッドフォン使ってるよ」「ケーブルなんか使わねえよ」「ステレオミニジャック? 何ソレ? 円谷特撮?」と言われてしまうだろうか…。そんな殺生な。

もし、コレが壊れたら、自作するしかないのかなあ…。はんだ付け、面倒臭いなあ…。

_monta@site >> ロータリースイッチでヘッドホンセレクターを作る
_100均工作:Seriaのブリキケースで4系統ステレオミニオーディオセレクターを作ってみた - white croquis
_電子工作知識ゼロが作る、自作オーディオセレクター 前編 : ZAPZAP!
_電子工作知識ゼロが作る、自作オーディオセレクター 後編 : ZAPZAP!

#2 [game][neta] 夢の中で気になるゲームを見かけた

寝ていたら、夢の中で、なんだか気になるゲームを見かけた。のでなんとなくメモ。







てな感じで、覚えてる範囲でメモ。

目が覚めてから気づいたけど。なんかこういうインディーズゲームの動画を見たような記憶が…。タイトル忘れたけど…。ただ、そのゲームは鬼のような難易度だったような。

「ぺったんこ」なるソレは、たぶん「もじぴったん」あたりからの連想じゃないのだろうか。ちなみに、なんとなく気になって「ぺったんこ ゲーム」でググってみたらたくさん出てきた。今まで知らなかったけど、「ぺったんこ」なる言葉はゲームのタイトルにたくさん使われていたのだな…。

寝ぼけ頭で、ゲーム制作ライブラリの類でとりあえずゲームっぽいものを作ってみる、てな時にはヨサゲな仕様かも、と思ったりもして。 であれば、ちゃんと作れたらそこそこ面白くなる可能性が。…む。考えてみたら壁だか天井だかにつかまる仕様も悪魔城伝説じゃないのか。夢ってのは、こうやって記憶を整理してたのだな…。

#3 [anime][neta] 顔芸も手描きの武器じゃなかろうか

思考メモ。

随分前に、とあるアニメーターさんが、「顔芸なんて価値はない」みたいなことを ―― 記憶が定かじゃないけど、たしかそういう感じの一文をつぶやいてた場面を見かけた…ことを某アニメを見ている最中に思い出してしまったり。

当時、その一文を読んで、「いや、それは違うのでは」と思ってしまった、そんな記憶が。

と言うのも…。

自分はCG大好き人間なので、常日頃アニメを眺めていても、「手描きの強みって何だろうなあ」みたいなことをついつい考えちゃうのだけど。そういう視点からすると、顔芸だって手描きならではの立派な武器の一つじゃないのと思えてくるからで。

だって、3DCGだの、After Effectsを駆使して実現したカットアウトアニメの類で、「賭ケグルイ」や「ボールルームへようこそ」は作れないもの…。どちらも顔芸だらけのアニメだけど、アレをポリピクに作れるか? 無理でしょ。例えばLive2Dで作れるか? 無理でしょ。ああいうのは手描きならではでしょ、と。

ところが、手描きの強みを活かしてるのに蔑まれてしまうという。なんだかな、と。

それに…。単なる止め絵の1カットだけを見せて、ソレを見た人が「怖い」「気味悪い」「楽しそう」「可愛い」等々を一瞬にして思ってしまう。それってスゴイことだよなと。たったの1カットでお客さんの気持ちに変化を与える。どう考えても武器になる。

娯楽映像の勘所とは何か。見てる人の気持ちを動かせるかどうか、だろうと。そして、お客さんの心を揺さぶる手管に貴賤は無いはず、と思うのだよなあ…。高度な技術を駆使したから偉いとか、ひたすらこだわったから偉いとか、そういうものじゃないよなと。だから「顔芸なんて」という言には「いやいや、アレはアレで」と思ってしまうという。

とは言うものの。「手描きの強さって他にも色々あるだろ」「顔芸だけに頼った作りはいかがなものか」という話であれば、「ああ、それはそうかも」とも思ってしまうのですが。アレかな。顔芸だけのアニメを何かに喩えるなら、辛さだけを売りにしたカレー専門店、甘さだけを売りにしたケーキ屋さん、みたいなものなのかな。偏り過ぎてもなんだかアレだなと。

でも、カレー専門店より定食屋のほうが偉いんだ、てのも違う気もする…。お客さんが満足するなら専門店でも定食屋でもどっちでもいいよなあ…。む。食べ物に喩えるのは違うな。だってアニメは娯楽商品、嗜好品だから。見なきゃ死んじゃう類のものではないし。

まあ、元々は、「俺、顔芸ってあまり好きじゃないんだよね」ぐらいの軽い話で「価値は〜」と呟いたのかな、とも想像するのですが。娯楽映像作品って嗜好品だから、そりゃ好き嫌いは絶対出てくるわけで、口に合わない人だって当然居るよな、とは思うのでした。

見る人の感情を揺さぶる何か。 :

「娯楽」に携わる側が、見る人の感情を揺さぶる何かを不当に低く評価するのは、ちょっと危ないんじゃないかなと思えてきたりもして。

例えばだけど…。
  • 昔、実写畑の人達からアニメは馬鹿にされてた。というか前からアニメ作ってた人達も「鉄腕アトム」を馬鹿にしてた。TV紙芝居とか揶揄されてたっけ。考えてみたら、紙芝居自体も馬鹿にされてたのだな…。
  • 昔、特撮映画や特撮ヒーロー番組は馬鹿にされてた。あんなの子供騙しだ、ジャリ番(ジャリ向け番組)だと揶揄されてた。
  • 昔、宮崎アニメは馬鹿にされてた。絵柄が古い、馬糞臭い、こんなの絶対ヒットしない、とか言われてた。
昔はアレもコレも馬鹿にされてた。でも、今は、それらに対してそういった評価を下してる人は(あんまり)居ない。

当時低評価を下した方々は、TVの前の子供さん達がそれらを見て「一喜一憂」してることを完全に見落としてた、だから見誤ったのではないかなあ、などと思うわけで。

客が「一喜一憂」する ―― 見る人の心を揺さぶるアレコレは、娯楽商品として通用するための強力な何かを絶対に持ってるはずで。故に、それらが後に正当(かどうかは分からんけど、まあそこそこ)な評価をされる可能性があったりするよなと。

で。顔芸だって、一目見ただけで視聴者の感情が揺さぶられてしまう手管なわけだから…。「顔芸に価値はない」と言っちゃうのは、「アニメなんて見る価値もない」的発言をしてた人達とかなり近いところに居るんじゃないかという不安が。それを提示することで見てる人の気持ちが変化するのか変化しないのか、そこって大事だよなと。そこが見えてないとマズイよなと。

アニメを馬鹿にしてた日本の実写畑が、その後どうなったかを思い返せば…。顔芸すら馬鹿にしてしまう作り手が、未来で何かを掴めるとは、ちょっと思えないというか…。技術面では高度かもしれないけどお客さんの気持ちがさっぱり動かない何かに辿り着きそうで…。いやまあ、そこらへんを考えるのは演出家と呼ばれる方々の仕事なのかもだけど。

てな感じのことを唐突に思い出して考えてしまったのでメモ。思考メモ。

顔芸はどうして有効なんだろう。 :

顔芸はどうして有効なんだろう、てなあたりが気になり始めたりもして。

アレかな。自分達人間は、日常生活においてコミュニケーションをとる相手の表情を見ながら、そこにある感情を類推して自身の言動を決めてるわけで。視聴者側が毎日毎日飽きもせずにやってることだから、情報伝達ルートとしては手っ取り早いのだ、てな感じなのかな。まあ、コストパフォーマンスは高いよな…。

アニメはデフォルメで成り立ってる表現手法だけど、顔芸も当然デフォルメによるところが大きいよなと。微妙な表情の差異を見せるのではなく、誇張して提示することで、小さい子供が見てもそのキャラがどんな感情を持ってるか瞬時に理解できる、てなところが強力、なのだろうか。しかしそれはそれで、なんでもかんでも咀嚼して与えてしまうのもどうなんだ、てな疑問も。微妙な表情の差異を提示して読み取ってもらう楽しませ方だってあるんじゃないか、とも思えてきたりもして。ただ、それをアニメで行うためには、実力を持った絵描きさんが必要で…。微妙な違いにこだわるための時間も必要になるし…。制作状況がソレを許すか許さないか、という問題が…。

表情の抽象化のバリエーションが膨大なあたりも魅力、だったりするのだろうか。そのあたりは漫画文化が普及した国ならでは、だろうけど。同じ感情でも、どんな抽象化をして表現するかで、作家や作品の独自性が出てくるというか…。各作品を眺めてると、時々、「えっ。ここでこの記号持ってくるか」と驚かされる時もあるし。全てが予想通りより、時々飛躍があると面白いわけで。ただ、あまり飛躍し過ぎると見る側がついてこれなくなって「理解不能」=「つまらない」と思ってしまう人達も出てくるけど。このあたり、ハイコンテクスト文化によって日本のアニメは成立してる、てな話になってくるのだろうか。

待てよ? 考えてみたら歌舞伎役者を描いた浮世絵もソレなんじゃないか。もしかして顔芸とは、浮世絵の復権? アニメも浮世絵も線画で絵を構築していくという共通点もあるわけで…。

「顔芸って何なんだろう」と考え始めると、眠れなくなりそう… (;´〜`)

#4 [anime][neta] アニメキャラの顔のしわ

思考メモ。考えが全然まとまってないので箇条書き。

2016/09/05(月) [n年前の日記]

#1 [nitijyou] 運転免許証の更新をしてきた

運転免許証更新の時期になったので、隣の市の免許センターまで行ってきた。行きは、親父さんの運転する車で運んでもらった。AM08:30に到着して、受付や手続き終了がAM09:00頃。講習を30分間受けて、AM09:30頃には新しい免許証をゲット。

帰りは、バス+電車+徒歩で。AM09:57出発のバスに乗って、駅に着いたのがAM10:35頃。ヨドバシカメラを少しうろついてから、AM11:45の黒磯行きの電車で帰ってきた。

てくてく歩いたけど、暑かった…。汗だく状態。

2015/09/05() [n年前の日記]

#1 [cg_tools][dxruby] Tiledのjsonエクスポート仕様がまた変わってた

_Tiled Map Editor というマップエディタを使って背景データ(BGデータ)を作成しているのだけど。0.13.0が公開されていたのでアップデートして作業したら、エクスポートしたjsonが、Ruby + DXRuby で処理できなくなっていて。

今まで、Tiled でエクスポートしたjsonは、レイヤーのタイルの並びがCSV形式のようになってたのだけど。
"data":[209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, (以下略

現在の Tiled は、jsonをエクスポートする際、.tmxファイルを保存する際の「タイルの出力形式」を引き継ぐ仕様になったようで。デフォルトでは「Base64 (zlib圧縮)」になってるから…。
"compression":"zlib",
"data":"eJzt2bdRA0EcRvFVCRIgfCCcsAFOCEkE8tgM0wCmAUwDmAYw7fKCi26 (以下略
"encoding":"base64",
こんな感じで、状況によっては、Base64のデコード?と、zipバイナリの展開が必要になってしまった模様。もちろん、圧縮されてる分、テキスト量はグンと少なくなるわけで、データファイルの容量削減という面ではありがたいのだけど。

一応、「タイルの出力形式」を「CSV」にしておけば、今まで通りのエクスポート結果になるようだけど。うっかり忘れそうだな…。

そういえば、いつの間にか json 中に含まれる画像ファイルのパスが、相対パスになっていたことにも気づいたり。以前は絶対パスで記述されちゃってたので、ディレクトリ部分を除外する処理を追加した記憶があるのだけど。まあ、どう考えても、絶対パスで記述するのは変だよな…。他の環境に移した時に画像ファイルが見つからなくてバグが出るし。相対パスで記述されてるほうが正解、だと思うわけで。

Ruby側での対応。 :

Base64 のデコードは、'base64' を、zlib形式バイナリの展開は 'zlib' を使う。
require 'base64'
require 'zlib'

デコードと展開をしてるところだけ抜き出してメモ。
      if layer.has_key?("encoding") and layer["encoding"] == "base64"
        # base64で記録されてたら変換
        bin_str = Base64.decode64(layer["data"])
      else
        bin_str = layer["data"]
      end

      if layer.has_key?("compression") and layer["compression"] == "zlib"
        # zlibで記録されてたら展開して、unsigned int の配列に変換
        bin_data = Zlib::Inflate.inflate(bin_str)
        lst = bin_data.unpack("I*")
      else
        # csvで記録されてる場合はそのまま
        lst = bin_str
      end
lst に一次元配列が入るので、レイヤーのタイル横個数とタイル縦個数を使って二次元配列に変換すれば、DXRuby の Window.drawTile() でタイルBGが描画できる。

Rubyのtmxライブラリ。 :

Tiled の保存形式、.tmx を直接読み込める tmxライブラリを使えば、わざわざjsonでエクスポートしなくても済むのだけど。

_tmx | RubyGems.org | your community gem host
_shawn42/tmx

tmx は Nokogiri を使ってるので、Nokogiri が Windows + Ruby 上でインストールできなくなってる時には、Nokogiri に依存してる tmx もインストールできなくて。*NIX環境ではすんなりインストールできても、Windows ではダメ、みたいな。

その点、jsonでエクスポートしてソレを使えば、Ruby に標準でついてるライブラリだけでも処理ができるから、tmx を使わなくても済むかなと思ってたけど。Tiled 側がこんな感じで、ちょこちょこ仕様を変えてくるなら、tmx を使ったほうが対応が楽かもしれないよなと…。

2014/09/05(金) [n年前の日記]

#1 [web][neta] 愚痴や悩みをひたすら聞くだけのサービスってどうだろう

HDDレコーダに録画してた花物語を視聴しているうちになんとなく思ったけど。愚痴や悩みをひたすら黙って聞くだけのWebサービスがあったらどうなんだろうと。もしかすると教会の懺悔室に近いのかもしれないけど。

ナントカ知恵袋?が一応ソレに近いのかな。でも、あそこは、もう創作の場になってしまっている気配が。

はてな匿名ダイアリーも、ちょっとそれに近い使い方ができるような気もしてきた。ただ、あそこは、誰も聞いてない・読んでないであろう雰囲気がちょっとあるような。

愚痴や悩みが強制的に全世界に公開されるのも、何か違う気がする。「ここだけの話」として悩みを打ち明けたいという需要もあったりしないのかな。

新興宗教団体などがそういうサービスを展開すれば信者獲得に繋がったりして美味しかったりしないか…。既にやってたりしそうだけど…。

もちろん、内容を聞いて、しかるべき団体・組織を紹介したほうが良いと思われる時はそちらに誘導して…。花物語のソレですな。

#2 [anime] EVAQ+巨神兵東京に現る、を視聴

TV放送されてたので見てみたり。

「巨神兵東京に〜」の感想。 :

「巨神兵東京に〜」は、とにかく映像が凄いなと。さすが樋口監督。

と言っても、特撮展覧会?向けに作った映像だから、おそらくミニチュア特撮技術をアピールするために、CGで素材を作らない等の制約を何かしら設けた上で取り組んだのだろうと想像するわけで。今時はこういう作り方をそもそも選択しないのではないか、と思いながら見ていたので、「映像が凄い」と言っても一般的な映画を見てる時の「凄い」とはちょっとズレてるというか、もしかすると「MZ-700版ゼビウス作りました」みたいな「凄い」に近いのかしらと。喩えとして違う気もするけど。

個人的には、日本の着ぐるみやミニチュアって、技術的進化が見えず、思考停止した「型」になりかけてるのに、そのことに危機感を持たず宗教のように肯定し続ける人が多くて、それほど好きではない ―― いや、正直言って嫌いなのだけど。このくらいの映像になるのであればアリかもと思えたり。偶然生まれる動きやオブジェクトの量がメリットなのだろうか、しかしコスト面ではどうなんだろう、などとぼんやり思いながら堪能させていただきました。何はともあれ、この短編、素晴らしい。

と思ったのだけど。ググってみたら劇場公開版は3DCGでエフェクト増やしてるそうで。ぎゃふん。まあ、巨神兵がおそらくは操演で動いてることに違いは無いのだろうから、ミニチュア特撮として眺めてもいいよな…。

_第11回:樋口真嗣(映画監督・特技監督) | REGULAR | CGWORLD.jp を眺めてたら、「目指した目標がフォトリアルではなく、ミニチュアワークの再現」だったそうで。だとすれば、「またミニチュアにしか見えない特撮やってるよ。ケッ」てな反応があれば大成功だったのだろうか…。なんだかよくわからなくなってきた。

EVAQの感想。 :

EVAQは、話・設定はわけがわからなかったけど、映像は凄かったなと。誰かがQに対して、「庵野のヤツ、またやりやがった!」と評してた記憶があるけど、コレはたしかに「また」だなあ、と笑ってしまったり。

自分、EVAに対しては、TVシリーズのラスト近辺で笑ってしまって以来、真面目に見てもアレだなと思ってるので、相変わらず映像スゲーなあ、ぐらいの感じでして…。正直こういう作りは飽きてるのだけど、EVAに入学する若い層も居るであろうことを考えると、こういうのもアリなのかなと。ヒットもしているみたいだし。

だけど、もうそろそろ、庵野監督の手掛ける「問題作」じゃなくて、庵野監督の手掛ける「名作」を見たいよなと。「トップ」「ナディア」の頃は、ある程度出来てた気もするので、庵野監督の持ち味・強みって、こういうソレだけではないはず、と思いたいのですが。EVAのTVシリーズでああいう作りをした時に、庵野監督とその仲間達は何かに憑りつかれてしまったような気もしていて。庵野版「カリ城」を作ってないうちに「もののけ姫」「千と千尋」を作ることに夢中になってしまった、そんな印象が。なんだかもったいない。

アゴ。 :

それはともかく、作画がおかしくなってるとWebの一部で話題になってたらしいと後になって知ったのだけど。別にそうは見えませんでしたが…。アゴがどうとか言ってる人が居るらしいけど、自分は気にならなかったな…。

そういや、少女漫画でも、絵柄に関してよくアゴがどうとかダメ出しされるのだけど、アレは何なんだろう…? おそらくは女性ファンが多いのであろう、京アニ制作の「Free!」も、アゴがダメ出しされてた場面を見かけたし。

女性は漫画絵のアゴばかり見てるのだろうか? それとも、アゴばかり注目されてしまう絵柄の系統でもあるんだろうか? アゴアゴ言われてしまう際の、その背景・状況が気になります。どうしてアゴばかり気にする人達が出現するのか。漫画絵におけるアゴとは何なのか。みたいな。

2014/09/06追記。 :

巨神兵はワイヤーで吊ってる操演かと思ったら、 _巨大フジアキコ隊員ごっこ: 木全直弘の航星日誌 によると二人羽織なのだそうで。文章だけではどういう状態なのか想像できず。

#3 [web] パクリは何故いかんのが実は自分も分かってない気がする

思考メモです。オチも結論もないです。

たまたまどこかで、パクリは何故いかんのか、と疑問を呈しているらしきWeb記事を目にして、言われてみればそうだなあ、答えられんな、困ったなと。や、中身はほとんど読んでないのですけど。記事名と冒頭だけ眺めて、「そういやそうだ。うーん」と悩んでしまって。

法律で決まってるからとか、法治国家だから、等の物言いでは、件の問いへの真の回答にならないのだよな…。どうしてその法律が必要になったのか、それを守るとどんな効果が期待できるのか、そこまで一応ざっくり説明できないと。その法律が妥当かどうか判断する努力を放棄したまま、宗教のようにそれが正しいはずと信じて運用してるのは危ない状態だし、「単に誰かが勝手に決めたルールだ。俺には関係ない」「ルールなんて破るもんだ」「そもそもルールが間違ってる」と言い出す人を説得できんし。

一時停止の標識の前では一時停止せよ、という法を、まるで校則のような理不尽なルールと思い込んで守らない人は多々居るだろうけど。ここは見通しが悪いところだから一時停止しないと事故の確率が上がるのだ、お前自身が酷い状況に合わないために親切にもヒントを出してくれてるんだよ、どうしてこんなところに一時停止があるんだと疑問を持つときがあるかもしれんが、それはつまり、現地の人は知ってるけれど、お前が気付けない、そんなトラップが仕込まれてる場所なのだ、だから一時停止しときなさい ―― てなところまで説明できれば、一時停止しないのは馬鹿だな、俺が損するわ、と理解できるわけで。

なので、「ルールを守れ」としか言えないようでは回答になってない。「ルールを守れ。なぜなら〜」の「なぜなら〜」の部分が回答としては重要というか、そこで説得力の有無が決まってくるというか。

それとは別に。パクられた側の気持ちになれ、嫌な気持ちになるだろう、他人が嫌がるようなことはするな、という物言いも回答にならないよなと。そのロジックでは、「俺は逆にパクられると嬉しいよ」と言い出す人が出てきたときに是非の判定ができなくなってしまう。

やっかいなことに、「他人が嫌がることをするな」てな論を持ち出す人は、ソレ以外の反応をする人達の存在をなかなか想像できないところがあって。「パクられると嬉しいヤツなんて居るわけない」と言い出したり、実際出現すると「そんなの例外だ」「異常だ」「コイツは嘘をついてる」等の否定しか出てこないであろうことは容易に想像できてしまうし。そして、そういう反応しか出てこないなと既に見えちゃってる頭のイイ人は、天邪鬼っぽく、わざとらしく、「いや、俺はパクられると嬉しいんですけど?」などと言い出して相手をからかう、みたいな展開すら予測できるわけで。

結局、感情という不確かなもの、個によって異なる可能性が高い何かを拠り所にして是非を判定しているようでは、反した感情が出現した時に容易に判定結果も反転してしまうわけで…。同じ思考・価値観しか持たない集団の中ではそういう物言いも有効だろうけど、異物が入ってきたときに対処できない。よって、回答としては危ういわけで。情に訴える説得は、情を持ってない人には通じないというか。

てなことを考えていくと、ここは一つ、風が吹けば桶屋が儲かるのノリで回答を用意しないといかんのだろうなと。パクリを許容すると、こうなってこうなってこうなるけど、パクリを禁止すれば、こうなってこうなってこうなる。これこれこういう効果が期待できるだろう? お前にとっても、俺にとっても、損にはならない展開だろう? それは社会を維持する上でメリットになるだろう? だからパクリはいかんのだ、みたいな。

おそらくそういうロジックが提示できれば多少は説得力が出てくる・反論しにくくなるのだろうけど。…ただ、自分は頭が悪いので、こうなってこうなってこうなる、の部分を考え出せないので、答えられんな、困ったな、と思ってしまったという、ただそれだけの話なわけですけど。答えられないってことは、実はパクリって許容されてもいいのだろうか。 パクリはいかんと自分達は思い込まされてるだけじゃないのか。どうなんだろう。誰か頭のイイ人が論陣を張ってくれないものか。などと他力本願なことを望んでしまったりもして。

そもそも、パクリ、オマージュ、インスパイア、引用、等々の定義がぼんやりしてたら、回答を捻り出すのも難しいですな…。そこで言ってるパクリってのは、具体的にはどういう行為なのか、明確になってないと…。

実のところ、「パクリは何故いかんのか」と言い出す人にも、回答を本当に求めている人と、そうではない人の2種類がありそう。後者の前では、説得力云々は関係ないよな…。どうせ何を言っても次々に変な言い訳して煙に巻くのだろうし…。幼児が何か悪さをした時にその行為を叱っても、「だって○○が…」とわけわかんないことをいつまでも言い続けるのと同じというか。その行為のデメリットをどれだけ力説しても届かないよな…。

オチは無いです。ただの思考メモです。

Webって、いや、コンピュータ関係のアレコレって、寸分違わぬコピーを繰り返すことで成り立つ仕組みが基礎にあるから、そういう視点で考えていくとなんだか悩んでしまうなと。パクリ=コピーと捉えて、かつ、パクリは許されぬ行為だと言い張ると、Webの存在自体が許されないことに。良否の境界はどこにあるんですか、という話に。面倒臭い。

2013/09/05(木) [n年前の日記]

#1 [nitijyou] 自宅サーバ止めてました

雷が鳴ったので、03:30-07:20の間、自宅サーバを止めてました。申し訳ないです。

夜中の3:00頃からドーン、ドーン、と…。04:00〜05:00には、バリバリバリチュワオーン、と…。サーバとメインPCは、コンセントスイッチを切ってLANケーブル引っこ抜いてたから大丈夫かなと思うけど、それ以外で何か壊れててもおかしくないよなと…。

#2 [cg_tools] ImageMagickで画像の結合

作業メモ。例えば、64x64ドット、アルファチャンネルつきpng、20枚程度を、1枚のアルファチャンネルつきpng画像に結合したければ、ImagemMagick の montage が使える。
montage -tile 8x8 -geometry 64x64 -background none runtest_*.png output.png

_Montage -- IM v6 Examples

#3 [cg_tools] MMDを勉強中

走りや歩きのアニメをするドット絵を書くための下絵用に、MMDで動画を出力して、それを元にして…てな作業をしようとしていたのだけど。

MMDから出力されたソレの変換結果画像が、意外とイイ感じで。これはもしかすると、ドット絵を描かずに、MMDの出力結果を加工・若干修正して、比較的そのままの形でゲーム画面に出したほうがいいんじゃないかと思えてきたり。

となると、元になるMMDモデル(pmdファイル)のライセンスが重要になってくる。レンダリング結果をゲーム画面内に出すことも許可されているMMDモデルデータがあればいいけれど。そんなモデルデータは、あるんかいな?

制限が緩いMMDモデルデータが見つからず。 :

あちこち検索してみたものの。予想通り、どのモデルデータもライセンス面が厳しくて。以下は単に印象だけど…。
  • 一般的に普及してる「○○ライセンス」等の単語を一切使わず、制限事項をひたすら羅列したオレオレライセンス・ガラパゴスライセンスがほとんど。
  • 大半は、商用利用禁止。改造禁止。加工禁止。再配布禁止。アダルトへの利用禁止。…要するに、アレもコレも全部禁止。
  • すると一体何に使えるのかと言えば、MMDで作った動画をニコニコ動画やYouTubeにアップする程度なら許すよ、みたいな感じで。
なかなか厳しい。この調子では、レンダリング結果をゲーム用に使うなんてのはもちろん禁止、だろうなと。加工の範疇に入るだろうし。

もちろん、それぞれのモデルデータを作る際に、一体どれだけ苦労したのかを想像すれば、制限が厳しいのは当たり前だよなと。それに元々、誰かに使ってもらいたくて作ったわけではなく、動画を作る際に必要だから作ったのであろうものを少しお裾分け、みたいな感覚で公開してる方がほとんどだろうと。だから、これは自然な流れ、仕方ない話、と思うわけですが。

にしても、モデルデータを紹介する際に、ライセンス面も紹介しておいてくれたら助かるのに…と思ったけれど、オレオレライセンスばかりだから説明のしようもないのか。下手すると紹介文より制限事項の記述のほうが多くなりそう。コミュニティ間でやり取りする際にちょっと面倒な状態になってないか。そのあたりを解消するために、CCライセンスその他が存在すると思うのだけど、どうして日本のMMD職人さん達はそのあたりをガン無視するのか、ちと疑問が湧いたりもして。

あ、そうか。MMDで使って動画にすることを前提にしてるモデルデータだから、そこだけOK、他はNG、と言っておけばコミュニティ内では充分、なので、コミュニティ外が提唱したライセンスを使う必要性を感じないのだな。なんだか納得。でも、閉じてるなあ…。同人文化って昔からそういうノリだけど、デジタルデータが普及した現代では創作物が違う分野へ活用される展開もあり得るわけで、何かこう…。いや、逆にそういう展開を予防したい人が多いからこうなってるのか。なんだかそのへん難しいというか、もったいない気もするけど、現状は仕方ないのだろうな。

pmdの作り方が分からない。 :

制限が厳しいモデルデータばかりに遭遇したことで、これはやっぱり自分でモデルデータを作るしかないのかな、と。

てなわけで、pmdファイルを作成する手順について調べ始めたのだけど。これがまた、よくわからない。情報がやたらと分散しているというか、新旧の情報の見分けがつかないというか。

Metasequoia でモデルデータを作り、.xファイル ―― DirectXで使うファイルフォーマットらしい ―― で出力して、それを RokDeBone2 に通して、といった内容が _VPVP wiki - モデルデータ作成までの流れ に書いてあるのだけど。その RokDeBone2 が、そもそも見つからなかったり。

_MDJ:Easy3D(RokDeBone2)の公式サイト消滅と今後 という解説記事によると、今年になってから、公式サイトが作者様の思想的な理由で消滅して、今後も公開される予定はないらしい。というかそもそも、RokDeBone2 は有料ソフトだったらしいけど。ということは、これからモデルデータを作りたいと思った人は門前払いなのだろうか…。

と思ったら、Metasequoia + PMDEditor で作れるという話もあれば、Metasequoia + keynoteプラグインが必要という話もあって。そもそも何を使って作れるのか、そこからして今一つわからない。結局、RokDeBone2 は必要なのか、必要じゃないのか。無くても作れるけど苦労するとかそういう話なのか。そんな感じで、分かりやすい情報、最新のチュートリアルに遭遇できずに困ってしまったり。

いっそのこと、MMD を使ってどうにかするのは諦めて、最初から終わりまで blender でモデルデータ作成+アニメーション作成までやってしまったほうがいいのだろうか…。MakeHuman で人体モデルを作って、全裸で走るプレイヤーキャラ画像を…。なんだかやっかいな話になってきた…。

などと困りながら検索していたら、「モブ子さん」と出会えたのです。

「モブ子さん」は女神様。 :

_matoさんのぶろぐ PMCAv0.0.6について にて、PMCA(PMD Mob Character Assembler) という、パーツを組み合わせてpmdモデルを生成できるソフトが紹介・公開されているのだけど。このソフトで作れるシリーズが、 _通称「モブ子さん」 と呼ばれているそうで。

このソフト、ありがたいことに、使ってるパーツのライセンスがパブリックドメインなので、合成したモデルデータもパブリックドメイン相当で。これなら、加工その他の制限も無く。また、ローポリで作られている点も、ゲーム用の素材としては助かるわけで。ありがたい。このソフトは素晴らしい。作者様、ありがとう。モブ子さんが女神に見える…。

なんとなくだけど。○○式モデルなるソレは、芸能界のアイドルみたいなもんだなと。まず会えない。会話もさせてもらえない。握手もしてもらえない。雲の上の存在。自分のPCの画面の中で動いてるのに雲の上の存在ってなんか変だけど、ライセンス面ではそういう存在。

それに比べるとモブ子さんは、学校で同じクラスの、フツーに会話もしてくれる、ちょっと可愛い女の子。学生映画撮りたいんだけど主演やってくれない? とお願いしたら快諾してくれそうな存在。…それぞれのライセンスの違いからして、そんな印象を受けました。

ということで、モブ子さんでゲーム用のキャラ画像を作成開始。ありがとう、モブ子さん。ありがとう、作者様。

にしても、Haxe を勉強してみるかと思っていたはずなのに、どうしてこうなった。>自分。

2012/09/05(水) [n年前の日記]

#1 [flash][starling] Starlingを再勉強中

先日、 _Texture Atlas用の画像とxmlを生成するPythonスクリプト を書いたので、ようやく本来の Starling の勉強を再開。

Starling の MovieClip を使えば、Texture Atlas の画像とxmlを使って、パラパラアニメ(?)が表示できるのだけど。どうも表示がおかしい。元画像をそのまま並べた画像と、元画像の余分な部分を削除(いわゆるtrim)して配置した画像の2種類で表示してみたら、表示結果が違っていて。前者は問題無いけれど、後者はコマによって画像が拡大されて表示されてしまう。どうも、MovieClip で表示する際に使う領域 ―― uv座標領域とでも言えばいいのかな ―― は、全て同じサイズになってないといけない模様。

Starling に渡す xml では、そのあたりも規定してるようで。 _TextureAtlas - Starling Framework Reference を見ると、frameX, frameY, frameWidth, framwHeight という要素?で指定するらしい。が、それぞれが何の値を示しているのかよく分からず。

何にせよ、先日書いたスクリプトは、--trim をつけないで使う分には問題無いけど、--trim を使うなら修正が必要だなと。

全然関係ないけど。Flash CS6 には、Texture Atlas用の画像とxmlを生成する機能が追加されているらしいので、Flash CS6 を持っている人なら、このへん全然関係ない話。

#2 [python] PILを勉強中

透明色を指定したインデックスカラーのPNG画像を、背景色が青の新規画像に貼り付け(paste)しようとしたのだけど。透明部分は、青になるはずなのに、元画像の透明色で塗り潰されてしまってハマる。

_python - Transparent PNG in PIL turns out not to be transparent - Stack Overflow を見て解決。
from PIL import Image
img = Image.open(basefile)
layer = Image.open(layerfile) # this file is the transparent one
print layer.mode # RGBA
img.paste(layer, (xoff, yoff), mask=layer)
# the transparancy layer will be used as the mask
img.save(outfile)
maskを指定すれば良かったのか…。

2011/09/05(月) [n年前の日記]

#1 [anime] うさぎドロップアニメ版5話を見たのだけど

やっぱりアニメ版を見た後で原作を読むのがベストだなと再認識。原作を先に読んでしまうと脳内に理想の映像が出来てしまって、ツライ…。「えー、これは端折り過ぎだろ」とか「キャラの心情が全然分からねえじゃん」とか気に入らないところが多々出てきてしまって実にツライ。

アニメ版を見ていてなんとなく思ったけれど。どうやら、キャラのモノローグを徹底的に排除して映像化する、という方針がありそうな気がした。原作は、少女マンガやレディースコミックの文法で作られているので、キャラの心情・苦悩を逐一モノローグを使って細かく解説するやり方が積極的に使われている。なので、アニメ版でそのあたりをバッサリ削除してしまうと、その時々でそのキャラが一体何を考えていたのか、何について悩んでいたのか、そういった情報が視聴者にまったく伝わってこない。ただ、その代わり、キャラの会話のみが延々と続く映像になっているので、キャラ達の振舞いを傍からボーッと眺めているような感覚で視聴することになる。つまり、パッと見はリアルっぽくなる、のであろうと自分は捉えているわけだけど。

モノローグ多用、モノローグ排除、どちらを選ぶかは、実はどうでもいい。問題は、モノローグ排除に伴って失われた、「その時キャラが何を考えていたのか」という、読者・視聴者への情報開示を、別の方法で実現しようという意思が全く見られなかったこと。

モノローグが無くても、最低限、「キャラがその時何かを悩んでいる・考え込んでいる、らしい」ということぐらいは、振舞いなり台詞なりを原作のソレから積極的に改変していくことで充分伝えられるはず。だが、そういう工夫がアニメ版にはまったく見られない。各キャラの行動も、台詞も、原作とほぼ同じ。トレースに近い。しかし、心情解説はバッサリ省かれている。

個人的には、それじゃダメじゃないかなー、と思う。漫画におけるキャラの心情解説は、読者がキャラに感情移入していくための呼び水。そこを省いてしまったら、見る側の感情移入を誘えない。感情移入を誘えない娯楽コンテンツはマズい。娯楽コンテンツにならないだろう…。例えば石川賢の漫画のように展開でグイグイ引っ張るタイプならともかく、キャラの心情変化を見せることが肝になってるこの手のジャンルの作品で、それはマズかろうと。

このあたり、作り手の属性によるのかな、と邪推したりもする。例えば、少女マンガの類をほとんど読んだことが無い人にとっては、モノローグはただひたすらウザいもの、としか思えないのかもしれない。だからバッサリ削除してやろう、という判断になったのかもしれないと。でも、モノローグのそれぞれは、無駄に挿入されているわけじゃない。ここでキャラがこういうことを悩んでると教えておかないと、後で出てくる行動が読者にとって理解できない、等々、ある種シリーズ構成にすら絡んできたりもする。…そういうところまでちゃんと考えたうえで、モノローグ排除を選択したのか? 排除したことで失われたモノを一切補完しようとしないのは何故ですか? とスタッフに問いたい気分になったわけで。

要するに…ちゃんと原作を読み込んだ上で作ってるのかなあ、なんだか怪しいなあ、と。

でもまあ、 そういう割り切り方もアリなのかもしれないのでアレですが。特に後者は…個人的にアリ。一点豪華主義は自分も好き。そこはバッチリクリアできている・原作より随分可愛らしく見えてるし。だったら、まあいいのかなあ、という気も。

2010/09/05() [n年前の日記]

#1 [digital][sound] AmazonからICレコーダが届いた

オリンパス V-85。代引手数料、お急ぎ便手数料込みで、12,982円。リニアPCM(16bit、44.1KHz)で録音可能。FMラジオ受信機能付き。

ニッケル水素充電池が付属していた。USB接続している最中に充電することが可能らしい。充電には3時間ほどかかる模様。

電源を入れると、電池の種類を選択する画面が表示される。ニッケル水素充電池とアルカリ電池のどちらかを選ぶ。その後時計を設定。時計の設定まで終わった段階で、USB接続して、3時間ほど充電。充電すると画面の右上に「F」の文字が表示される。

FMラジオ機能は、付属のイヤホンをアンテナ代わりにして受信するらしい。部屋の中では電波が弱いのか受信できなかった。窓際でかろうじて受信できたが、ノイズが多い。イヤホンコードにノイズが載っているのかもしれない。

録音してみたが、意外にノイズが大きい。絶えず、サーッという感じのノイズが載っている。失敗したか…?

あちこち手軽に持ち歩いて録音できるあたりはヨサゲ。

2009/09/05() [n年前の日記]

#1 [anime] ジャンルグル大帝2009年版を鑑賞

谷口監督作品ということで、興味津々で鑑賞。

ジャングル大帝を今リメイクするならどういう設定にするか、的な妄想を自分もちょっぴりしてたことがあるのだけど。設定が自分の妄想と若干似ていたせいもあって、実に興味深く鑑賞できた。やっぱりプロはスゲエと感心することしきり。しかもラストは、 単純にハッピーエンドではなさそうな雰囲気がどことなく匂っていて。ああいう見せ方は好み。

関連実況スレ等を眺めていたら、 人語を理解する側が原作とは真逆・鏡映しになっていたとか、 父と子というキャラ配置が動物側と人間側の双方に用意されていたとか、 博士がクローンじゃないのかとか、 いやいや実は男の子がクローンではないのかとか、 クローンという点ではこの作品自体過去に存在していた原作のクローンとも言えるとか、そういった言を見かけたことで更に面白く感じたり。「今リメイクするなら」というお題の前で、設定やキャラ配置に関して結構考えられていたのかもしれない、という印象が強くなってきた。実際はどうだったか判らないけど。

作画面はとにかく豪華だなと感心。特に、原画陣の中に、「海のトリトン」の羽根章悦さんの名前があって「おおー」と。ここ最近NHK-BS2で「海のトリトン」が放映中で、そこそこ鑑賞してるので、名前を目にしてなんだか嬉しかったり。いや、どの程度原画を描いたのかは判らないけど。ていうか、谷口守泰さんその他の名前もあって、とにかく「おおー」と。…やっぱり動物を描くのはベテラン勢のほうが上手いのかしら。判らんけど。

2008/09/05(金) [n年前の日記]

#1 [iappli] 今日もバイナリを送った

背景の中景画像が届いたので差し替え。しかし、仮画像と比べると描き込まれている領域が狭く、近景の画像でほとんど隠れてしまう。仕方ないので表示位置を上のほうにずらしたが、今度はスクロールした時に下のほうが切れてしまう。これまた仕方ないのでスクロール量を調整。近景とほぼ同じ量でスクロールさせることに。せっかくの多重スクロールが…。うう…。

ジングルとSEデータが届いたので差し替え。 :

ジングルは鳴らす場面が難しい。メールには「ここで鳴らして」「ここでも鳴らして」と指示があるけれど。ジングルというのはBGMと同様メロディー的なものを持っている音の種類だから、BGMを鳴らしながらジングルを流すとBGMが2つ鳴ってる状態にほぼ等しくなって聴いていて実に気持ちが悪い。かといって、ジングル再生の度にBGMを止めて、ジングル再生終了時にまたBGMを再生すると、BGMの出だしばかりを延々と聞かされるわけで、それもまた気持ちが悪い。ゲーム本編中に頻繁になる音は、できるだけメロディー的なものを感じさせない、ある意味音楽的には無個性とも言えるSEのほうがいいのではないか、と思わないでもないのですが、どうなのよ。

ジングル再生中だけBGMの音量を下げる、とかできないかな。でもiアプリでそんなこと出来るんだろうか。再生開始時に音量を変えるのは今現在も出来てはいるけど…。

APIのドキュメントを眺めたら、なんだかできそうな感じ。AudioPresenter の SET_VOLUME に関して、「再生開始後に設定した場合はその時点からボリュームが変化します。」とあるし。であれば、後は、ジングル再生開始・終了と同時にBGM音量を変化させるあたりの管理処理をどう実装するか…。ゲーム本編途中から抜けて別の画面に移った時にBGM音量が下がったまま、的バグが入りそうな予感。

#2 [nitijyou] ちと体調がよろしくない

頭がボーッとするというか、眠いというか。

ダメ人間的な生活を送ってる代わりに、睡眠時間だけはちゃんと取れているので、作業が舞い込んでも比較的集中して作業ができてる、つもりではあるけれど。ちょっと今日はそのへんよろしくない。

2007/09/05(水) [n年前の日記]

#1 [digital] IMG_????.JPGと_MG_????.JPG

親父さんのデジカメ Canon EOS Kiss Digital が、いつの頃からか「_MG_????.JPG」というファイル名で画像を保存するようになった、てな相談を受けた。

CFカードが壊れてるのかと思い、自分のデジカメ Canon PowerShot A300 で、該当CFカードを使ってみたり。…「IMG_????.JPG」で保存される。ということは、記録メディアが壊れてるわけではなく。

EOS Kiss Digital に、A300で撮影したままのCFを突っ込んで親父さんPCで取り込んだところ、「IMG_????.JPG」で取り込みができた。ということは、親父さんのPC環境に問題があるわけでもなく。

その後、EOS Kiss Digital で撮影した画像を取り込んだら、「_MG_????.JPG」になった。ということは、EOS Kiss Digital が、_MG_*.JPG というファイル名で記録してるのだろうと。

検索したら、原因が判った。なんでも、色空間・カラースペース設定が sRGB の場合は「IMG_」になるが、Adobe RGB にすると「_MG_」になるらしい。仕様だったのか。

#2 [anime] _お父さんと一緒に作るガンプラ講座

今はHGとかMGとかで区分けされていたのか。そんなことすら知らなかった自分。

2006/09/05(火) [n年前の日記]

#1 [nitijyou] 床屋に行ってきた

いつもどおりスポーツ刈りに。

店員さんに要望を出す段階で、ちと伝達が上手くいかなかった。途中で面倒臭くなって、全部「フツーで」とお願いすることに。…要望を出してみたところで、結局は店員さんが慣れてるやり方・仕上がりになるのだから、最初から「フツーで」と言っとけば良かったのだな。ちと失敗。

#2 [wiki] FreeStyleWiki と Pukiwiki を設置

最初は FreeStyleWiki を設置したのだけど。どうも動作が重くて。

Pukiwiki を設置してみたら、はるかに動作が軽かった。が、検索欄をサイドバーに置けない、ソースを見るのが面倒、等々の不満が。どうしたもんか。

2005/09/05(月) [n年前の日記]

#1 [nitijyou] なんだか体がダルイ

手足が重い。気温が急に下がったせいだろうか。

#2 [nitijyou] 近所にオープンしたセブンイレブンに行ってきた

FaimlyMartより駐車場ははるかに広い。が、止まってる台数は FamilyMart とそんなに違わないような。微妙だな…。元々FamilyMart 1店舗で吸収しきれてなかった客数を、吸収できるようになったということだろうか。

男の子のバイトの周りを女子高生がウロウロ。男の子のバイトに何か話かけてるのが気になった。彼女であろうか。バイトの時間が終わるのを待ってるのだろうか。羨ましいかぎり。チッ。つーか、おにぎりコーナーの前にバイト全員が集まって話し込んでるのが気になった。開店して日が経ってないから、研修中(?)なのかな。それとも何か問題が発生したか。

レジで、煙草は置いてないのかと尋ねたら、現在申請中という返事が。完全に商品を揃えてある状態ではないらしい。

#3 [zatta] _1円も寄付されないホワイトバンド [ GARAKUTA ICHI ]

_FrontPage - ホワイトバンドの問題点

上手い商売を考える人が居るもんだ。 _(via del.icio.us/otsune)

#4 [zatta] _日本という国家の政策が、国力とか国益ではなく、省益によって決定されるという現実

_国力を保つ為には、国が税金を取りやすい麻薬を国民に適度に摂取してもらう方が好ましい
_たばこ税も酒税もあるのに茶税?は存在しないよなぁ

アニメ税や漫画税やゲーム税やモー娘。税を作ったらどうなるだろうと一瞬思ったり。<作ってどうするねん。

さておき、「国力・国益ではなく省益で決定」という話になんだか目ウロコ。厚生労働省と財務省の戦いによって喫煙者の未来は決まる。らしい。

プラスのアクションだから喫煙する若い世代が増えるのだろうか :

煙草を吸わない状態をゼロとすると、煙草を吸う状態は、“健康に対する影響は別として”“あくまで見た目に関して”は「属性が +1」された状態に見える。 *1 そこが「ファッション」として魅力的なのかもしれない、という気がしていて。

人間というのは、歳を取ると同時に「属性」がプラスされていく状態が「良いこと」とされる。日本語だけしか話せないより英語も話せたほうが「良し」とされるし、楽器を演奏できないより何かしら演奏できたほうが「良し」とされるし。童貞よりは童貞じゃないほうが「良し」とされるし。RPGのプレイヤーキャラは武器を持ってないより持ってるほうが「良し」とされるし。たとえそれが「呪われた剣」でも。

つまりは若い世代 ―― 子供たちにとって、煙草を吸えないより吸えた方が「良し」に見えるのではなかろうか。というか喫煙を始めてしまう子供たちはまず間違いなくそう捉えてるはず。喫煙という「いけないこと」が実行できてしまう自分。俺ってスゴイ。カッコイイ。みたいな。また周囲にそういう人間が多いと「喫煙できる」ことがそのコミュニティでは「デフォルト」になる。それら「デフォルト」になってない子供たちは焦る。俺はデフォルトに達することのできない人間なのか。ダメ人間なのか。その悩み方はまるで童貞が童貞であることを悩むかのごとく。で、吸い始める。童貞脱出は相手が居なけりゃできないけど、喫煙は煙草買ってくればできるから楽なもんだ。ミッションクリア。「ふるちん」は喫煙の剣を手に入れた。いや、勝手な想像だけど。

ということでここは一つ喫煙に代わる、「属性がプラスされたかのように見えて」「健康上の影響はなくて」「いけないこととして世間一般には認識されがち」なアクションを新たに考案して普及させれば、もしかすると喫煙などという行為はあっさり消滅…は、しないわな。そもそもそんな便利なアクションなんて誰も発案できないだろうし。

もしくはもう一つ次のステップを用意する。喫煙を卒業できた人間は更に「良し」という社会的風潮を作るとか。無理か。犯罪を起こしたけど更生した人間のほうが、犯罪を起こしてない人間よりレベルが上…。そういう評価に近いよな。そんな話を許せる人間がそうそう居るとも思えんし。やっぱり無理。

煙草節約カウンターを270円で売るのはどうか :

ちょうど煙草1箱の大きさのカウンター。「吸いたいなー」と思ったらボタンを押す。煙草1本分の金額が加算される。そんなカウンター。目の前に数字として「いくら儲けたか(節約したか)」が表示されると、禁煙する意欲も持続するんじゃないか、みたいな。…既にどこかで作ってそうだなぁ。

_禁煙カウンター QuitSmoking - Windows版 :

Windows版のみならず、JavaScript版や iアプリ版もあるらしい。やはり既にあったか。特に iアプリ版はナイスかも。携帯なら常に持ち歩きが出来るし。ScreenShotを見ると、27万円も節約できてる。

_禁煙マラソンカウンター
レアな使い方としては、タバコを吸い始めた時期をインプットすれば、今まで煙に消えた金額も親切に計算してくれるので、ガッカリして下さい。
うわ。気になる機能。

*1: おそらく非喫煙者は「健康に害があるから +1 じゃなくて -1 だろう」とか言い始めそうだけど、そういう発言をしちゃう時点で何を基準にして話をしてるのか判ってないだろうなぁ。絵にして比べてみれば判ると思うんだけど、そこまでやるのは面倒くさい。

#5 [jiji] _今回のハリケーンの被害は、非難命令にも関わらず逃げるための交通手段も持たず、避難先のホテル代も払うことが出来ない人達が「予想に反して」10万人も市内に残ったために大きくなった

なるほど、やはり貧困層だったのか…。

#6 [web] _他人の成果をパクって自分のものにして憚らない、指摘されればだんまりを決め込んでごまかす学者世界の素顔を垣間見た

_高木浩光@自宅の日記 - 「一切の著作権その他知的財産権」という定型句

教育情報ナショナルセンター(NICER)が行った、「KAKASI」を利用した「れじぶら」のライセンス問題隠蔽事件。まあ、去年の話だけど気になる話なのでメモ。結局どうなったのであろう。いくらなんでも真っ当な組織であれば、経緯と結果を報告することぐらいはできそうな気もするけど…。こういう場面で黙秘するなんて、子供たちに見せる大人の姿としてはちょっとどうかと思うし。 *1 _(via 読書記録ChangeLog)
*1: つーか条件満たせば配布可能なのとちゃうんやろか…。どうしてこんな展開になるのか不思議。

#7 [pc] _USB Mass Storage Support 1.3.5 に関する情報とソフトウェアのダウンロード

MacOS 8.6 でUSBメモリ等を利用しようとする場合、USB Mass Storage Support とやらをインストールしないといけないらしい。メモ。

2004/09/05() [n年前の日記]

#1 [nitijyou] 朝から雨

結構降ってるなぁ。

#2 [nitijyou] 福島県知事選の投票をしてきた

現知事ともう1人の、2人しか出てないけど。現知事が当選するのは確実だけど。投票してきた。投票したからには後で文句も言えるだろう。というか文句を言うためだけに投票してるのだけど>自分。

#3 [game][neta] コントローラのボタンを押すの面倒臭いなぁ

動作確認と称して、PS1でレースゲームとか遊んでたんだけど。何度も同じステージを遊ぶの、面倒臭いな。PCからPS1のコントローラを制御して、プレイできないかしら。…DTMってあるじゃないスか。リアルタイム入力もできるけど、ピアノロール画面で入力するなり、ステップ入力できるわけで。それのゲーム版というか。そういうのはどうか。

なんかおかしなことを口走ってるような気がしないでもない。

この記事へのツッコミ

Re: コントローラのボタンを押すの面倒臭いなぁ by otsune    2004/09/06 04:05
PAR(プロアクションリプレイ)?
Re: コントローラのボタンを押すの面倒臭いなぁ by mieki256    2004/09/06 19:28
> PAR(プロアクションリプレイ)?

(・∀・) !!

#4 [game] MEGA-CDは動作するなぁ

PS1と違って読み込みエラーも起きない。機械自体は古いのに。…CD-ROMドライブのイジメ具合がそもそも違うか。昔のCD-ROMゲームは、一度読んだら後は音楽を流すぐらいだし。

2003/09/05(金) [n年前の日記]

#1 [pc][linux][gentoo] emerg -u world にかかった時間

6時間ぐらいだった。寝てる間に終わっていてくれて助かった。

#2 [pc][linux][gentoo] X関連の設定でいくつか問題・疑問が出てきた

昨日あたりから調べてるけど解決策がわからない。

kterm , mlterm 上でのみ Delete キーが Backspace キーになってしまう :

Linuxコンソール , xterm , rxvt においては、Deleteキーは正しくDeleteキーとして動作してるのだけど。なぜか、kterm と mlterm 上では、DeleteキーがBackspaceキーと全く同じ動きをしてる。 *1 〜inputrc 云々を設定することで解決できるという情報は見つけたものの、それをすると今まで正常に入力できていた xterm や rxvt で、Deleteの動作ではなく「~」だけが表示されるだけになってしまうので解決にならない。X が全般的にそういう動作をしてるならまだ解決策がありそうだけど、何故に kterm と mlterm だけが…謎。

日本語入力中の文字が汚い :

rxvt、あるいは Mozilla において日本語入力を行おうとすると、変換前の文字列が、横方向に潰れたり、汚い太字で表示されてしまう。これでは何を打ち込んでいるのかわからない。おそらく、漢字かつbold属性のフォント設定が問題のような気がする。問題が出ていないアプリは、そもそも漢字フォントのbold属性を無視・手抜きしてるとかじゃなかろうか。わからないけど。

kdm利用時は .xinitrc も .xsession も呼ばれてないのか :

xdm や gdm に比べて kdmは、ユーザ名や起動するウインドウマネージャを、マウスクリックで選択できるのでgoodなのだけど。起動するウインドウマネージャ項目で、Xsession以外を選ぶと、.xinitrc も .xsession も見ずにいきなりウインドウマネージャを起動してしまう感じで困ってたり。 .xinitrc や .xsession 中で kinput2 を呼んでるので、それらを無視されてしまうと日本語入力すらできなくなる。 *2 どのスクリプトにそれら処理を書けばいいのやら。

Mozilla の表示画面が汚い :

以前、Vine上で、NetscapeNavigator の表示画面における文字の汚さに愕然としたものだけど。それよりはマシになってるものの、どうも文字が汚くて読みづらい。kochi-なんとかやshinonomeは入ってるのだけど…フォントのオススメ設定情報を探してたり。

*1: カーソルの一文字前の文字を削除してしまい、その場の文字を削除してくれない。
*2: 必ず起動するものを後から呼ぶのも馬鹿馬鹿しい。最初から起動させておかないと…。

2002/09/05(木) [n年前の日記]

#1 ページデザイン

昨晩は雷が鳴ってたもんで、怖くてPC触れませんでしたよ。トホ

というわけで、各ページをシンプルにしました。
どうせもうイラスト系サイトの類じゃなくなってますしね。開き直りました。
凝るのはヤメ。軽いのが一番。

2001/09/05(水) [n年前の日記]

#1 フレッツその後

家族と交渉したところ、フレッツADSLを申し込めそうな感じに。

今のみかか代を考えると、フレッツxxを導入すれば、数ヶ月でルータ分ぐらいは軽く浮いちゃうのが確実という事もあり…
また、フレッツISDNで契約しても将来的にはフレッツADSLに変更する可能性は高いのだから、面倒臭いのでこの際そこまでやってしまおうという流れもあり…

ちなみに、階下でルータPC電源入れっぱなし案は、予想どおり家族に却下されました (^^;

そんなわけで、早速NTT東日本のサイトで予約申し込み。
ただし、情報入力等は、親父さんと二人でページを見ながら作業。
オイラ一人でやればサクサクできるけど、それでは家族が申し込みの流れを把握しない状態に。それは避けたいので。

後はNTTから
「あなたの地区は回線状況的にサービスを提供できません」
と連絡されないことを祈るのみ…
基本的にNTTって信用ならんし、大丈夫かなぁ…
面倒臭がってちゃんと調べず「できません」とか言われたらやだな。そういう話よく聞くし。
その場合、光ファイバーが来るまで、ISDNで我慢するしかないのだろうな。
でも、このへんって光ファイバー来るんだろうか。期待できないような。
といった具合に、現在不信感・不安感で一杯。


心理学の授業で、人間が持つ欲求のレベルには何段階かあるとか聞いた記憶が。
詳しいことはサッパリと忘れたんですが、なんかピラミッド状だったような。
下の階層の欲求を満たせないと、上の階層の欲求が生まれてこないとかなんとか。

トキワ荘の面々が燃えていたのは、漫画を描くことで売れる=飯が食える…
自分の仕事が、食欲に相当する欲求レベル達成と、直結してたからだろうか。
いや、違う気もする。次の段階の欲求レベルのような気も。

何故そんなことを考えてたかと言うと。
仮に、名前を売りたいとか、自分の名を世間に広めたいといった欲求レベルが本人の中で存在しているとしたら。
会社員ではなく、フリーで仕事をするほうが、その欲求レベルを満たせる可能性が高くなるのかなぁ…
などと漠然と思ったりしたからで。

それはそうと、オイラ自身の持つ欲求のレベルって、一体どの階層に相当するんだろう。
自分自身でそれが認識できたら、その先に起こすべきアクションも、見通せたりするのだろうか。
いや、それも違うか。
それは、自分を不自由にするビリーフ(文章記述・思いこみ)を、自分に与えてしまうことになりそうな気も。

2000/09/05(火) [n年前の日記]

#1 いつのまに…

雨。
教習所から帰ってくる間にびしょ濡れ。トホホ

学科の問題集をしていたはずが。
いつのまに、オイラはPSパッドを握って攻殻をしてるのだらう。
意思弱すぎ。

いや、一応やりましたけど>問題集
でももうこんな時間。
明日朝から歯医者なのに起きられるんだろうか。

1999/09/05() [n年前の日記]

#1 (NoTitle)夜通しHDDの整理をし...

夜通しHDDの整理をしていたけど、お昼ぐらいにダウン。起床PM7:00。でも3.5Gぐらいには減った。

画像変換用の便利なツールはないかと探してるのだけど、中々ないものですね。
欲しい機能は、
・サブフォルダまで検索して変換してくれる。
・変換後元画像を自動消去してくれる。
・拡張子でのソート表示可能。
…なんですが。何かのファイラーと組み合わせて処理したほうがいいのかな。なんかお薦めのファイラーってあります?

電話代が予想以上の額になってビックリ。使い方考えないと。しかしテレホタイムって全然繋がらないわけで。プロバイダ変えるかな…ってこのへんにプロバイダなんて数えるほどしかないわけで。変えたくたって変えられないのよん ┐(´-`)┌

サブマシンも調子悪くなってきました。たいしたアプリは入れてないはずなんだけど。ネットを見てたら似たような症状を発見。こりゃOSかIE5の問題だ、たぶん。でもネスケ使いたくないし。アレもアレで色々不都合があるんで。困った。

以上、25 日分です。

過去ログ表示

Prev - 2024/03 - Next
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project