なんじゃくにっき

プログラミングの話題中心。

簡単な形態素解析の実装をしてみた(Ruby)その2

前回の続き

nanjakkun.hatenablog.jp

前回の実装では辞書引きの効率に問題があったので改善しました。

辞書の構造としてトライ木を使うようにしました。トライ木の実装自体にはバリエーションがあるのですが、割とオーソドックスな方法で。

次回以降に別のトライ木実装にもチャレンジしようと思います。

コード

https://github.com/nanjakkun/morph_ruby/blob/main/lib/morph/longest_match/v2/analyzer.rb

計算量

※ちょっと自信ないです

辞書のデータ構造次第で計算量が変わります。

  • 入力文字数をN
  • 辞書の単語数をD
  • 辞書中の最長接頭辞単語の最大文字数をK

とすると、

  • 辞書の実装が配列の場合(前回の実装)、O(ND)
  • 辞書の実装がハッシュマップの場合、O(N**3)
  • 辞書の実装がTrieの場合、O(NK**2)

参考

トライ (データ構造) - Wikipedia

Astroでtailwind 4.0を使う

github pagesで公開するのに便利なので静的サイトジェネレーターとしてAstroを使っているんですが、tailwind 4.0を使いたくなったのでupdateしました。

大雑把な流れとしては

  • astroのプラグインastrojs/tailwindcssはtailwind 4.0に対応していないので削除
  • tailwindcss/viteã‚’install
  • 各種configのupdate

参考

@astrojs/tailwind | Docs

Deprecated Tailwind CSS now offers a Vite plugin which is the preferred way to use Tailwind 4 in Astro.

と書かれています。これから始める人はastrojs/tailwindcssを使わないように。

Tailwind v4 alpha | Astro Tips

↑ちょっと記事が古くて対応はastro 4系だけって書いてますが5系でも動きました。

PR

対応してみたPR

https://github.com/nanjakkun/hyattoku/pull/301

configのupdate

astro.config.mjs を以下のようにする。古いastrojs/tailwindの設定が残っていたら削除。

import { defineConfig } from 'astro/config';
import tailwindcss from '@tailwindcss/vite';

// https://astro.build/config
export default defineConfig({
  vite: {
    plugins: [tailwindcss()],
  }
});

src/styles/tailwind.css に

@import "tailwindcss";

と書く。

ä»–

tailwind 3以前ではtailwind.config.mjsに

クラスが含まれるソースファイルを以下のように設定しないといけませんでした。

content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'],

これがディレクトリとファイルの種類からヒューリスティック的にコンテンツを検出するようになったので設定しなくても動くようになりました。

ただあくまでヒューリスティック的なので上手く動かないときはこれまで通りに設定する必要があると思われます。

簡単な形態素解析の実装をしてみた(Ruby)その1

概要

形態素解析機を一度は作りたいなーと思いたっても、いきなり世に出回ってるライブラリレベルのものを作るのはハードルが高すぎるので、色々要素を削ぎ落としたものを実装してみました。

というか原型は生成AIに書かせてほぼ動く状態でした。

とりあえずまずはパフォーマンスとかあまり考えずに楽にかけるようにということでRubyで書きました。

やる気があったらRustかGoに移植するかもしれません。

と言っても生成AIが対応していれば言語毎の実装コストはそこまで変わらないかもしれない。

アルゴリズム

今日では日本語の形態素解析ではラティスを使う方法が一番広く使われていると思いますが、今回は簡単のため最長一致法を用いました。

最低限動くコードなら至ってシンプルです。

morph_ruby/lib/morph/longest_match/v1/analyzer.rb at main · nanjakkun/morph_ruby · GitHub

参考

参考にしたのは、まず形態素解析と言ったらこの本からと言っても良いくらいの 「形態素解析の理論と実装(実践・自然言語処理シリーズ〈第2巻〉) [全集叢書] 工藤 拓(著)」

https://www.yodobashi.com/product/100000009003023203/

とあと適宜ネットでちょろちょろ検索。

asdfでinstallしたpython3 のREPLがSegmentation Faultで落ちた

Ubuntuにasdfで新しくinstallしたpython 3.13.1のREPLを立ち上げると以下の症状が発生しました。

  • 矢印キーを入力すると"[[A"のようなものが入力される
  • Enterキーを押すと"Segmentation fault (コアダンプ) "とだけ表示してREPLが落ちる

解決

Segmentation faultは調査が面倒だったんですが、結論から言うとlibffi-devとlibncursesをinstallしてからpythonをinstallし直す必要がありました。

sudo apt-get install libffi-dev libncursesw5-dev
asdf plugin remove python
asdf plugin add python
asdf install python 3.13.1
asdf global python 3.13.1

それから.pythonrc.pyを作って.bashrcから起動時に読み込ませて・・ みたいなことを書いてある古い記事が検索で引っかかりましたが、私の環境では必要ありませんでした。

Findyのスキル偏差値が改善されたとのことなので試してみた

Findyのスキル偏差値がv3になって改善されたとのことなので試してみました。

GitHubからエンジニアスキルを可視化する「スキル偏差値」を大幅リニューアルした話 - Findy Tech Blog

以前よりまともな正規分布に近づいた感覚はあります。

以前はフォロワーさんに70台、80台がいっぱいいたり、自分のスコアも言語ごとにあまりスコアの違いがなかったので。

今回のケースではGitHubユーザー間のリポジトリ情報を比較し、相対的なスキル勝敗データを生成しました。また、ペアはバイアスが生まれないようにランダムでペアを作るようにしています。

とあるので、測定し直してみたらスコア変わるんじゃないかと思ってちょっとコード足してやってみたら変わりました。(コード変化ない言語も)

Rubyは上がってPythonは下がりました。

まあ70越えたので満足(?)50人に1人くらいってことですかね。

毎度ランダム性があるので来月には下がってるかもしれませんが。

なお、体感でスカウトメールはスコア上げてもあまり増えた感じはなかったです。(確か50くらいから65くらいまで変化させてみた)

所得税予定納税 第2期

所得税の予定納税 第2期分納付しました。ちゃんと覚えてた。

やることは第1期のときとほぼ同じです。

第1期のときの記事は↓

令和6年分の所得税の予定納税を行った - なんじゃくにっき

今回は期間が11/1〜12/2と短いのでお早めに。

フリーランス新法はフリーランスITエンジニアにどう影響するか?

来月(2024年11月)からフリーランス新法が施行されます。

正式名称は「特定受託事業者に係る取引の適正化等に関する法律(令和5年法律25号)」。

厚生労働省が出している2ページのPDFにまとめられています。 https://www.mhlw.go.jp/content/001261528.pdf

フリーランスの定義

ここではフリーランスは「業務委託を受ける事業者で従業員を雇っていないもの」となっています。

個人事業主でも従業員を雇っていたら対象外になります。

また、「従業員を雇っている」の定義も1週間の所定労働時間が20時間以上で1月以上継続して雇用、になります。

ので週のうち短い時間しか働いていない従業員しかいない場合はこの定義から外れます。

義務項目

義務項目が7つありますが、発注事業者が従業員を使用しているか、業務委託の期間によって満たすべき項目が変わってきます。

上記PDFに条件は書いてあります。

  1. 書面での取引条件の明示

業務委託をした場合、書面等により、直ちに、次の取引条件を明示すること 「業務の内容」「報酬の額」「支払期日」「発注事業者・フリーランスの名称」「業務委託をした日」「給付を受領/役務提供を受ける日」「給付を受領/役務提供を受ける場所」「(検査を行う場合)検査完了日」「(現金以外の方法で支払う場合)報酬の支払方法に関する必要事項」

書面ないし電子的に明示する必要があります。口頭、電話では駄目ってことですね。

  1. 報酬支払期日の設定

発注した物品等を受け取った日から数えて60日以内のできる限り早い日に報酬支払期 日を設定し、期日内に報酬を支払うこと

  1. 禁止行為

フリーランスに対し、1か月以上の業務委託をした場合、次の7つの行為をしてはな らないこと ●受領拒否 ●報酬の減額 ●返品 ●買いたたき ●購入・利用強制 ●不当な経済上の利益の提供要請 ●不当な給付内容の変更・やり直し

  1. 募集情報の的確表示

広告などにフリーランスの募集に関する情報を掲載する際に、 • 虚偽の表示や誤解を与える表示をしてはならないこと • 内容を正確かつ最新のものに保たなければならないこと

  1. 育児介護等と業務の両立に対する配慮

6か月以上の業務委託について、フリーランスが育児や介護などと業務を両立できるよう、フリーランスの申出に応じて必要な配慮をしなければならないこと

  1. ハラスメント対策に係る体制整備

フリーランスに対するハラスメント行為に関し、次の措置を講じること ①ハラスメントを行ってはならない旨の方針の明確化、方針の周知・啓発、②相談や苦情に応じ、適切に対応するために必要な体制の整備、③ハラスメントへの事後の迅速かつ適切な対応 など

  1. 中途解除等の事前予告・理由開示

6か月以上の業務委託を中途解除したり、更新しないこととしたりする場合は、 ・原則として30日前までに予告しなければならないこと ・予告の日から解除日までにフリーランスから理由の開示の請求があった場合には理由の開示を行わなければならないこと

個人的に影響があったこととか

私個人の状況で誠に恐縮ですが、変化があったことを1つ紹介しておきます。

以前はフリーランス契約の更新の確認は、契約期間の終わりの1ヶ月前切ってからのことが多かったんですが、 最近は1ヶ月少し前までにされるようになりました。

上記の7番の影響ですね。

他はあまり変わらなかったですね。IT系だと元々電子的な書類で契約内容明示しているところが殆どでしょうし、支払いも従業員に対する給料と同じくらいのタイミングのところが多いんじゃないかなーと思います。

とはいえ上記の義務を満たしていない場合は発注事業者さんに求めましょう。

Windows 11とUbuntu 24.04のデュアルブート環境構築

ノートPCを買い替えてWindows 11とUbuntu 24.04のデュアルブートにしたのでその記録。

機種はInspiron 14、CPUはRyzen 7 8840U。

注意点

OSのバージョン、使用するソフトウェアのバージョン、機種などにより、手順等などが異なることがあります。

事前に情報を集めてから実施しましょう。

最近Windows updateでデュアルブート環境が壊れるとかありましたし。

2024年8月パッチのデュアルブート破壊問題、Microsoftが復旧方法を明らかに - 窓の杜

Dell公式ドキュメント

DellはPCメーカーとして珍しくデュアルブートの方法を公式に公開しています。

Dell製PCを対象にする場合には目を通しておきましょう。

Dell製PCでUbuntuおよびWindows 8~Windows 11をデュアル ブートとしてインストールする方法 | Dell 日本

Windowsの容量を縮小

WIndowsの設定から「ディスクとボリューム」を検索してOS(C:)のプロパティを選択

Cドライブの画面が表示されたら「サイズの変更」を押す。

そこでWindowsに割り当てるサイズの変更ができます。

余った分がUbuntuに割り当てられる容量になります。

Windowsをあまり使わないならここでのサイズを大分小さくしてしまってもOK。 (それでも現在の容量プラス20-30 GBくらいは残しておいたほうがよいらしい?)

BitLocker無効化

ドライブの暗号化のBitLockerが有効だとデュアルブートできません。これを無効化します。

WIndowsの設定から「BitLocker」を検索し無効化。

Ubuntuのイメージ入手

https://jp.ubuntu.com/download

Ubuntuのサイトからファイルをダウンロードします。

この記事を書いた時点では最新イメージは ubuntu-24.04.1-desktop-amd64.iso でした。

Rufusを使って書き込み

書き込む前にUSBメモリが必要です。isoイメージが5.8GBだったので8GB以上のものが必要です。

フォーマットして使うのでUSBメモリ内に消して困るファイルがあったら退避させておきましょう。

isoファイルを書き込むためのソフトを入手します。

最近たまに話題になってるrufusを使ってみました。

「Rufus」ブート可能なISOイメージファイルをもとにブータブルUSBメモリを簡単に作成 - 窓の杜

rufusを起動したらUSBメモリとisoファイルを選択し、あとは変更なしで大丈夫でした。

※他にもiso書き込むためのソフトはあるのでお好みで。

Ubuntuインストール

USBを挿したままにして起動時にF2かF12でBIOS設定画面へ(機種によってキーが違うことがあるので注意)。

起動の優先順位をUSBが一番上になるようにして起動させます。

あとはUbuntuのインストーラが起動するので画面の指示に従っていけばOK。

余談

機種によってはRapid Storage Technology (RST)を無効化しないとだめらしいですが、今回の場合は特に何もせずに大丈夫でした。

Ruby on Railsの新しいメンテナンスポリシー

New Rails maintenance policy and end of maintenance announcements

Ruby on Rails — New Rails maintenance policy and end of maintenance announcements

Ruby on Railsって今までリリースサイクルがあまり定まっていなかったりしたんですが、リリースサイクルとメンテナンス期間の設定を定期的に行うようにします、ということらしい。

リリース/メンテナンスサイクル

※バージョン番号のx.y.zのxがメジャーバージョン、yがマイナーバージョン、zがパッチ

  • 新機能は6ヶ月毎にリリースする

※明言されていないけど文脈的にメジャー or マイナーリリースが半年ごとということらしい?

  • マイナーリリースのバグフィックスが入るのは1å¹´é–“
  • マイナーリリースのセキュリティフィックスが入るのは2å¹´é–“

現在のサポート状況

  • 7.2.x - Bug fixes until August 9, 2025; Security fixes until August 9, 2026
  • 7.1.x - Bug fixes until October 1, 2024; Security fixes until October 1, 2025
  • 7.0.x - Security fixes until April 1, 2025
  • 6.1.x - Reached end of maintenance (see Important Updates)

FacebookとInstagramの誕生日をデタラメなものに変えた

タイトルの通り、FacebookとInstagramの誕生日をデタラメなものに変えました。

元々誕生日非公開にはしていました。

知らない人に誕生日知られる状態だとなにか別のサービスのパスワード再発行のときの質問とかに使われたり、身分証偽造の際に使われたりといったセキュリティリスクがありそうなのが理由でした。

で、誕生日設定のところに、

「誕生日を追加すると、あなたの年齢に適した利用体験ができるようになります。」

とあるんですが、これ、なんのことはない、広告のターゲティングに使われているだけですね。

利用体験とか言って広告のことなのがイヤラシイです。

同じような広告見飽きたし年齢を偽装しました。大分実年齢より上にしたので高齢者向け広告になった・・?

といっても年齢上限設定してある広告が出なくなっただけですね。

あまり年齢下限が高い広告はなさそうです。

誕生日デタラメにするともしかしたらパスワード忘れたときの復旧のときとかに困るかも知れないので自己責任で。