Gamilアドレスへのメール送信制限

会社HP用の新サーバーから、「お問い合わせ」と「3DCADファイルダウンロード」の時に、それぞれのエントリーユーザーに受付確認のメールを送っています。
ところが、私がテストした範囲で、会社のメールアドレス、私個人のメールアドレス(自宅サーバー)、So-netのアドレスなどには問題無く受付完了メールが送れたのですが、何故かGmailのアドレスにだけ送れていませんでした。
それで色々ログを調べたら、Gmailは送信者のメールアドレスのドメインが正しいかどうかというチェックをしていてSPFかDKIMという電子メール認証が通るメールでないと受け付けないことが分かりました。
それでSPFをどう設定するかですが、そのドメインのDNSサーバーにレコードとして設定する必要があります。実際に今回設定したのは以下のような内容です。
ホスト名    タイプ     TTL VALUE
xxxxxx.jp    TXT     3600  v=spf1 ip4:181.33.44.16 -all
mail.xxxxxx.jp  TXT     3600  v=spf1 ip4:181.33.44.16 -all
(上記のIPアドレスは適当に作ったものです。)
最初上の方だけを設定し、それで「お問い合わせ」の方はOKになったのですが、CADファイルダウンロードの方が駄目(「お問い合わせ」とCADの方で送信の仕方が違います)で、調べたらsales@mail.xxxxxx.jpのアドレスで送られていることが分かったので下の方も追加し、これでようやく両方でGmailアドレスに送れるようになりました。

生成AIによる候文の手紙の英訳(2)

ChatGPT4oによる候文の手紙の英訳その2。今回のは前回のより更にハードルが高いです。
いかし今回もほぼ正確に英訳しました!(「故山に帰養せし」だけちょっと間違えましたが。)
今の平均的日本人で、「舊雨の感」(旧雨今雨という四字熟語から、「雨」と「友」は中国語では発音が近いことから、昔からの友情と今の友情のことをこう言う)とか「滄桑の変」(桑畑が海原になるような世の中の大変化のこと)とか「鼓皷の間に相見る」(お互いが戦場で敵として相対する、陣太鼓の音を聴く)などをきちんと理解出来る人は少ないと思います。また「曩に」(さきに)も読める人は少ないと思います。


ではこれは英訳出来ますか?山県有朋が西南の役の時に西郷隆盛に降伏を勧告して送った手紙の冒頭部です。
==================================
山縣有朋頓首再拝、謹んで書を西郷隆盛君の幕下に呈す。有朋、君と相識るここに年あり。君の心事を知るまた甚だ深し。曩に君の故山に帰養せしより、久しくその謦咳に接することを得ざりしかど、舊雨の感豈一日も有朋の懐に往来せざらんや。料らざりき、一旦滄桑の変に遭ひて、ここに君と鼓皷の間に相見るに至らんとは。君が帰郷の後ち、世の鹿児島縣士族の暴状を議するもの皆いはく、「西郷実にその巨魁たり、謀主たり」と。然れども有朋は獨りこれを斥けて、然らずとなせりき。然るに今かくの如し。嗚呼また何をか言はん。

ChatGPT
Here’s an English translation of the opening of the letter Yamagata Aritomo sent to Saigō Takamori during the Satsuma Rebellion, urging him to surrender:

With utmost respect, I, Yamagata Aritomo, bow deeply and humbly present this letter to you, Saigō Takamori. I have known you for many years and am intimately familiar with your character and intentions. Since you retired to your native mountains, it has been a long time since I last had the honor of your company. Yet, not a single day has passed without the fond memories of our past friendship crossing my mind. Never did I imagine, however, that we would meet again under such tragic circumstances, on opposing sides of the battlefield.

Since your return to Kagoshima, many have condemned the actions of the samurai of Kagoshima, asserting, “Saigō is indeed the ringleader, the mastermind of this rebellion.” Yet, I alone refuted these claims, insisting it could not be true. And now, we find ourselves in this situation. Alas, what more is there to say?

This translation captures the formal and respectful tone appropriate for the historical context of the letter. Let me know if you need further refinement.


「故山に帰養せし」は「故郷に帰る」という意味です。

ChatGPT
Thank you for the clarification! Here’s a revised translation:

With utmost respect, I, Yamagata Aritomo, bow deeply and humbly present this letter to you, Saigō Takamori. I have known you for many years and am intimately familiar with your character and intentions. Since you returned to your hometown, it has been a long time since I last had the honor of your company. Yet, not a single day has passed without the fond memories of our past friendship crossing my mind. Never did I imagine, however, that we would meet again under such tragic circumstances, on opposing sides of the battlefield.

Since your return to Kagoshima, many have condemned the actions of the samurai of Kagoshima, asserting, “Saigō is indeed the ringleader, the mastermind of this rebellion.” Yet, I alone refuted these claims, insisting it could not be true. And now, we find ourselves in this situation. Alas, what more is there to say?

生成AIによる候文の手紙の英訳

ちょっと試しに、ChatGPT4oに候文の手紙を英訳させてみたら、完璧に訳しました!びっくり。また「不名誉な場所(=遊郭)」を”unsavory places”と訳していて、へええ、と思いました。

以下は候文の手紙の冒頭部です。英語に訳してください。
=================================
この頃の寒気に御さはりも無き御様子にて、先ず先ず安心致し候。
実は久しく御出無之によりいかにやとお案じ申せし次第なり。しかし聡明にして勉強好きの足下、健康でさへあれば他は安心と思ひの外、さる確かなる筋より承聞するに、この頃は学校の課業も怠り勝ちにして懦弱なる軟文学の耽読に日を消さるるのみならず、折々は悪友と共に不名誉の場所へ行かるるとの事、果たして事実なりや、如何。御国許の父君より、昨今屡予定以外の送金を請求し来るは何か仔細なきかとの御手紙ありしに対し、政夫君に限りて御心配の事ある筈なしと保證しおきしが、今思ひ出づれば、老生こそ監督を依頼されながら迂闊の至り、申訳なき次第なり。

ChatGPT
Here’s the English translation of the beginning of the letter in epistolary style:
With the recent chill in the air, I am relieved to know that you seem unaffected, allowing me some peace of mind. In truth, I had grown somewhat concerned due to your prolonged absence. Yet, knowing your intelligence and love for study, I believed that as long as your health was intact, there was no cause for worry. However, I recently heard from a reliable source that, lately, you have been neglecting your schoolwork, spending your days absorbed in frivolous literature, and, on occasion, visiting unsavory places with questionable company. Could this truly be the case?
Your father from home has also written with some concern, wondering if there might be a reason for the recent requests for additional, unplanned funds. I assured him that he need not worry in the least about Masao, yet now, upon reflection, I feel I have been far too remiss in my oversight and cannot help but feel remorse for my negligence.

「プログラミング言語AKW」第2版

なんと「プログラミング言語AWK」の第2版が出ていました!初版は1989年です。私が買ったのは1991年。他のUnixツールと連携を取りながら動くスクリプト言語の元祖で、その後、perlやrubyやpythonなど多くのスクリプト言語が出て来ましたが、仕様面ではそれらに劣るとはいえ、awkがまだまだ現役で多くの人に使われているという証拠ですね。早速ポチりました。最後の方に書いてありましたが、現行のgawk(GNU版AWK)は何とPerl、Java、Python、Ruby、PHPなどより処理速度が高速なんだそうです!これはちょっとびっくりしました。言語仕様が簡素なのが処理速度の向上につながっているのでしょう。何と言ってもAWKのコスパ(書く手間と得られる利便の比)は今でも他の言語の追随を許しません。

今後10年で生成AIで大きな打撃を受けるか無くなる業種

日本では生成AIへの危機感が薄いように思いますが、今後の10年単位で無くなるまたは大きな打撃を受ける業務は、ざっと思いついただけでも以下のものがあります。私はこれまで外国語の学習にかなりの時間を割いてきたけど、もし私に子供がいたとしたら、同じことは勧めません。

語学系
1.翻訳者
2.語学教師
3.企業の中の外国語屋

IT系
1.派遣型のソフト開発会社
2.SIer
3.ITコンサルタント

専門業務系(前提:法律の変更が必要→専任業務を無くす)
1.弁護士・行政書士・社労士・司法書士
2.不動産販売士
3.税理士

金融系
1.ファイナンシャルプランナー
2.投資コンサルタント
3.保険の計算屋

学術系
1.多くの文系の教官
2.学術系出版社の編集者
3.図書館の司書

その他
1.サポート業務
2.多くの産業系デザイナー
3.企業の中の経営企画
4.映画やテレビの脚本家

VSCodeをインストール

私はプログラミングは昔のやり方のままで、未だにIDEを使わずエディターでプログラムを書いていますが、思う所あってVSCodeをインストールしてみました。生成AIによる楽々プログラミングにはまったので、GitHub Copilotを使ってみようかと思ってです。まあお遊びかもしれませんが、高齢プログラマーに生成AIは強力な武器になりますので。

製品検索サイト完成

会社で業務の合間にコツコツ作っていた製品検索サイトがようやく完成しました。写真も1/4くらいは私が撮影したのを使っていて、生成AIの助けは借りましたが、基本的に一人で作って仕上げました。60歳過ぎて初めてLaravel/PHPでちゃんとしたサイトを作るということに成功して、ちょっと達成感があります。

製品検索ページの実装ほぼ終了

会社のWebサイト用の製品検索ページの実装がほぼ終わりました。後はデータの登録だけ。(ってこれが結構大変ですが)
今回、完全な分業で、データベースの登録、検索画面の作成等は私がLaravel/phpを使ってやりました。データベース関係はphpMyAdminもフルに使っています。そしてその後の細かな機能(選択状態クリア、検索結果画面に品名コピーボタン追加、検索件数表示、検索待ちの時にカーソルをグルグルに変える、選択候補の絞り込み、等々)は全てChatGPT4oにJavaScriptで書かせ、そっちは私は1行も書いていません。ともかくLaravelのphpのソースを渡して、「この機能追加して」で済むので、タイピングの手間、JavaScriptの書き方の調査だけでも大変な省力化です。おそらくベタに私が全部書いたら10倍の時間がかかったと思います。
ただChatGPT4oもちょっと抜けている所があって、新しい機能を追加すると前の機能が動かなくなるというのが多発しました。なのでソースは毎回渡した方が結果はいいようでした。

JavaScript: 動的な選択候補の絞り込み(2)

取り敢えず、スイッチの操作部種別を選んだら、それに対応する極数の候補を動的に絞り込むというJavaScriptのコードをChatGPT4oに作らせ動きました。最初は絞り込みの対応関係をJSONで書いてそれを読み込ませようとしたのですが、上手く動かないので結局元のHTML(blade)ファイルの中に書込む形になりました。あまり綺麗ではありませんが。しかしなかなか大変。書店でJavaScriptの本を何冊か立ち読みしてみましたが、現在選択されている候補を取得するとか、逆に候補を設定するとかはありましたが、動的な絞り込みまで載っている本は見つけられませんでした。
=========================================
<script>
document.addEventListener(‘DOMContentLoaded’, function() {
const switchOpPartSelect = document.querySelector(‘select[name=”switch_op_part_id”]’);
const switchPoleSelect = document.querySelector(‘select[name=”switch_pole_id”]’);

const allPoleOptions = [
@foreach ($switch_poles as $switch_pole)
{ id: “{{ $switch_pole->id }}”, text: “{{ $switch_pole->poles_number }}” },
@endforeach
];

switchOpPartSelect.addEventListener(‘change’, function() {
const selectedOpPartId = parseInt(this.value);
let filteredPoleOptions = [{ id: “1”, text: “-” }];

if ([2, 3, 5, 6].includes(selectedOpPartId)) {
filteredPoleOptions = filteredPoleOptions.concat(allPoleOptions.filter(option => [11, 12, 13, 14].includes(parseInt(option.id))));
} else if (selectedOpPartId === 4) {
filteredPoleOptions = filteredPoleOptions.concat(allPoleOptions.filter(option => [11, 12].includes(parseInt(option.id))));
} else if (selectedOpPartId === 7) {
filteredPoleOptions = [{ id: “1”, text: “-” }].concat(allPoleOptions);
} else {
filteredPoleOptions = [{ id: “1”, text: “-” }].concat(allPoleOptions);
}

switchPoleSelect.innerHTML = ”;
filteredPoleOptions.forEach(option => {
const newOption = document.createElement(‘option’);
newOption.value = option.id;
newOption.textContent = option.text;
switchPoleSelect.appendChild(newOption);
});
});

document.querySelector(‘form’).addEventListener(‘submit’, function() {
showLoadingMessage();
});

window.resetForm = function() {
document.querySelectorAll(‘select’).forEach(select => {
select.selectedIndex = 0;
});
document.querySelector(‘input[name=”type_name”]’).value = ”;

switchPoleSelect.innerHTML = ”;
[{ id: “1”, text: “-” }].concat(allPoleOptions).forEach(option => {
const newOption = document.createElement(‘option’);
newOption.value = option.id;
newOption.textContent = option.text;
switchPoleSelect.appendChild(newOption);
});
}
});

function showLoadingMessage() {
document.getElementById(‘loading-message’).style.display = ‘block’;
document.body.classList.add(‘loading’);
}
</script>

JavaScriptのフレームワーク

まがりなりにも、Laravel/PHPを使ったWebアプリの開発が最低レベルながら出来るようになり、次はインタラクティブ性向上のためJavaScriptのコードを書くという段階で、一応こんな本をポチってみました。今作っているレベルのものにはフレームワークは不要と思いますが、何かの時に役立つかもしれないと思って。
まあ生成AIが全部コード書いてくれる時代に、この手の自学自習は時代遅れなのかもしれませんが、最低限ボケ防止ぐらいにはなると思います。