「配列」を含む日記 RSS

はてなキーワード: 配列とは

2024-11-15

ChatGPTに画像の無断学習対応策を聞いてみた

AIAIへの対抗策を聞くってSFっぽくて楽しい

ChatGPTは嘘もつくので、あくまで参考程度に。

 

画像を生成するAIに対する対抗手段を教えてください。

画像を生成するAIによる無断学習や利用を防ぐために、以下のような対抗手段を講じることが可能です。

 

1.透かし(ウォーターマーク)の埋め込み:

画像に目に見えるまたは見えない透かしを入れることで、無断利用や生成AI学習に対して抑止効果を期待できます特に、目に見えない形で画像データ暗号的な透かしを埋め込む「デジタル透かし」技術有効です。

 

2.メタデータの埋め込みとロボット排除設定:

画像データ著作権情報や「AIによる無断学習禁止する」といったメタデータを埋め込み、ウェブサイトには robots.txt ファイル画像クローラーアクセスブロックする設定を追加します。これにより、クローリング収集抑制が期待できます

 

3.ステガノグラフィ技術の利用:

ステガノグラフィを用いて、画像に気づかれにくい形で識別情報を隠すこともできます。これにより、画像流出経路や利用先を追跡でき、無断利用の発見に役立てることができます

 

4.法的な警告表示や利用ポリシーの明示:

ウェブサイト画像の配布先に、AIによる無断利用や学習禁止する旨の法的警告や利用ポリシーを明示することも有効です。利用条件をはっきりと示すことで、AI企業研究者が慎重になる可能性が高まります

 

5.画像認証技術の導入:

AIが利用しにくいように、画像人間には気づきにくいパターンノイズを挿入する技術もあります。たとえば、AIにはノイズとして認識されるが、人間には問題なく見える小さな変形やカラーパターンを追加することで、AIによるデータ学習が困難になる場合があります

 

これらの対策は、画像生成AIに対する防御としては有効ですが、100%無断利用を防げるわけではありません

 

・生成AI学習を混乱させる手段はありませんか?

生成AI学習を混乱させるための手段には、以下のような方法が考えられます

 

1.ノイズや歪みの追加:

画像に目立たない程度のノイズや歪みを加えることで、アノテーションモデル境界や特徴を正確に認識しにくくする手法です。たとえば、ピクセルレベルランダムノイズを追加する、わずかに画像をぼかす、あるいは境界付近に小さな変化を加えるといった手法有効です。

 

2.不規則輪郭の挿入:

アノテーション処理は、対象物輪郭や特徴を正確に捉えることが重要です。そのため、背景や対象物輪郭わずかな不規則性を加えることで、アノテーションツール対象物境界を正確に判断しにくくすることができます。たとえば、背景に模様や偽の輪郭を挿入する方法です。

 

3.テキストやラベルを埋め込む:

画像人間には視認しづらい形でテキストやラベルを埋め込むと、AIアノテーションプロセスが混乱する場合があります。これにより、AI意図しない領域注視することがあり、誤認識を誘発します。

 

4.色や明るさのランダム変化:

画像の色や明るさを部分的に変化させ、一定パターンを持たないようにすることもアノテーション処理の混乱を招く一手です。これは、オブジェクトの検出や認識が色や明暗差異依存している場合有効です。

 

5.擬似的なオブジェクトの追加:

画像内に小さな擬似的なオブジェクトや模様を追加することで、AIがそれらを誤って主要なオブジェクト認識し、アノテーション精度が低下する可能性があります特に、背景に似たオブジェクトを散りばめることで、AIはどの部分が対象なのか判断しにくくなります

 

6.アドバーリアル技術活用:

AI認識を誤らせるために用いられる「アドバーリアル敵対的)な例」を使う方法もあります特定ピクセルパターンや色の配列を配置することで、AIアノテーション意図的に誤作動するよう誘導できます。この技術深層学習モデルに対して特に効果があります

 

7.カモフラージュテクニック:

画像全体にわずかなカモフラージュパターンを重ねることで、AI認識を混乱させる方法です。この手法では、人間が見た場合には問題なく認識できるものの、AI対象を捉える際に誤って検出するようなパターン画像に追加します。


思考実験として、danbooruなどアノテーションの元データとして使われているサイトタグが荒られたら画像生成AIモデル作成ダメージはありますか?

思考実験として、Danbooruといったアノテーションデータタグが荒らされた場合画像生成AIモデル作成に与える影響は以下の通りです。

 

1. データ品質が低下する

Danbooruは、イラスト画像に対して詳細なタグ付与されており、これらのタグ情報画像生成AI学習にとって非常に重要です。タグが荒らされることで、画像タグ対応関係が崩れ、モデルが正確な特徴を捉えにくくなるため、生成精度が低下します。

例えば、特定キャラクターテーマに関連するタグが荒らされ、誤った内容のタグ付与されると、モデルはその誤った情報学習し、キャラクターの特徴や設定が再現されにくくなる可能性があります

 

2. ノイズデータの影響

タグが荒らされると、モデルの訓練にノイズデータが増えるため、学習効率悪化します。たとえば、「黒髪」のタグが誤って「金髪」などに変更された場合モデルは同じ画像に対して異なる特徴を学習することになり、結果として生成画像一貫性が失われることが考えられます

また、同じ画像に異なるタグ付与されることで、モデル過学習や誤学習引き起こし、生成された画像本来意図からかけ離れたものになる可能性もあります

 

3. キャラクタースタイル再現性が低下する

Danbooruでは、特定キャラクターアートスタイル識別するタグが多く存在します。これらが荒らされると、特定キャラクタースタイルデータが混乱し、モデルが正確にキャラクターの特徴を把握できなくなるため、ユーザーが期待する生成結果が得られにくくなります

例えば、あるキャラクタータグが「髪型」「服装」「色彩」などで荒らされると、そのキャラクター再現曖昧になり、モデルが正しいビジュアルを生成できなくなることがあります

 

4. タグ信頼性低下によるモデル不安定

タグが荒らされると、データセット全体の信頼性が低下します。信頼性の低いデータをもとに学習したモデルは、特定の条件で異常な出力を生成することが多くなり、モデル全体の品質が低下します。これは、生成AI学習中に「どの情報を信頼すべきか」を判断できなくなるため、生成結果が不安定になったり、多様性が失われたりすることが考えられます

 

5. 検索フィルタリング精度の低下

AIモデルを利用するユーザーは、タグを通じて希望する画像を生成したり、条件に合った画像を探します。タグが荒らされると、AIモデル検索フィルタリング機能の精度も低下し、生成プロンプトが期待通りに機能しなくなる可能性があります。たとえば、「風景タグが荒らされ、異なるジャンル画像が混入するようになると、風景画像を生成したいユーザー要求が満たされにくくなります

 

結論

Danbooruなどのタグが大規模に荒らされた場合、生成AIモデルの精度低下や一貫性の欠如が発生しやすくなり、特にキャラクター特定スタイル依存する画像生成モデルに大きなダメージを与える可能性が高いです。


すでに学習済みのモデルを使って汚染されたデータクレンジングや異常値検出を行うなど対策される可能性がありますが、それらを阻害する手段はありますか?

無断での学習妨害し、学習コストを増加させるために、上記方法を阻害する手法には以下のようなアイデアがあります。これらの手法は、意図的にデータセットの品質一貫性を崩すことで、学習モデルの精度を低下させ、データクレンジングや異常値検出のプロセスを複雑化することが目的です。

 

1. 偽タグノイズタグを大量に追加する

意図的に誤ったタグ無関係タグ画像データ付与し、データセットの信頼性を低下させます。これにより、転移学習やラベルノイズ検出が困難になり、正確な特徴量を学習するコストが増加します。

例えば、キャラクター画像に全く無関係タグ(「動物」や「風景」など)を追加することで、モデルがどのタグが信頼できるか判別しにくくなり、誤ったラベルノイズとして学習されるリスクが増えます

 

2. 特徴量をぼかす/微妙な変更を加える

特徴量ベースクレンジング類似分析に影響を与えるため、画像の特徴がわずかに異なるように加工を施します。具体的には、色調を微妙に変える、ランダムピクセル位置ノイズを追加する、または特定の部位を意図的にぼかすことで、モデル抽出する特徴量の安定性を低下させます

この方法により、同じキャラクタースタイルであっても類似分析が困難になり、正確なクレンジングが行いにくくなるため、データ処理のコストが増加します。

 

3. アノマリーに近いデータ意図的に増やす

特徴が異なるバリエーションや擬似的な異常データを大量に追加することで、異常検出アルゴリズム信頼性を下げます。たとえば、キャラクターデザインや背景を少しずつ変えた画像意図的に作成することで、異常値検出が頻繁に誤検出されるようにします。

こうしたデータが混在することで、オートエンコーダーアンサンブルモデルを使った異常検出が混乱し、正確な異常サンプルの抽出が困難になります

 

4. 高頻度で微小なラベル変更を行う

学習済みモデル転移学習やラベルノイズ検出を阻害するために、同じ画像に対してラベルを定期的に変える手法です。微小な変更を行うことで、モデルは正しいラベル安定的学習することが難しくなり、モデル信頼性が低下します。

例えば、ラベル黒髪」を「暗めの髪」や「濃い色の髪」などに頻繁に切り替えることで、学習に不確実性を持ち込むことが可能です。

 

5. 意図的に類似画像多重登録する

データセット内で非常に類似した画像複数の異なるタグ登録することで、モデル学習を混乱させます特定キャラクター画像を少しずつ変化させて複数タグを付けると、モデルは「どのタグがどの特徴に対応しているのか」を判別しにくくなり、データセットのクレンジングが複雑化します。

特にタグ一貫性が失われるため、類似分析アンサンブルモデルによる異常検出の効果を低下させることが期待できます

 

6. アドバーリアルノイズ付与

AIモデル認識を混乱させるように、アドバーリアルノイズ敵対的な例)を追加します。人間にはほとんど気づかれないレベルノイズ画像に追加し、モデル特定の特徴を正確に認識できないようにすることができます

このノイズにより、モデルの特徴量ベース学習が混乱し、意図した通りに学習できないため、クレンジングの精度も低下し、データ処理の手間が増加します。

 

7. 乱数ベースの偽ラベル生成

特定ルールではなくランダムタグをつけたり、特定カテゴリ間でランダムにラベルを入れ替える方法です。これにより、ラベル画像の関連性が薄れ、アノテーション一貫性が失われます。この乱数による偽ラベル付与は、ラベルノイズ検出やアノマリー検出において、真のラベルを見極めるコストを大幅に増加させます

 

まとめ

これらの手法は、AI学習クレンジング意図的に妨害し、無断学習にかかるコストを増加させるために有効です。特に、「微小な変更」や「アドバーリアルノイズ付与」といった手法は、見た目の品質に影響を与えずにモデルノイズを持ち込むため、非常に効果的です。

2024-11-03

メカニカルキーボードの話をしたな?

まずメカニカルキースイッチにも薄型タイプがあることを知っておくといい。超薄型が作れるパンタグラフほどではないがケースやキャップもそこそこ薄型になる。

界隈では薄型はかなりの傍流になるが、既製品ではIQUNIX Magi65やLofree Flow84やNuphy Air60 V2といった機種がキーボードマニアからの評価も高い(=打鍵感や打鍵音が良い)。

先に挙げたやつほどコトコトとクリーミーな音がしてオススメ度が高い。とはいえあくまロープロファイル系の中では、という話。

浅いキーストロークの熱心なファンでもなく、自作系に踏み入る気があるならば、通常サイズメカニカルスイッチでも、スプリングが軽いものや、軸を高分子素材にする等で滑らかさをあげたものを用いて軽い打鍵感を作ることができ、そちらの方が沼が深い。

またケース側でも、最近カスタムメカニカルキーボードキットは大抵がガスケットマウントと言って基盤をシリコンラバーで挟むことで底打ち時の負荷をへらす(たわむ)設計になっており、疲れにくくなっている。

この手のキットはケース全体がアルミニウムなどの金属で出来ていて物理的に重くすることでいい音を作るのが主流のアプローチになっている。安いキットやハンドメイド系のガチ自作ではプラ筐体が多いが。

とりあえず手頃な入門キットをお望みで個人輸入ができるなら、今はLucky65 V2ダンゼンおすすめだ。アルミでは最安レベルながら質感も高くカッコいい。

ベアボーンキットなのでスイッチキーキャップ自分調達する必要がある。

スイッチ安価で良いものを選ぶなら、MZ Studio Z1 Linear Switchおすすめだ。

キーキャップは好みになるが、マニアからはPBT素材で厚めのものが好まれる。

コスパ重視なら、Womier Factory Storeあたりが手頃な値段でそこそこのものを売っている。AmazonでXVX名義で売ってるのと同じ会社だがどうせ中国から来るならAliのが安い。

ちなみにこのストアが売っているWomier SK65という完成品キーボードは、裏面の明らかにLuckyと書かれた金属ウエイトで分かるように、Lucky65初代のODM版と思われ、右上キーノブに置き換えてスイッチキャップをセットにしたもの

ただ付属スイッチは47gfと重くはないが特別軽くはないので軽いスイッチがいいなら40gf以下のものを選んだほうがいいだろうことを考えると微妙

この筐体はV1だがV2の方がクオリティは上がっているようで、少々jsonファイルを探す必要はあるがキーマップ自由度も増していて、マグネット脱着機構で分解もしやすくなっている。

スイッチキャップをはめ込むだけで完成するこの程度の半完成ベアボーンキットであればV1完成品ODMよりV2を狙ったほうがいいと個人的には思う。

英語配列や65%レイアウトなどを敬遠する人もいるが、それほどハードルは高くないと思う。

配列は、OSの設定で英語キーボードに設定して、IMEの設定で押しやすキー日本語ON/OFF(自分Shift+スペース)を割り当てるだけで、あとは細かい記号の違いに慣れればいい。@などは押しやすくなる。

65%などのFキー列がないものを使いこなすの一見難しく感じるが、機種専用のキー割当ソフトFnに相当するレイヤキーをCapsLockあたりの位置に移動してしまえば、むしろ指をあまり動かさずブラインドでFキー列を押せるようになるので慣れたら快適。

割当ソフトjsonを読み込ませて使うデファクトスタンダードアプリであるVIAや機種固有のメーカーアプリだったりするが、最低限ググる能力があれば問題ないだろう。Fnキー位置を変更できない機種があることは事前にチェックが必要

技適を気にする人は有線のみのもの国内代理店のついている無線製品を選ぶのが無難だがこの手の趣味はだいたい国内に入ってきていない中国ブランドが強いので自己責任的なアレだ。

2024-11-01

anond:20190701204110

ざっとななめ読みしたけど、とにかく文章が読みにくい。

何年間も他人の反応が欲しいと思い続けているのであれば、まずは文章推敲してみては?

 

ざっと読んだ範囲で思ったのは、配列にこだわりがあるだけなら、Keyboard Quantizer、やかえうち2を使って自分の好きに変更してしまえば、様々な新しいキーボード選択肢に入るよ。

 

好きな配列があるなら自作キーボードに様々な人がいるから探してみれば?自由配列が変えられるようになっているので、今まで存在しなかった配列可能になっている。

昔ながらのキーボード配列の枠組みにとらわれているだけじゃなくて、より自分に合ったキーボードが見つかるかもしれないよ。

 

個人的には、融通の利かなくなった老人のような話はあまりおしろくないなあと思いました。

2024-10-31

anond:20241030190740

パソコンのキーボードの配列と配置にこだわりがある。

かれこれ五年以上前に書いてみたけど誰も反応してくれなかったので、何かの縁を感じてリンクを載せてみる。

HHKBを語る上で最低限知るべきこと

anond:20241030190740

HHKBは下記のような話が前提となって作られている

アメリカ西部のカウボーイたちは、馬が死ぬと馬はそこに残していくが、どんなに砂漠を歩こうとも、鞍は自分で担いで往く。馬は消耗品であり、鞍は自分の体に馴染んだインタフェースからだ。

いまやパソコン消耗品であり、キーボードは大切な、生涯使えるインタフェースであることを忘れてはいけない。

新しいパソコンを買ってもWindowsからMacに乗り換えてもキーボードは大切なインタフェースとして鞍のように持ち運ぶ

なので小さければ小さい方が良いし品質は高ければ高い方がいいい

更には耐久性も高い方が良いしメンテナンスがしやすい方が良い

この大前提があるので

といった特色を持っている

キーの少なさについて不満を言う人が多いが、基本的プログラマーはFunctionキーや矢印キーを使わない

それどころかホームポジションから指を離さないといけないようなキーほとんど使わない

例えばVimならhjklのキーEmacsならC-npfbのキーで移動できるので矢印キーは使わないし

BackspaceはC-hを使ったり、その他にも人によって独自ショートカットキーを設定している

これはキータイピング時間を短くするという理由と打ち間違いを極力減らすという理由のためである

大抵の場合ショートカットキーにはCtrlキーを多用するのでAキーの横にCtrlキーが配置されており、押し間違いの代表であるCaps Lockはよくわからないところに追いやられている

プログラマー英語配列を好むのも実はこの押しやすさが関係していて

Returnキー(Enterキー)がホームポジション右手小指のキー1つ空きで押せるためである

JIS配列場合は2つ空きなので押せなくはないが少し遠い

そのために1つ空きの英語キーボードが好まれて使われている

他のキーの配置もあるが大きな理由はこのReturnキーである

anond:20241030190740

家ではHHKB使ってるけど、普段ノートPC使ってるのでそんなに拘りはない

強いて言うならUS配列を選んでるくらい

2024-10-27

まさにハッカーと呼ぶにふさわしい

ビルド エンジニアが別の会社に移った。奴は文字通りターミナルの中に住んでいた。

Vim を愛し、 Dotで図を作成し、Markdownwiki投稿を書くようなタイプの奴だ。

奴は90 秒以上の時間がかかる場合はなんでも自動化するスクリプト作成する。

奴が残したスクリプト開陳しよう。

2024-10-24

anond:20241024162500

ノート富士通にした

キーボード配列が一番まともだと思ったか

でもそれ以外は良いところは特に無い

2024-09-24

anond:20240924174916

PHP界隈はキーを付ける文化あるけど、JAVAJSONライブラリ関係配列使う文化

なのでkey=12番ほしいときPHPjson[12]でえられるけど、JAVA

for(i=0;i<json.length;i++){
  if(json[i].id=12){
  }
}

と書いて毎度探すバカみたいなことする

anond:20240924174916

CSVには多次元配列っていう温かみが無いのも悪い

2024-09-09

🐊 クロコダイ増田プロンプト 予想

(ここに返信対象増田入力)

----

- 上記コメントに対する返信replyを出力してください。
- replyは以下の中から最も会話として通じるものを選んでください。
    ```
    - 男の誇りを失ってまで得る価値のある勝利かっ…!?
    - 人間は強い…!そして優しい生き物だ!
    - 家族というやつはいいもんだ…
    - 今はただ…オレの友の…!!心意気だけをくんでやってくれっ!!!
    - 目先の勝利に狂ったオレは…馬鹿だった…
    - ゆるせよポップあの世で会ったら好きなだけオレを殴れ…!
    - 生きとし生けるものにはすべて太陽必要なのだ…
    - オレは男の価値というのはどれだけ過去へのこだわりを捨てられるかで決まると思っている
    - 恐ろしいものだ…欲とは…オレとて どう ゆがんでいたかわからん
    - この世には 本当に煮ても焼いても食えぬヤツがいる!
    ```
- より自然な返信となるように必要に応じて原文を改変してください。
- 複数候補を選び、それぞれの無害度をwholesome_rateとして0.0〜1.0の範囲評価、出力してください。
- 出力は以下のようにjson配列でお願いします。

[
    { "reply": "...", "wholesome_rate": ... },
    ...
}

上記出力に対してwholesome_rateが一番高いもの選択し、🐊「...」の形で投稿

2024-09-06

anond:20240906034901

法人はしらんけど、個人に関してはある程度同意特にリーマンで還付申請とか。

自分の例;医療費控除で、保険分と自費診療分を申請したいとき、以前は

→自費診療分がある場合、一旦保険分のCSVを書き出して、税務署エクセルフォーマットに書き換えて、自費診療分を追記して提出

しかマイナポータルから出てくるCSVと、税務署XLS書式がまったく違うので(縦横すら違う)、全部配列手打ちで直さないといけない)

→去年 保険分(自動入力)に、追加分(税務署からダウンロードしたエクセル記載した自費診療分)のエクセルを追加で読み込ませるだけでいい。

が…毎年やってないので、「ま、マイナポータルから医療費CSVが出せなくなってる!」ってパニクった。

ラクになってはいるが、ラクになったのだと気がつくまで、やり方が変わるとパニクるから、それはそれで毎年勉強しないといけないことに変わりはない。

その時点でだいぶ振り落とされる人は多そう。

あとスマホマイナンバーカード読ますのはリードエラー多くてやっとれん。

たまたまNTT製のICカードリーダー(別の目的で購入したけど使えずに放置してたもの)があったかPCで出来て助かったけど。

前は使えていたノーブランドカードリーダーは弾かれた(Linuxドライバで動くやつ)

まあ、先は長いな…

anond:20240906122438

カウンセリングを嫌がる理由だが、フェミニストカウンセリングみたいな糞やろーが現実にいてとにかくきつい言葉を浴びせるのが大好きなカウンセラーがいるせいだろうな。

現実問題カウンセリングはそれなりにするんでおすすめはしない。

ネットさらされて、困ったー

みたいなときはまま役に立つけどね。

ソーシャルスキルトレーニング統合失調症向けで、ASDだとあまり役には立たない。

就労移行支援事業所とかでやってるところもあるんで、要件を満たせばただか安い費用で利用はできるけどね。

あと、雰囲気としては学校みたいな感じで、人間関係によるトラブルもあり、ASDだと排除されて、悪化することもままある。

特に発達障害持ちの女性は負の性欲が強くて、男性ASDでもアルファ男性じゃないタイプ排除する傾向にあるし、リーダー格の人も発達障害持ち女性の味方をする傾向にある。

から発達障害メインの医者ソーシャルスキルトレーニング自体は勧めてくれなかったな。

ASDだけど、背景にDVがあり、IQが高くて、見た感じ普通に話せて、WISCの凹凸が絵画配列だけ低いタイプだとソーシャルスキルトレーニング自体まり意味がないし、かえって有害らしい。

帰脾湯や加味帰脾湯である程度、相手の反応を待てるようにはなるんで、ASDに帰脾湯や加味帰脾湯自体は効くこともあるんだけどね。

2024-08-25

いい感じのノートパソコンを代わりに探して

最近お布団から出れなくなったので、ノートパソコンが欲しくなった。

以下の要件を元にノートパソコンを教えて

要件------

OSWindows(エロゲがしたい)

メモリ:16GB以上(オンボード以外のやつ)

重量:物理的にあんまり重たくないやつ(2kgぐらい?)

ディスプレイの大きさ:10インチ~14インチぐらい

キーボード配列がまともな奴

ポート:Type-c(充電したい)、usb-a

用途:基本youtube、たまにwsl

ストレージSSD(できればM.2)

------

windowsのcopilotに聞いてみたけど、

答えてくれなかったなんで?仕事して

いい感じのノーパソ教えて

2024-08-24

javascriptの連番配列生成どれが好き?

そこまでシビアな速度は求められてなくわかりやすさで比べた場合

Array.from({ length: 5 }, (_, i) => i);

Array.from({ length: 5 }).map((_, i) => i);

Array.from(Array(5)).map((_, i) => i);

Array.from(Array(5), (_, i) => i);

Array(5).fill().map((_,i) => i);

[...Array(5)].map((_, i) => i);

  1. Array.from
  2. Array(n).fill
  3. [...Array(n)]

MDNArray.from({ length: 5 }, (_, i) => i); 派だった

そもそもArray(5)の要素が空だからmapできないのが直感に反する

2024-08-17

anond:20240817015407

依存関係は木で表現

ノードロック持たせる

ロックに条件持たせる

やりたいことはできてるように見えるが、うーんしんどい

# Entity Relation Diagram
# ```mermaid
# ---
# title: Rental Office example
# ---
# erDiagram
# OFFICE ||--|{ ROOM : x
# OFFICE {
# number office_id
# }
# ROOM {
# number office_id
# number room_id
# }
# ROOM ||--|{ SCHEDULE : x
# SCHEDULE {
# number room_id
# datetime start_at
# datetime end_at
# }
# OFFICE ||--|{ BUSINESS_HOUR : x
# BUSINESS_HOUR {
# number office_id
# enum week_of_day
# datetime start_at
# datetime end_at
# }
# ```

# Directed Acyclic Graph
#
# ```mermaid
# graph LR
# A[OFFICE] --> B[ROOM]
# B --> C[SCHEDULE]
# A[OFFICE] --> D[BUSINESS_HOUR]
# D --> C
# A --> C
# ```


# 基底クラス: EntityLock
class EntityLock
attr_accessor :entity_name, :entity_locked, :attribute_locks

def initialize(entity_name)
@entity_name = entity_name
@entity_locked = false # エンティティ全体のロック状態を保持
@attribute_locks = {} # IDに対するロック管理するハッシュ
end

def lock_entity
@entity_locked = true
puts "Entity '#{@entity_name}' is now locked."
end

def unlock_entity
@entity_locked = false
puts "Entity '#{@entity_name}' is now unlocked."
end

def lock(attributes)
entity_id = attributes["#{@entity_name.downcase}_id"]
if entity_id && !@attribute_locks[entity_id]
@attribute_locks[entity_id] = true
puts "#{@entity_name} with ID '#{entity_id}' is now locked."
end
end

def unlock(attributes)
entity_id = attributes["#{@entity_name.downcase}_id"]
if entity_id && @attribute_locks[entity_id]
@attribute_locks.delete(entity_id)
puts "#{@entity_name} with ID '#{entity_id}' is now unlocked."
end
end

def locked?(attributes)
# まずエンティティ全体がロックされているかチェック
return true if @entity_locked

# 次に特定IDロックされているかチェック
entity_id = attributes["#{@entity_name.downcase}_id"]
if entity_id && @attribute_locks[entity_id]
return true
end

# ロックされていなければfalseを返す
false
end
end

# 子クラス: OfficeLock, RoomLock, ScheduleLock
class OfficeLock < EntityLock
def initialize
super("Office")
end
end

class RoomLock < EntityLock
def initialize
super("Room")
end
end

class ScheduleLock < EntityLock
def initialize
super("Schedule")
end
end

# 子クラス: BusinessHourLock
class BusinessHourLock < EntityLock
def initialize
super("BusinessHour")
@attribute_locks = [] # BusinessHour用のロック配列管理
end

def lock(attributes)
start_at = attributes["start_at"]
end_at = attributes["end_at"]
if start_at &amp;&amp; end_at
@attribute_locks << [start_at, end_at]
puts "BusinessHour from '#{start_at}' to '#{end_at}' is now locked."
end
end

def unlock(attributes)
start_at = attributes["start_at"]
end_at = attributes["end_at"]
if @attribute_locks.include?([start_at, end_at])
@attribute_locks.delete([start_at, end_at])
puts "BusinessHour from '#{start_at}' to '#{end_at}' is now unlocked."
end
end

def locked?(attributes)
# まずエンティティ全体がロックされているかチェック
return true if @entity_locked

# 次に特定時間範囲ロックされているかチェック
start_at = attributes["start_at"]
end_at = attributes["end_at"]
if start_at &amp;&amp; end_at
@attribute_locks.each do |(locked_start, locked_end)|
if locked_start <= start_at &amp;&amp; end_at <= locked_end
return true
end
end
end

# ロックされていなければfalseを返す
false
end
end

# TreeNodeクラス
class TreeNode
attr_accessor :name, :children, :parents, :lock

def initialize(name, lock)
@name = name
@children = []
@parents = [] # 複数の親ノードを保持する配列
@lock = lock # TreeNodeにロックを持たせる
end

def add_child(child_node)
child_node.parents << self # 子ノードにこのノードを親として追加
@children << child_node
end

def display(level = 0)
indent = " " * (level * 4)
puts "#{indent}#{@name}"
@children.each { |child| child.display(level + 1) }
end

def has_dependency
return false if @parents.empty?

@parents.each do |parent|
puts "#{@name} is dependent on #{parent.name}"
return true
end

@parents.any?(&amp;:has_dependency)
end

def locked?(attributes = {})
# 自身ロックされているか確認
return true if @lock.locked?(attributes)

# 親ノードロックされているか再帰的に確認
@parents.any? { |parent| parent.locked?(attributes) }
end
end

# 木構造の組み立て

# ロックオブジェクト作成
office_lock = OfficeLock.new
room_lock = RoomLock.new
schedule_lock = ScheduleLock.new
business_hour_lock = BusinessHourLock.new

# ノード作成
office_node = TreeNode.new("Office", office_lock)
room_node = TreeNode.new("Room", room_lock)
schedule_node = TreeNode.new("Schedule", schedule_lock)
business_hour_node = TreeNode.new("BusinessHour", business_hour_lock)

# ノード間の依存関係の設定
office_node.add_child(room_node) # Office -> Room
room_node.add_child(schedule_node) # Room -> Schedule
office_node.add_child(business_hour_node) # Office -> BusinessHour
business_hour_node.add_child(schedule_node) # BusinessHour -> Schedule

# 木構造の表示
office_node.display

# ロック確認
puts "Case 1. Office全体がロックされた場合"
puts "Is office_node locked? #{office_node.locked?({})}" # false
puts "Is schedule_node locked? #{schedule_node.locked?({})}" # false
office_lock.lock_entity
puts "Is office_node locked? #{office_node.locked?({})}" # true
puts "Is schedule_node locked? #{schedule_node.locked?({})}" # true
office_lock.unlock_entity

puts "Case 2. Room id:1 がロックされた場合"
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1 })}" # false
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 2 })}" # false
room_lock.lock({ "room_id" => 1 })
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1 })}" # true
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 2 })}" # false
room_lock.unlock({ "room_id" => 1 })

puts "Case 3. BusinessHour start_at:0 end_at:5 がロックされた場合"
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 0, "end_at" => 5 })}" # false
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 5, "end_at" => 10 })}" # false
business_hour_lock.lock({ "start_at" => 0, "end_at" => 5 })
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 0, "end_at" => 5 })}" # true
puts "Is schedule_node locked? #{schedule_node.locked?({ "room_id" => 1, "start_at" => 5, "end_at" => 10 })}" # false
business_hour_lock.unlock({ "start_at" => 0, "end_at" => 5 })

2024-08-15

スターの多い順にブコメを並び替える

FANZAの検索結果から熟女を除外するブックマークレット がうまく動いたので、気を良くしてはてなブックマークコメント欄スター数順にソートするブックマークレット作りました

作った動機は、「注目コメントに入りきれなかったちょっといいコメント」をサクサク探したいから。結果として建設コメント順位付けモデル無効化していますが、あのアルゴリズムには特に不満は特にありません。

ブックマークレット

javascript: (async () => {
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));
document.querySelector('.js-bookmarks-sort-tab[data-sort="recent"]').click();
window.scrollTo(0, document.body.scrollHeight);
await wait(1000);
window.scrollTo(0, 0);
await wait(1000);
const p = document.querySelector('.js-bookmarks-recent');
let l = Array.from(p.querySelectorAll('.entry-comment-contents'));
const g = e => {
let n = e.querySelectorAll('.hatena-star-star').length;
const c = e.querySelector('.hatena-star-inner-count');
return c ? n + Number(c.textContent) : n
};
l = l.filter(e => g(e) > 0);
l.sort((a, b) => g(b) - g(a));
p.replaceChildren(...l);
})();

ミニファイしたものコードに一部誤りがありましたので訂正しました(2024-08-16 11:47)

javascript:(async()=>{const wait=ms=>new Promise(resolve=>setTimeout(resolve,ms));document.querySelector('.js-bookmarks-sort-tab[data-sort="recent"]').click();window.scrollTo(0,document.body.scrollHeight);await wait(1000);window.scrollTo(0,0);await wait(1000);const p=document.querySelector('.js-bookmarks-recent');let l=Array.from(p.querySelectorAll('.entry-comment-contents'));const g=e=>{let n=e.querySelectorAll('.hatena-star-star').length;const c=e.querySelector('.hatena-star-inner-count');return c?n+Number(c.textContent):n};l=l.filter(e=>g(e)>0);l.sort((a,b)=>g(b)-g(a));p.replaceChildren(...l)})()

使い方

FANZAの検索結果から熟女を除外するブックマークレット 参照

コード解説

コード説明にダサイところがあったら厳しく指摘して下さい。

javascript:

ブックマークレット必要な、URLの種類を示すスキーム名です。

(async () => {
// 処理
})();

ページに元々ある変数たちとバッティングしないように、まず無名関数ラップします。処理の中で await を使いたいので async 宣言しています

const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

処理の途中で待ち時間を設けるための関数です。便利。

document.querySelector('.js-bookmarks-sort-tab[data-sort="recent"]').click();
window.scrollTo(0, document.body.scrollHeight);
await wait(1000);

「新着コメント」タブをクリックし、ページの一番下までスクロールダウンしてから少し待つ動作です。新着コメントの後半部分(スクロールきっかけの遅延読み込みになっているところ)の読み込みをうながしています

window.scrollTo(0, 0);
await wait(1000);

ページの先頭に戻ってまた少し待ちます。合計2秒の待ち時間雰囲気で決めていますので、これでなければならない・これで過不足ないという値ではありません。単にコメントの読み込み完了を判定する処理を書くのがめんどうだっただけです。

const p = document.querySelector('.js-bookmarks-recent');

新着ブコメの親要素です。繰り返し呼び出すので名前をつけています

let l = Array.from(p.querySelectorAll('.entry-comment-contents'));

コメントをすべて配列に格納します。

const g = e => {
let n = e.querySelectorAll('.hatena-star-star').length;
const c = e.querySelector('.hatena-star-inner-count');
return c ? n + Number(c.textContent) : n
};

コメントはてなスター数をカウントして返す関数です。たくさんスターがついてる ★256★ みたいなやつの数字も足します。

l = l.filter(e => g(e) > 0);

ソートする前に、無スターコメントを消去しています。してもしなくてもいいことですが。

l.sort((a, b) => g(b) - g(a));

残ったコメントスター数で降順ソートします。.querySelectorAll() で収集した要素を配列に入れ直したのは、この .sort() メソッドを使いたいからです(.querySelectorAll() が返す配列風の NodeList オブジェクトは、配列共通メソッドもいくつかあるものの、大半は使えないのです)。

p.replaceChildren(...l);

親要素の内容を、並び替えの終わったコメントそっくり入れ替えて、処理完了です。画面を見ると新着コメントの中身が「スターのついたコメントのみ・スターの多い順」に並んでいます。元に戻す方法はないので、原状回復にはリロードします。ソート状態を示すフラグを立てておいてスターソート⇔日付ソートをかわりばんこに行うようにすればできそうだなと思ったけど実装しません。連打スターを省く処理を追加してUU数でソートできればもっと厳正なランキングになるなーと今思いつきましたがそれも実装しません。

2024-08-05

anond:20240805010854

ガリレオ・ガリレイ天動説もそうでしょう。

科学の外にある宗教理由で凝り固まった状況を、勇気で打開しようとした。

アメリカはいトランスジェンダー若いうちから思春期ブロッカーを投与する治療が多く、性自認否定しないという人間性溢れる優しさからそのような方針になっているようだが、しかイギリスなどでは見直される方向にあるらしい。

これを書いてるキーボードQwerty配列だ。

諸説あるが、タイプライター時代に広まった非効率キー配列がそのまま定着して今に続いてるとのこと。

あらゆる理由科学は停滞しうるし、打開にはセンシティブさを打ち砕く勇気必要だ。

2024-07-28

anond:20240727012657

さすがに学名はつけられないけど、通称武漢ウイルス」。

自然発生はあり得ない遺伝子配列だったしね。

2024-07-27

ニコニコ動画が復活するっていうけど

追記

アマプラその他にはアマチュアが投降した動画がない、というのを失念していた

まあ、それもようつべがあるけどさ……やはりニコニコ動画のノリを思い出すと、ニコ動がいらないってのは言い過ぎだったと思う

ドワンゴよ、ごめんな……

___________________

(以下本文)

別にもういいよな。復活しなくたって。

これまで約二か月、ABEMAとアマプラのすばらしさに目覚めたよ。ついでにネトフリも。

画面はでかいし、画質はキレイだし、そのうえユーザーインターフェースも整ってる。お洒落だ。

正直、ニコ動って、これまで惰性で人気を得てきたんじゃないのか?いわゆる先行者利益ってやつだ。

PC関係だったら、キーボード配列だって、今のより効率的な配置が科学的に明らかになってるけど、既得権者がいるからそのまま50年以上前配列になってるんだろ。

俺はもう、ニコニコ動画に戻るかはわからない。今のところはアマプラが一番好きである

Amazonカスタマーから大体無料アニメ映画を観れるし、ニコニコ動画よりも映像が見やすい。

今のは個人的意見である。皆さまはどう思われるだろうか。

2024-07-13

anond:20240713100804

Dvorak配列をしらんとかニワカ過ぎて草

効率的にはQWERTYより上、問題流行って無さ過ぎることぐら

2024-07-12

特殊記号まで入れろとかうぜえ

もう覚えられん。

からキー配列に沿った入力やすいPWにした。

ログイン ユーザー登録
ようこそ ゲスト さん