日曜日, 12月 22, 2024

Let's start JavaScript 49 
HTML上でmm、pixel、ppi計算ツール

過去にVisual Studio Basicで作成していますが、Windows環境オンリーなのでHTML版を模索してみました。


<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport"
        content="width=device-width, initial-scale=1.0">
<title>mm, pixel, ppi 計算ツール</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
text-align: center;
}
.input_box {
margin: 0px auto;
width: 350px;
height: 150px;
background-color: #e5e4e6;
}
input {
width: 150px;
padding: 5px;
margin: 10px 0px;
}
button {
padding: 3px 12px;
font-size: 16px;
margin: 20px 5px;
cursor: pointer;
}
.result {
margin-top: 20px;
font-size: 1.2em;
color: #333333;
}
</style>
</head>
<body bgcolor="#d3d3d3">
<h2>mm, pixel, ppi Calculation Tools</h2>
<div class="input_box">
<div>
<!-- ミリメートルを入力 -->
<label for="mmInput">millimetre (mm):</label>
<input type="number" id="mmInput" placeholder="例: 25.4">
</div>
<div>
<!-- ピクセルを入力 -->
<label for="pxInput">pixel (px):</label>
<input type="number" id="pxInput" placeholder="例: 1000">
</div>
<div>
<!-- pixels per inch を入力 -->
<label for="ppiInput">pixels per inch (ppi):</label>
<input type="number" id="ppiInput" placeholder="例: 150">
</div>
</div>
<div>
<button onclick="calculatePixels()">pixel を計算</button>
<button onclick="calculateMM()">mm を計算</button>
<button onclick="calculatePPI()">ppi を計算</button>
</div>
<div class="result" id="result"></div>
<p><br>
pixel = mm * ppi / 25.4  
        mm = pixel * 25.4 / ppi  
        ppi = pixel * 25.4 / mm
</p>
<script>
function calculatePixels() {
const mm =
                parseFloat(document.getElementById('mmInput').value);
const ppi =
                parseFloat(document.getElementById('ppiInput').value);
if (isNaN(mm) || isNaN(ppi) || ppi <= 0) {
document.getElementById('result').textContent =
                "正しい数値を入力してください";
return;
}
const inches = mm / 25.4; // 1インチ = 25.4mm
const pixels = inches * ppi;
document.getElementById('result').textContent =
            `結果: ${pixels.toFixed(2)} pixel (px)`;
}
function calculateMM() {
const px =
                parseFloat(document.getElementById('pxInput').value);
const ppi =
                parseFloat(document.getElementById('ppiInput').value);
if (isNaN(px) || isNaN(ppi) || ppi <= 0) {
document.getElementById('result').textContent =
            "正しい数値を入力してください";
return;
}
const inches = px / ppi;
const mm = inches * 25.4; // 1インチ = 25.4mm
document.getElementById('result').textContent =
            `結果: ${mm.toFixed(2)} millimetre (mm)`;
}
function calculatePPI() {
const px =
                parseFloat(document.getElementById('pxInput').value);
const mm =
                parseFloat(document.getElementById('mmInput').value);
if (isNaN(px) || isNaN(mm) || mm <= 0) {
document.getElementById('result').textContent =
                "正しい数値を入力してください";
return;
}
const inches = mm / 25.4; // 1インチ = 25.4mm
const ppi = px / inches;
document.getElementById('result').textContent =
            `結果: ${ppi.toFixed(2)} pixels per inch (ppi)`;
}
</script>
</body>
</html>


表示直後の状態。


mmとpixcelを入力して[ppiを計算]をクリックした結果。


pixelとをppi入力して[mmを計算]をクリックした結果。


mmとをppi入力して[pxを計算]をクリックした結果。


TCDW8259 
大きな道でも無理な横断をする強者もいますね

季節がら、夜道の私道を運転する時は酔っ払いがフラフラ歩いているので、かなり怖いですね。以外に多いんですよね。大きな道でも無理な横断をする強者もいますね。

土曜日, 12月 21, 2024

macOSで作成した和文の濁点がWindowsで分離した場合の対処

macOSで作成した和文の濁点がWindowsで分離した場合の対処は簡単でした。

例えばmacOS側で任意のフォルダーに複数のファイルを和文名で作成し、そのままWindowsにネット経由で転送し・・・

フォルダー内を全選択し・・・

[Shift]右クリック表示されたメニューの[パスのコピー]をクリックしてから・・・

wordにペーストすると濁点が分離してしまいます。これ、本当に困っていましたが[Fat32]でフォーマットしたUSB等を使ってWindowsに持ってくるだけで問題は解決するようです。が、ネット経由だと上手くいきません。本当に困っていましたが・・・

偶然Visual Studio Codeにペースとしたら問題はあっさり解決していました。そのまま[.txt]形式で書き出し・・・ 


wordで[UTF-8]で読み込めば・・・

問題解決です。

あとはファイルの位置情報やダブルクオートを置換処理すればファイル名だけになります。

※フォルダー内のファイル名をテキスト化するのは・・・

そのままword形式で書き出せば・・・

サイド読み込めば問題は完全に解決です。

TCDW8258 
経験はありませんが、毎度ビクビクして使っています

SDカードやUSBメモリーは1TBも登場していて驚いてしまいますが、紛失したら悪夢ですね〜。まだ紛失した経験はありませんが、毎度ビクビクして使っています。

金曜日, 12月 20, 2024

iPhoneはUSBメモリーとの相性がありますね

iPhoneはUSBメモリーとの相性がありますね(>_<)

ダメなUSBメモリーをFAT32やexFATで改めてフォーマットしてもダメなもにはダメですね(>_<) ちなみに怪しいメーカー品は使っていません。私が常用しているのは以下の4社だけです。
ADATA(Taiwan)
KIOXIA(Japan)
Transcend(Taiwan)
Silicon Power(Taiwan)

実はこれに気がつかずコンバーターを色々ゲッとしてムダしてしまいました(>_<)。ところが・・・認識しないUSBはmacOSでexFATのフォーマットはダメでッしたが、Windows側でexFATフォーマットしたら認識してくれました。

TCDW8257 
教科書を真剣に読んでいる学生を見かけるとホッコリしますね

期末試験の時期に駅で周りを気にせずゲームで大騒ぎしている高校生より、教科書を真剣に読んでいる学生を見かけるとホッコリしますね。

木曜日, 12月 19, 2024

Blender Study Notes 42 
UVより簡単な画像テクスチャーの設定(1)

UVより簡単な画像テクスチャーの設定を整理しました。

デフォルト環境のカメラとライト、そしてキューブを削除してから撮影台とキャラクターを配置します。

キャラクターを選択し[マテリアル]をクリックし・・・

切り替わった画面の[新規]をクリックし、名称を入れ・・・


切り替わった画面の[ベースカラー]の黄色い●をクリックし・・・

表示されたパレットから[画像テクスチャ]を選択します。

続けて[画像テクスチャ]の[開く]をクリックし・・・

使用する画像を選択し[画像を開く]をクリックして読み込みます。これでマッピングは完了ですが、時々それでは表示されないことがあります(調査中)そんな場合は・・・


[ビューポートシェーディング]をクリック(※)してから[シェーディング]モードに入ります。

※初めから設定しておいた方が良いですね。

ここで[追加]>[入力]>[テクスチャ座標]を選んで・・・

[テクスチャ座標]を表示します。

ここで、[テクスチャ座標]の[生成] と[007.jpg(※)]の[ベクトル]を繋げます。 

※読み込んだ画像名になります、

これで画像が張り付きます。

なお[007.jpg(※)]の[リニア]の下の[平面]は形状に合わせて[ボックス][級][チューブ]に切り替えると良いかも。

Blender 4.2.0 Windows

TCDW8256 
それとも全国我慢大会の真っ最中なんですかね〜?

Baby Alien 049
アッ!と驚く〜エイリアン(^o^)
この寒空にもかかわらず、生足で歩いている女性が多いですが、アレはエイリアン?ですか? それとも全国我慢大会の真っ最中なんですかね〜?

水曜日, 12月 18, 2024

Photoshopのサイズ調整は原始的処理がお薦めかも

Photoshopのサイズ調整はトリミングツールで〜が定番?ですが、ウッカリ拡大してしまうこともあるので私はほとんど使っていません。

例えば(縦3000px横4000px)の画像を(縦1500px横2000px)にトリミングしたい場合・・・

[背景]レイヤーをダブルクリックして[レイヤー0]に変更し、新規レイヤーを作成し・・・

新規レイヤーを任意の色で塗り潰します。

ここで、塗り潰したレイヤーを選択し[プロパティ]パレットで(縦1500px横2000px)に変更します。

変更した直後の状態。

不透明度を50%程度に調整し、適当な位置に移動します。

野ので画像のレイヤーに移動し、サイズを調整します。

サイズを調整が確定したらぬりつびしレイヤーをcommand(※)キーを押したままぬりつびしレイヤーをクリックすると塗りつぶしの(縦1500px横2000px)を選択した状態になるので、そのまま[イメージ]>[切り抜き]を実行します。

※Windowsはcontrolキー

これで画像は(縦1500px横2000px)に変更されます。

変更後のイメージ。

TCDW8255 
何な凄いオマケでも付いているのだろうか?

数ヶ月前に刊行された研究論文的な本で、Amazonで普通に定価で販売されているのに、3倍価格の中古本?って、何な凄いオマケでも付いているのだろうか? 

火曜日, 12月 17, 2024

Let's start JavaScript 48 
HTML上で○×ゲーム

唐突にHTML上で○×ゲームを作成してみました。最も唐突ではなくて数ヶ月ダラダラと作っていました。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport"
        content="width=device-width, initial-scale=1.0">
<title>○×ゲーム</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: powderblue;
}
.game-container {
text-align: center;
}
.board {
display: grid;
grid-template-columns: repeat(3, 100px);
grid-template-rows: repeat(3, 100px);
gap: 5px;
margin-bottom: 20px;
}
.cell {
width: 100px;
height: 100px;
display: flex;
justify-content: center;
align-items: center;
background-color: white;
border: 1px solid #ccc;
font-size: 2em;
cursor: pointer;
}
.cell.taken {
cursor: not-allowed;
}
.status {
font-size: 1.2em;
}
.restart {
padding: 5px 15px;
font-size: 1em;
cursor: pointer;
background-color: #007BFF;
color: white;
border: none;
border-radius: 5px;
}
.restart:hover {
background-color: #0056b3;
}
</style>
</head>
<body>
<div class="game-container">
<div class="board" id="board">
<!-- マスは左上から
0 1 2
3 4 5
6 7 9 -->
<div class="cell" data-index="0"></div>
<div class="cell" data-index="1"></div>
<div class="cell" data-index="2"></div>
<div class="cell" data-index="3"></div>
<div class="cell" data-index="4"></div>
<div class="cell" data-index="5"></div>
<div class="cell" data-index="6"></div>
<div class="cell" data-index="7"></div>
<div class="cell" data-index="8"></div>
</div>
<div class="status" id="status">プレイヤー X の番です</div>
<button class="restart" id="restart">リスタート</button>
</div>

<script>
const board = document.getElementById('board');
const status = document.getElementById('status');
const restartButton = document.getElementById('restart');
let currentPlayer = 'X';
let gameActive = true;
let gameState = ["", "", "", "", "", "", "", "", ""];

/* 勝利条件(横・縦・斜め) */
const winningConditions = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[0, 3, 6],
[1, 4, 7],
[2, 5, 8],
[0, 4, 8],
[2, 4, 6]
];

function handleCellClick(event) {
const clickedCell = event.target;
const clickedIndex =
                parseInt(clickedCell.getAttribute('data-index'));

if (gameState[clickedIndex] !== "" || !gameActive) {
return;
}

gameState[clickedIndex] = currentPlayer;
clickedCell.textContent = currentPlayer;
clickedCell.classList.add('taken');

/* 勝者を表示 */
if (checkWin()) {
status.textContent =
                    `プレイヤー ${currentPlayer} の勝ちです!`;
gameActive = false;
return;
}

/* 引き分けを表示 */
if (gameState.every(cell => cell !== "")) {
status.textContent = "引き分けです!";
gameActive = false;
return;
}

/* 次のプレイヤーを促す */
currentPlayer = currentPlayer === 'X' ? 'O' : 'X';
status.textContent =
                `プレイヤー ${currentPlayer} の番です`;
}

function checkWin() {
return winningConditions.some(condition => {
return condition.every(index =>
                    gameState[index] === currentPlayer);
});
}

/* リスタート */
function restartGame() {
currentPlayer = 'X';
gameActive = true;
gameState = ["", "", "", "", "", "", "", "", ""];
status.textContent = "プレイヤー X の番です";
document.querySelectorAll('.cell').forEach(cell => {
cell.textContent = "";
cell.classList.remove('taken');
});
}

board.addEventListener('click', handleCellClick);
restartButton.addEventListener('click', restartGame);
</script>
</body>
</html>

表示直後の状態。

指示に従って「×」と「○」をプロットしていきます。

引き分けの結果。

勝った場合の結果。ちなみに勝つのは難しいというか、私には無理かも(^o^)