サインイン オプション

Windows
01 /02 2016
はじめに:
もし検索エンジンなどでこのブログに辿り着いた人が居たとして、この記事を読んでも、解決のお手伝いにはならないと思う。
以下を読んでもあまり得るものがないだろうから、忙しい方は、他のサイトに行くことをお薦めする。



メインPCのOSをWindows8.1から10に変えたのは、2015年9月上旬だったと思う。
Windows8.1を使っていた頃、サインインにPINコードを使っていた。パスワードよりPINの方が入力が簡単だし、PINの方が安全だという話だったので。
しかしWindows10になってから、PINでサインインすることができなくなってしまった。「サインイン オプションの変更」画面を開いて、PINの「変更」をクリックすると、フリーズしてしまうのだ。(Windows全体が固まるわけでは無いので、タスクマネージャでコントロールパネルを終了させればフリーズは解除される)
いろいろ調べたが、情報が出揃っていなかった時期だったので、原因も解決策も分からなかった。
「放っておけばそのうちWindows10がアップデートされて直るかもしれない」と思い、PINを諦めてパスワードでのサインインを使っていた。

あれから3ヶ月。
本日、試しに「サインイン オプションの変更」画面を開いて、PINの「変更」をクリックすると、正常に先に進むことができた。
いつの間にか問題が解消されていた事になる。そういえば昨日、Windowsのアップデートがあり、「更新してシャットダウン」を選んだのだが、それが効いたのかもっと前から直っていたのかは、今となっては分からない。

4桁のPINコードには、既に何かが登録されているようだ。Windows8.1時代の値が保持されているに違いない。
データは壊れていなかったがUIが壊れていた、といったところだろうか。
(余談だが、PINの下に「ピクチャ パスワード」が使えるようになっているのだが、こちらは今まで1度も使っていないため、「変更」「削除」でなく「追加」ボタンが表示されていた)
PINの「変更」画面で何もせずにキャンセルし、Windowsをログオフして、サインイン オプションをPINにしてみた。
見事に、Windows8時代の4桁のコードでサインインできた。

結局、「いつの間にか直っていた」としか言いようがない。原因も解決策も不明のままだ。
解決した理由は、個人的な推測では、Windows自体が強化された(というかバグが直った)のではないかと思う。だとしたらもう2度と同じ現象にはならない筈だ。
しかし、同じ現象が何かのはずみで再発したりしたら、もうどうすれば分からない。何も教訓がないからだ。「3ヶ月待っていたらいつの間にか直った」以外に得たものがない。

docxを開くときに「このファイルを開く方法を選んでください」となった場合の修復手順

Windows
12 /02 2015
現在、Windows10とOffice2013を使用している。
数日前から、docxファイルを開こうとすると、「このファイルを開く方法を選んでください」というダイアログが出るようになった。
その場で「Word(デスクトップ)」を選んでやれば、後は普通に使えるのだが、毎回これが出るのは鬱陶しいし、システムを正常でない状態のままにしておくのは気持ちが悪いので、修復することにした。
実はWindows8.1の頃にも同じような現象になったことがあり、今回が2度目か3度目だ。毎回手順を調べるのも面倒なので、ここに整理しておく。

1. 復元ポイントの作成
この手順は必須ではないが、システムに何か変更を加えるときには、事前に「復元ポイントの作成」を実行しておき、万が一の場合にでも元に戻せるようにしておくと良い。
復元ポイントの作成については、他サイトのこちらこちらの記事が詳しく書いてあるので、そちらを参考に。

2. 「既定のプログラム」の確認
Wordのインストール状態が正しいか、何らかの理由で破損しているのかを調べる。
(1) コントロールパネルを開く。
方法はいろいろあるが、[Win]+[X]を押して[P]が確実で早いと思う。

(2) 既定のプログラムを選ぶ。
(2-a) コントロールパネルの表示方法が「カテゴリ」の時は、「プログラム」を選び、
コントロールパネル カテゴリ 1

次に「既定のプログラム」の下にある「既定のプログラムの設定」を選ぶ。
コントロールパネル カテゴリ 2

(2-b) コントロールパネルの表示方法が「大きいアイコン」または「小さいアイコン」の時は、「既定のプログラム」を選び、
コントロールパネル アイコン 1

「既定のプログラムの設定」を選ぶ。
コントロールパネル アイコン 2

(3) Wordがあるかどうか確認
少し待つと、以下のように、このコンピュータにインストールされているプログラムが一覧表示されるはず。
規定のプログラム1
前置きが長くなったが、ここで確認して欲しいのは、一覧の中に「Word(デスクトップ)」があるかどうか。
Wordを正しくインストールしたのであれば、本来、上図のように「Word(デスクトップ)」が表示される。
しかし、何らかの理由で、これが表示されなくなってしまう事がある。実際、私がそうだった。
不思議なことに「Excel(デスクトップ)」や「Powerpoint(デスクトップ)」など他のOfficeアプリはある。Wordだけ無い。以前(Windows8.1の頃)も同じだった。
「Word(デスクトップ)」が表示されていれば 4. へ。表示されていなければ 3. へ。

3. Officeの修復
「既定のプログラム」の一覧の中に「Word(デスクトップ)」が表示されないのは、Officeが破損しているせいなので、以下の手順でOfficeを修復する。
(1) 再びコントロールパネルを開く。
上から順に手順を踏んでここまで辿り着いたのなら、「既定のプログラム」画面が開いているはず。
その画面の左上にある「←」ボタンでコントロールパネルのトップに戻ることができるが、この画面は後で使うので開きっぱなしにしておいて、新たにコントロールパネルを開くと良い([Win]+[X]を押してから[P]を押す等)。

(2) 「プログラムと機能」を選択
(2-a) コントロールパネルの表示形式が「カテゴリ」の場合は、まず先ほどと同様に「プログラム」を選び、次に「プログラムと機能」を選ぶ。
コントロールパネル カテゴリ 3

(2-b) コントロールパネルの表示方法が「大きいアイコン」または「小さいアイコン」の時は、「プログラムと機能」を選ぶ。
コントロールパネル アイコン 3

(3) 修復
「プログラムのアンインストールまたは変更」画面になるので、一覧から Microsoft Office を探して、上部にある「修復」を押す。
プログラムと機能

「Officeをどのように修復しますか?」と聞かれるので、クイック修復を選んで(自動的に選択されているはず)「修復」。
Officeの修復ダイアログ

Excel等の関連アプリが開いている場合は、閉じるように言われる。
しばらく待つと、修復が完了する。
Officeの修復 完了
「閉じる」を押す。
「プログラムのアンインストールまたは変更」画面に戻る。この画面はもう使わないので閉じて良い。

4. 「既定のプログラム」の設定
(1) 状況確認
上述の 2. 「既定のプログラム」の確認 で、一覧の中にWordがあった人は3.を飛ばしてこの章に、Wordがなかった人は3.で修復してこの章に辿り着いていることと思う。
よってこの時点で「既定のプログラム」の一覧を見ると、「Word(デスクトップ)」が表示されているはず。
「既定のプログラム」を開きっぱなしにしたままで修復を行った人は、いったんメニューバーの[表示(V)] - [最新の情報に更新(R)]を押すと良い。
(どうやっても「Word(デスクトップ)」が表示されない場合、申し訳ないが私にはお手上げだ。以下の記事は役に立たない。)

(2) Wordを選択
「Word(デスクトップ)」を選び、「既定でこのプログラムで開く項目を選択する」を押す。
Wordの選択 1
なお「すべての項目に対し、既定のプログラムとして設定する」を押しても差し支えないとは思うが、いい機会なのでここで詳細画面を確認しておくことをお勧めする。

(3) 拡張子の関連付け
Officeの修復をした場合でもしなかった場合でも、.docx の関連付けが外れている場合がある。
もし .docx の行のチェックボックスがオフになっていたら、オンにする。
Wordの選択 2
同様に、.doc など、Wordで開きたい拡張子のチェックボックスがオフになっていたら、オンにする。
よく分からない拡張子は、いじらなくて良い。
最後に「保存」。
なおこの画面では、チェックボックスをオフからオンにする事はできるが、オンをオフにする事はできないようなので、まちがってオンにしたら保存せずにキャンセルして、画面を開き直す。

(4) Excelの確認
Officeの修復をした場合、.xlsx の関連付けが外れてしまう場合がある。私がそうだった。
これにより、修復前は「docxを開く度にダイアログが出るが、xlsxは普通にExcelで開くことができた」人でも、
修復後は「xlsxを開く度にダイアログが出る」ようになってしまう事がある。
これを直すには、(2)(3)と同様の手順を行う。簡単に言うと以下の通り。
・「規定のプログラムを設定する」画面の一覧から「Excel(デスクトップ)」を選ぶ。
・「既定でこのプログラムで開く項目を選択する」を押す。
・.xlsxのチェックボックスをオンにして「保存」。

以上で完了。PCの再起動は必要ない。(私はそうだった。再起動したければすれば良い。損はない。)
これで、docxでWordが、xlsxでExcelが普通に開けるようになったはずだ。

GMailで受信したメールを翻訳して転送

GMail
05 /09 2015
Google Apps Scriptというものを使えば、GMailをいろいろ操作できることが最近分かった。
詳しくは「初心者のためのGoogle Apps Scriptプログラミング入門」などを参照。

さて、最近RWatchというApple WatchのAndroid版かつ劣化版を買ったのだが、さすが安物、中国製なのに漢字が表示できない。
いろいろ試してみたが、どうやらRWatch自体が、(ごく一部の記号を除いて)マルチバイト文字を持っていないようだ。
「カタカナは表示できる」とか「漢字の一部が文字化けするがそこそこ表示できる」という情報もあったが、私のRWatchは運悪く、ほとんどの全角文字が表示できない。
これだと、せっかくRWatchがメール着信をお知らせしてくれても、送り主も件名も全く読めない。
そこで、RWatchで日本語を表示するのは諦め、メールを日英翻訳して、RWatchに英語メールをお知らせしてもらうようにすればいいと考えた。

流れとしては以下の通り。
1. GMailがメールを受信する。
2. あらかじめGMail側でフィルタを作っておき、特定の発信者からのメール(または特定のキーワードを含むメール)には、ラベル「R」が付くようにしておく。
3. スクリプトが作動し、ラベル「R」が着いているメールに対して、以下の処理を行う。
(1) 件名と本文を日英翻訳。
(2) 翻訳結果を別のメールアドレスに転送。
(3) ラベル「R」を剥がす。(無限ループ回避のため)
4. スマホ上のメール受信アプリ(GMailではないもの。私はK-9Mailというアプリを使用した)にて、別アドレスのメールを受信する。
5. スマホ上のRWatch用アプリにて、予め「Notification app」の設定をしておく。
これはつまり、スマホのステータスバーに表示されるメッセージの内、どれをRWatchに転送するかを選択するもの。
「GMail」の転送をOFFにして、その代わりに「K-9Mail」の転送をONにしておく。
これによって、K-9Mailで受信したメールが、スマホのステータスバーに表示されると同時に、RWatchにも表示される。

ということで、Google Apps Scriptで、3.の機能を実装できればOKという事になる。
以下がそのスクリプト。


function Gmail_translate(){
// 転送先アドレス
var fw_addr = 'hoge@hoge.jp';
// ラベル"R"
var labelR = GmailApp.getUserLabelByName("R");
// ラベル"R"が付いたメールスレッド
var threads = labelR.getThreads();
//Logger.log("threads.length = " + threads.length);
for (var i in threads) {
// スレッド表示がONになっているかもしれないので、スレッド毎に各メールを取得する
var messages = threads[i].getMessages();
for (var j in messages) {
var message = messages[j];
// 既読メッセージに対しては何もしない
if (!message.isUnread())
continue;
// 発信者, 件名, 本文, 送信日時を得る
var from = message.getFrom();
var subject = message.getSubject();
var body = message.getPlainBody().replace(/\r/g, "").replace(/\n\n/g, "\n").replace(/\n\n/g, "\n");

// 日英変換
var from_en = LanguageApp.translate(from, 'ja', 'en');
var subject_en = LanguageApp.translate(subject, 'ja', 'en');
var body_en = LanguageApp.translate(body, 'ja', 'en');
// bodyを加工
// ">"で始まる行はカット
//#body_en = body_en.replace(/^>.*$/mg, ""); //←これだと空行が残る
body_en = body_en.replace(/>[^\n]+\n/g, "");
// From:を偽装することはできないので、本文の1行目にFromを入れる
// ついでに件名を2行目に入れる
var body_en = "From:" + from_en + "\n" + "Subj:" + subject_en + "\n\n" + body_en;

// メール送信
GmailApp.sendEmail(fw_addr, subject_en, body_en);
}
// スレッドの全メールからラベル"R"を剥がす
threads[i].removeLabel(labelR);
}
}


セットアップの手順:
1. `PCで、GMailにログインした状態で、Googleドライブを開く。
2. 左メニューから [新規]-[その他]-[Google Apps Script]を選ぶ。
[Google Apps Script]が選べないときは、[新規]-[その他]-[+ アプリを追加]を選び、検索窓に"Google Apps Script"を入力して検索し、インストールする。
3. 「空のプロジェクト」を選ぶ。
→「無題のプロジェクト」が開き、コード.js というファイルの画面になる。
4. function myFunction() を function Gmail_translate() に書き換えて、 関数の中身を上述のソースの通りにして、保存する。
→ファイル名を聞かれるので、"Gmail_translate.js"にする。
5. [リソース]-[現在のプロジェクトのトリガー]。
→ダイアログが開くので、以下のように設定する。
Gmail_translate_trigger.gif

これで分かるように、スクリプトが作動するトリガーは「メールを受信したとき」ではなく、「1分ごと」である。
したがって、GMailにメールが届いてからスクリプトが作動するまで、最大1分待つことになる。
「1分ごと」でなく「5分ごと」の方が、GMail的には負荷が減って良いと思うが、デバッグ段階では1分の方が良い。




Excite翻訳に日本語テキストを渡して翻訳結果を得る

その他の話題
04 /12 2015
日英翻訳を行うサービスを使って、日本語テキストを英語に変換するプログラムを書いてみた。
今回使うのは、普段からよく利用しているExcite翻訳
Google Translate API や MicrosoftのAPIも調べたが、登録が必要なので却下。

Excite翻訳についても、XMLが使えるとか、HTTP POSTでやりとりする情報がいくつか見つかったが、情報が古いせいか、試行錯誤してみたがどうもうまくいかなかった。
そこで、最も手っ取り早くて確実な方法、すなわちHTTP GETで原文を渡し、結果をHTMLで取得してから必要なデータだけを切り出すことにした。

まずはブラウザに以下のURLを入力してみる。
http://www.excite.co.jp/world/english/?before=I+like+apple&wb_lp=ENJA
これで、Excite翻訳のサイトが開き、左側のテキストボックスに"I like appe"、右側に"私はりんごが好きである"と表示される。
(もしこれができないようなら、Excite翻訳の仕様が変わったのかもしれない。2015年4月現在は問題ない。)

ここまでできれば、後は人間とブラウザの代わりにPHPがパラメータを送信して結果を解析すれば良い。
以下はその全ソース。


<?php
/**
* Excite翻訳に日本語テキストを渡して翻訳結果を得る
*/

// 起動時オプションの解析
$options = getopt('hv');
if (isset($options['h']))
help();

function help() {
echo "Excite翻訳に日本語テキストを渡して翻訳結果を得る\n"
."Usage: ". basename($_SERVER['PHP_SELF']). " [-h][-v] < 日本語テキストファイル\n"
." -h Helpを表示して終了\n"
." -v 饒舌モード\n";
exit;
}

// 饒舌モード
$verbose = FALSE;
if (isset($options['v']))
$verbose = TRUE;

// 標準入力から全部読む
$input = file_get_contents('php://stdin');
$input = str_replace("\r", '', $input);
// HTTP GETを使う都合上、600byte以内に納める
// ("あ"はUTF8では3byteだが、url_encodeすると9byteになる
// → GETは通常2000byte程度が上限なので、1/3以下の600byteに抑える)
if (strlen($input) > 600) {
// 1行ずつ文字数を数え、600を超えるまで足していく
$a = explode("\n", $input);
$input = '';
foreach ($a as $s) {
if (strlen($input. $s) > 600)
break;
$input .= "$s\n";
}
}
if ($verbose)
echo $input;

// Excite翻訳の呼び出し先URL
// HTTP POSTやXML通信などを試行錯誤してみたが、結局HTMLをGETする方法しかうまくいかなかった
$url = "http://www.excite.co.jp/world/english/?before=". urlencode($input). "&wb_lp=JAEN&ie=UTF-8";

// HTML丸ごと取得
$contents = file_get_contents($url);
#echo $contents;

// 翻訳結果の部分だけ得る
$after = '';
if (preg_match('/<textarea id="after"[^>]+>(.*)<\/textarea>/Uu', $contents, $match)) {
$after = htmlspecialchars_decode($match[1]);
$after = str_replace('&#010;', "\n", $after);
}
echo "$after\n";


使い方は、コマンドラインで
$ echo "こんにちは、世界!" | php excite.php
とするか、あらかじめ日本語のテキストファイル(例えば nihongo-file.txt )を作っておき、
$ php excite.php < nihongo-file.txt > eigo-file.txt
のようにすれば良い。

PHPからメールを送って迷惑メールにならないようにする

サーバ運用
12 /03 2014
PHPから mb_send_mail や Qdmail を使ってメールを送り、Gmailで受信すると、迷惑メールになってしまう事が増えてきた。
できるだけ迷惑メールにならないように、サーバ側の設定を行う。

1. 前提
・www.example1.jp というサーバから、PHPでメールを送る。
・From は abc@example1.jp
・送り先は xyz@gmail.com
・開発者は www.example1.jp にSSHでログインでき、rootになる事もできる。
・www.example1.jp のIPアドレスは 222.222.222.222 。
・PHPの実効ユーザは apache。

2. SPFの設定
www.example1.jp にSPFの設定がない場合、受信したメールのソースを読むと(gmailなら「メッセージのソースを表示」)、
Received-SPF: none (google.com: apache@www.example1.jp does not designate permitted sender hosts) client-ip=222.222.222.222;
という行がある事がわかる。
SPFについての詳しい説明は割愛するが、none は「SPFレコードが存在しないか公開されていないため、認証できなかった」という意味。
これがpass(「合格」)になるようにしたい。

●SSHでの設定
・サーバにSSHでログインし、rootになる。
・viでゾーンファイルを編集する。
ゾーンファイルは、/etc/named/example1.jp.zone(サーバによっては /var/named/example1.jp.zone かもしれないしもっと他の場所・名前かもしれない)。
末尾に以下を追加する。
example1.jp. IN TXT "v=spf1 ip4:222.222.222.222 ~all"
example1.jp の部分は自サーバのドメイン名。末尾に . を付ける。
222.222.222.222 の部分は自サーバのIPアドレス。
・同ファイルの上の方にあるシリアル値に1を足す。
@ IN SOA www.example1.jp. root.example1.jp. (
2014112701
→この場合なら 2014112702 にする。
・上記の設定内容を反映させるため、namedを再起動する。
/etc/init.d/named restart

● Webminが使える場合
・Webminを開く。
・[サーバ]-[BIND DNS サーバ]をクリック。
・[既存の DNS ゾーン]-[example1.jp]をクリック。
・[レコード ファイルの編集]。→ ゾーンファイルの編集画面が開く。
・末尾に以下を追加する。
example1.jp. IN TXT "v=spf1 ip4:222.222.222.222 ~all"
example1.jp の部分は自サーバのドメイン名。末尾に . を付ける。
222.222.222.222 の部分は自サーバのIPアドレス。
・[レ]Increase serial number automatically にチェックを入れる。
・[保存]。
・[変更を適用](または[Apply Configration])を押す。

これにより、SPFの設定ができた。
再度メールを送受信してみる。
Received-SPF: pass (google.com: domain of apache@www.example1.jp designates 222.222.222.222 as permitted sender) client-ip=222.222.222.222;
になるはず。

3. エンベロープFromの設定
上の Received-SPF を見ると、apache@www.example1.jp と書いてある。
これは、メールヘッダのFromではなく、エンベロープ(封筒)のFromが apache@www.example1.jp になっていた事を意味する。
さらに Return-Path: を見ると、これも apache@www.example1.jp になっている。
これが原因で迷惑メールになる恐れがあるだけでく、相手にメールが届かなかった場合、abc@example1.jp にメールが返らず、apache@www.example1.jp に変更されてしまう。
これを回避するには、PHP側で、FromだけでなくエンベロープFromもセットしてやる。

● mb_send_mail の場合
mb_send_mail($to, $subject, $body, "From: $from", "-f$from" );

● qdmail(関数型)の場合
$option = array(
'type' => 'text',
'option' => array(
'mtaOption' => "-f $from"
)
);
qd_send_mail($option, $to, $subject, $body, $from);

これで、期待通り、以下のようになる。
Received-SPF: pass (google.com: domain of abc@www.example1.jp designates 222.222.222.222 as permitted sender) client-ip=222.222.222.222;

4. 信任ユーザの設定
SPFはpassになり、メールアドレスも正しくなったが、今度は
X-Authentication-Warning: www.example1.jp: apache set sender to abc@www.example1.jp using -f
という行が出力されてしまった。
これは「apacheが -f オプションを使って送信者を書き換えた」という警告。
回避するには、apacheが -f オプションを使って良いユーザ(=信任ユーザ)だと設定してやる。

● SSHでの設定
・サーバにSSHでログインし、rootになる。
・viで /etc/mail/trusted-users を編集する。
・末尾に apache を追加する。

● Webminが使える場合
・Webminを開く。
・[サーバ]-[Sendmail の設定]をクリック。
・[信任ユーザ (T)]。 → 信任ユーザの編集画面が開く。
・末尾に apache を追加して[保存]。

これで、X-Authentication-Warning が出力されなくなる。

5. それでも迷惑メールになる場合
・DKIM やら DMARC やらの設定をしてやると良いようだが、これはまだ試していない。
・いかがわしい内容のメールだったりすれば、迷惑メールと判断されても仕方がない。
・多くのユーザが迷惑メールと判定したら、Gmailが迷惑メールとみなすらしい。

Paq

忘れっぽい中年プログラマが、日々の開発作業の中で、忘れると困ることを書き留めています。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。