2025年10月11日土曜日

絶滅メディア博物館への寄贈品

 なんか自分で忘れてしまいそうなので、これまで絶滅メディア博物館に寄贈したものをここにメモっておこうと思います。そうしないと「あれ?どこやったっけ?」になりそうなので:-)

博物館の方で収蔵品データが登録されれば、そこにリンクします。随時アップデートの予定。

2024年

Au PashaPa -  Auの携帯電話に後付する小型デジカメ

MPMan - ご存知、テープやdiscではないsolid stateな携帯音楽プレーヤ(MP3プレーヤの先駆け)

 LIBLie - ソニーが出したeInk採用の電子書籍端末。書籍は買い切りではなくレンタル方式だったのが嫌われたけど、実は先見の明はあったのかも

2025年

Nikon Coolpix 100 - Nikon の実質的最初のコンパクトデジカメ。PCMCIA type-IIカードになっていて、PCとのデータ転送ができるが画像表示部は本体にはない

 Nikon Coolpix 300 - Coolpix 100 と同時発売。こちらは画像を表示できるだけでなく、ペンで書き込みまでできるが、PCとのデータ伝送はSCSI

TOSHIBA PDR-2 - これもPCMCIA type-IIカードになってPCに差し込んでデータ伝送するもので画像の表示はできない

OLYMPUS μ - 35mmフィルムフルサイズのコンパクトカメラ。

 

Webブラウザの開いているウィンドウ・タブを記録する (PC移行時のために)

PCを新しいものに移行しようとすると、Webブラウザで開いている多数のウィンドウやタブをどう移行するかで前回も悩んでました。ちなみに前回はWin7からWin10ですね。今回はWin10からWin11。

前回は無理矢理開いているものを新しい方にもっていくのをやってたんですが、そろそろ開いているタブやウィンドウにも重複が激しく、この際減らしたいわけです。。。そう、ガベージ・コレクションですね:-)。

主に使っているのがFirefoxとChromeなので、ちょいと探すと拡張機能でTab-Session-Managerなるものがあり、両ブラウザに対応していると。

これで、現在の開いているウィンドウのすべてのタブのタイトルとURLとか諸々を保存できます。保存したものはJSON形式です。

これを、HTMLでタイトルとURL(リンク)に変換して新しいPCのブラウザで開けばページ内検索でほしいものを探して、再び開くことができるだろうということで、えいやっとPython3で書いたのがこのプログラム。若人はこんな書き方をしてはいけません。プログラマは1週間経つと赤の他人なので、読めなくなります:-)。

2023年6月7日水曜日

Python3 のクラス属性はcopy-on-writeでインスタンス属性になるのか?(そうではなくshadow-on-assignというそうです)

2023年6月11日、色々と調べてくださった方の情報を追記しました。それをみてもらえれば「copy-on-write」というのはやはり的外れでした。ので、タイトルも若干修正。
(2023年6月17日。「shadow-on-assign」はChatGPT命名だそうです→ https://twitter.com/sumim/status/1667680973960654849 )

 オライリーの 入門Python3 (分厚い奴ね:-)と以下の記事を見て???と思ったので実験。

記事: Python クラス変数 と インスタンス変数 の違い https://aiacademy.jp/media/?p=922


テストしたコードはこれ。

class Z:
    y = 'a'

a = Z()
b = Z()
print(f"Z.y = {Z.y}")
print(f"a.y = {a.y}")
print(f"b.y = {b.y}")

a.y = 'x'
print(f"Z.y = {Z.y}")
print(f"a.y = {a.y}")
print(f"b.y = {b.y}")

Z.y = 'q'
print(f"Z.y = {Z.y}")
print(f"a.y = {a.y}")
print(f"b.y = {b.y}")

a.__class__.y = 'r'
print(f"Z.y = {Z.y}")
print(f"a.y = {a.y}")
print(f"b.y = {b.y}")
実行した結果。

Z.y = a
a.y = a
b.y = a
Z.y = a
a.y = x
b.y = a
Z.y = q
a.y = x
b.y = q
Z.y = r
a.y = x
b.y = r

つまり、クラス属性はインスタンス生成時には、そのインスタンスはクラス属性を共有しているが、その値を変更(write)する際には、インスタンス属性としてcopy-on-writeするということでしょうかねぇ。。。

ちょっとcopy-on-writeのところって、分かりにくくないか?。むしろ上記の例なら「a.y = 」で書き換えるのをエラーか何かにしてしまった方がいいんじゃないだろうか?。

勿論、言語の設計はその言語の設計者の自由なんだけど。なんか、これでうっかりして挙動に頭を抱えている人がいないか心配してしまった:-)

2022年4月12日火曜日

Twitterにおける新たな削除機能の提案 (既投稿ツイートの編集機能よりもマシな手法として) / Proposal of a new deletion function on Twitter (as a better method than the editing function of posted tweets)

(Click to English translated version.)

本稿はTwitterの一利用者としての思いつきを書いたものであり、実際に採用するには、実装やユーザインタフェース等の一層の検討が必要と思われる。しかしながら、Twitterがより良くなる一助になればとの思いで書いた。
 

提案する削除機能


本稿で提案したいのは、現在のTwitterのツイート削除機能の変更、あるいは第2の削除機能の追加である。

Twitterでは、個々のツイートにはURLが付与されており、その一つ一つがあたかもWebページのように閲覧できる。次のURLは私が投稿したツイート例である。

https://twitter.com/tsaka1/status/1511731179846012928

WebブラウザでこのURLをアクセスすると、内容が
「This is a test tweet.」
であることがわかる。

このツイートを削除すると、そのURLをアクセスすると
「このページは存在しません。他のページを検索してみましょう。」
のように削除されている旨のメッセージが表示される。そして、このツイートに対するリプライも表示されなくなり、リプライのリンクも解除されていることがわかる。

リプライツイートを見ると、リプライとしてツイートされたことはわかるが、リプライ先ツイートが削除されている旨表示されるのみである。

ここで提案する新たな削除機能では、削除された際に、単に削除されたことだけでなく、例えば
「このツイートは2022年4月11日 0時50分に削除されました」
と削除された日時を表示する。そして、リプライやコメント付RTからの参照は削除前と同様につながったままとするものである。

リプライやコメント付きRTなどの参照関係を維持することで、ツイート内容の訂正に相当する機能を実現すると同時に、削除したときにスレッドが分割されてしまうような事態を回避する。

例えば、内容を訂正したいツイートがあれば、訂正済内容のツイートをそのリプライとして投稿し、元のツイートについては本提案における「削除」を行う。そうすれば、元のツイートに対するリプライやコメント付きRTのツイートから元のツイートを閲覧しようとすると、削除されていることがわかり、そこにぶら下がっているリプライで訂正後の内容を知ることができる。
 

既投稿ツイートの編集機能との比較


最近、Twitterで既投稿ツイートを編集する機能を設けるべきか否かという話題が盛り上がっている。しかしながら、単純に自由に編集できるようにすると、例えば次のような困ったことが生じる可能性がある。

本来AとBは異なるのに、ある人が「A = Bである」とツイートしたとする。それに対して大勢の人が「このツイートは間違っている」とリプライした後で、その問題のツイートを「A ≠ Bである」と編集してしまうと、リプライの方が間違っているかのように見えてしまうだろう。

以上のことから、ツイート編集機能を設けるのなら、編集履歴を閲覧できるようにするべきだという意見もある。それによって上記のような事態でも編集履歴を確認できれば、後でツイートの内容を覆したこともわかるだろうという考えであろう。確かに、誰もが自由に編集できるWikipediaも編集履歴も自由に閲覧できることからも、妥当な発想に思われる。

しかしながら、例えば[1]などのように、ツイート中のリンク先を見ない人が多いという問題がしばしば話題になっていることを考えると、その編集履歴がどの程度閲覧されるかについては疑問がでてくる。

本稿で提案する削除機能であれば、この例のような場合も、削除して訂正ツイートをしていることがわかり、その削除済ツイートに大勢のリプライがぶら下がっていることがわかるわけである。

以上のアイデアは筆者が昔使用していたUSENET NewsシステムのSupersedes機能の利用経験からの発想したものである。

References

[1] 現代人は読まない…。リンク先を見ずにリツイートしまくる人が大半であると判明 https://www.gizmodo.jp/2016/06/22_5.html


2022年1月29日土曜日

WindowsのファイルにZoneID属性を付与して、外部から持ち込んだOffice系ファイル等の安全性を高める

 タイトルに書いたとおりです:-)

Windows10等では普通にWebブラウザでダウンロードしたファイルには「外部から持ち込んだよ」的フラグがついて、例えばExcel等はそのまま開いてもマクロなど実行されない「保護ビュー」モードになります。

この解除はExcel等の中で保護ビューモードをやめさせるか、エクスプローラーなどでファイルのプロパティを開いて、最下部にチェックを入れる等すればよいのですが、その逆ができるようにはなっていません。

一方、フリーソフトウェアの中にはダウンロードしたファイルにこのフラグを付与しなかったりするものが有ります。また、外部からファイルの持って来る方法として、例えばネットワークドライブとしてマウントするような方法だとフラグは付与されません。

これはちょっと不安なので、フラグを立てる方法を探しました。ぐぐるとなんぼでも見つかりますが、私が注目したのは次のページです。

ZoneID を付与する方法など - setodaNote

なんと notepad.exe で付与できるとあるじゃないですか。。。あと属性の内容を閲覧する際に、more にリダイレクトで与えています。 

ということは、リダイレクトで属性の付与もできるのではないか?と思い、やってみたら無事できました。

その結果を受けて、安直なバッチファイル(CMD.EXE用)を書いてみたのが以下の7行です。

@rem ZoneIDを付与して、Office系ファイルなどのマクロ実行を禁止する
@echo off
for %%f in (%1) do (
  echo %%f
  echo [ZoneTransfer] > %%f:Zone.Identifier
  echo ZoneId=3 >> %%f:Zone.Identifier
)

これで、一応Windowsのワイルドカードにも対応できます。ただ、複数のファイル名を空白などで区切って列挙するのには対応していませんね。その辺がほしければ、コマンドライン引数の受け取り方等をちょいちょいといじればよいでしょう。

例えば、この内容を「addflag.cmd」というファイルに保存して、Windowsのセキュリティで実行許可があるとすれば、次のように実行すると、

addflag *.xlsx

カレントディレクトリにある、Excelのファイルすべてにフラグが付与され、以降解除の操作をしない限りExcelで開くと保護モードになるというわけです。

これで、外から持ち込んだファイルでも多少は安全に開くことができるでしょう:-)

 


2021年4月16日金曜日

(O'Reillyの)PDF電子書籍の目録ページを安直に作ってみた

 まぁ、誰でもやっていると思いますが。

道具はPython3.xにPyPDF2というライブラリを組み合わせて。。。

https://note.nkmk.me/python-pypdf2-pdf-metadata/

とPython公式ドキュメントを見ながらうりゃぁっという感じで書いたので、かなりええ加減ですね。標準出力を 適当にリダイレクトして foo.htmlにでもしてブラウザで開くと。。     

改良の余地はHTMLのリファインの他はソート順とかかなぁ。

import glob
import PyPDF2
import html
import urllib.parse

files = glob.glob('*.pdf')

print("<html>")
print("<body>")
print("<dl>")

for f in files:
    pdf = PyPDF2.PdfFileReader(f)
    # print(pdf.documentInfo)
    print('<a href="{}">'.format(urllib.parse.quote(f)))
    print('<dt>')
    print(html.escape(pdf.documentInfo['/Title'], quote=True))
    print('</dt><dd>')
    print(html.escape(pdf.documentInfo['/Author'], quote=True))
    print('(')
    print(html.escape(pdf.documentInfo['/CreationDate'], quote=True))
    print(')</dd></a>')

print("</dl>")
print("</body>")
print("</html>")

 

2018年3月3日土曜日

Androidからの投稿テスト

Android用にBloggerのアプリがあったので、とりあえずBlackBerry PRIVにインストールしてみました。
これはテスト投稿です。

まぁ問題が生じるとは思ってませんが:-)