物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

Windows: Adobe DC (Acrobat Pro)でエラーコード 206によりログインだけができないトラブルへの対処

Adobe Acrobat Proをインストールしようとしたところ、インストールは成功したが、ユーザー名とパスワードを入れてログインしようとしたときに、画面がループして動かなくなる状態が発生した。具体的には

サーバーの切断
アドビのサーバーにアクセスできないため、インストーラーがAcrobatをダウンロードできません。
アドビのステータスページで障害が発生していないかを確認し、後でインストールを再試行してください。(エラーコード:206)

このエラーを修正する方法:
1. ファイアをーるの設定をチェックし、アドビのサーバーにアクセスできることを確認してください。その後、ファイアウォールを一時的に無効にしてから、再試行してください。
2. ウイルス対策ソフトウェアを一時的に無効にしてから、再試行してください。
ヘルプを表示

インストール終了 再試行

この画面と

ログインしました
このウィンドウを閉じることで、中断したところに戻れます。

この画面がループした。

Adobeアプリのダウンロード、インストール、アップデートのエラーを解決する

によると、エラーコード 206の原因は

サーバーとの接続に問題があるか、インターネット接続が利用できないことを示します

であり、解決策は

  • インターネットに接続しているかどうか確認する
  • 別のネットワークを試す
  • ソフトウェアファイアウォールを設定する
  • ウイルス対策ソフトウェアを一時的に無効にする

である。

しかし、ネットワークセキュリティの問題ではなかった。 これは、swupdl.adobe.com swupmf.adobe.com ccmdl.adobe.com 等に接続できることで確認した。 プロキシも使っていなかった。ネットワークを変えても変わらなかった。ファイアウォールも特別な設定はしていなかった。

アンチウイルスソフトは、Windows標準のDefenderを使っていて、特殊な設定もしておらず、原因の可能性も低かった。

オフラインインストーラーでインストールしても症状は改善しなかった。 helpx.adobe.com

ユーザー情報およびライセンス情報の問題 で書かれていることをしても症状は改善しなかった。 helpx.adobe.com

一方、Adobe Acrobat 2019のインストールもログインも成功すると言う不思議な状態だった。

この原因は、最近多用されている「資格情報マネージャー」にあるようだった。資格情報マネージャーが記録できる資格情報数には上限がある。コマンドベースだと「cmdkey」で、コントロールパネルのGUIから「汎用資格情報の追加」で資格情報を操作するが、上限に達している場合、ここで追加しようとすると、

CMDKEY: このコマンドを処理するにはメモリ リソースが足りません。

等のコマンドが出て追加できなかった。

つまり、このケースでは、Adobeのサーバーに正常に接続し、アカウント情報も正しいため一瞬だけログインもできて、資格情報も得られたが、Windows側に資格情報を保存できなかったために、それを使った認証に失敗し、あたかもアドビのサーバーの問題であるかのようなエラーメッセージが表示されたようだった。

使っていない資格情報が大量に(おそらく200以上)蓄積されていた原因は、Git for Windowsで特殊な条件でGithubのへのログインを大量に行ったためであった。それらを削除することで、Acrobat Proへのログインが成功するようになった。

ちなみに、資格情報数の上限は255程度であろうかと思われる。

Google Apps Script(GAS): Google Drive上のテキストファイルを読み取り、上書きする

Google Apps Scriptで、Google Drive上のテキストファイル(TXTやJSON)を読み取り、上書きしてみよう。

ファイルIDは、Google Drive上のファイルを表示させて、「共有」から「リンクをコピー」したときの https://drive.google.com/file/d/この部分/view?usp=sharing のことである。

読み取り

  var FILE_ID = "set file id here";
  var file = DriveApp.getFileById(FILE_ID);
  console.log(file.getBlob().getDataAsString());  

書き込み(上書き)

  var FILE_ID = "set file id here";
  var file = DriveApp.getFileById(FILE_ID);
  file.setContent("file content");

Google Apps Script(GAS): SpotifyのAPIでプレイリストを取得する

Google Apps Script経由で、SpotifyのAPIを使って、プレイリストを取得してみよう

function myFunction() {
  var clientId = "set your clientId here";
  var clientSecret = "set your client secret here";

  var url = "https://accounts.spotify.com/api/token";
  var params = {
    method: "post",
    headers: { "Authorization": "Basic " + Utilities.base64Encode(clientId + ":" + clientSecret) },
    payload: { grant_type: "client_credentials" },
  };
  var response = UrlFetchApp.fetch(url, params);
  var access_token = JSON.parse(response.getContentText()).access_token;

  var playlists = ["4tY0lHoV8IemMBp4iTnKnl", "799Fo9to2TK0ahGEJsvcm2"];
  for (var i = 0; i < playlists.length; i++) {
    var url = "https://api.spotify.com/v1/playlists/" + playlists[i];
    var params = {
      method: 'get',
      headers: { 'Authorization': 'Bearer ' + access_token }
    };

    var response = UrlFetchApp.fetch(url, params);
    var data = JSON.parse(response.getContentText());
    Logger.log(data.name + " " + data.tracks.items.length)
  }
}

VScode: 独自の syntax highlighter 拡張機能を作る

シンタックス(構文) ハイライター用の拡張機能(Extension)を作る。拡張機能として公開することは目指さない。

インストールしていない場合は以下をインストールする。

VS Codeの雛形インストール

npm install -g yo generator-code
yo code

色々聞かれる。今回はLISE++ファイル(*.lpp)を読む拡張機能を作るので以下の設定とした。

 New Language Support を選ぶ
URL or file to import, or none for new: → `Enter`
What's the name of your extension? → `LISE-Reader`
What's the identifier of your extension? → `Enter`
What's the description of your extension? → `Enter`
 Language id: → `lise`
Language name: →`LISE`
File extensions: → `.lpp`
Scope names: → `lise-file.lpp`
Initialize a git repository? → Y
Open with code を選択

lise.tmLanguage.json を見ると

{
    "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
    "name": "LISE",
    "patterns": [
        {
            "include": "#keywords"
        },
        {
            "include": "#strings"
        }
    ],
    "repository": {
        "keywords": {
            "patterns": [{
                "name": "keyword.control.lise",
                "match": "\\b(if|while|for|return)\\b"
            }]
        },
        "strings": {
            "name": "string.quoted.double.lise",
            "begin": "\"",
            "end": "\"",
            "patterns": [
                {
                    "name": "constant.character.escape.lise",
                    "match": "\\\\."
                }
            ]
        }
    },
    "scopeName": "lise-file.lpp"
}

これが意味するところは、

  • if while for return が完全一致でキーワードに
  • " で囲まれた文字は文字列扱いに。その中で \ 直後の1文字はエスケープ文字

である。実際に試してみよう。F5 でデバッグ開始すると、新しいvscode のウィンドウが立ち上がる。右下の言語モードの選択から LISE(lise) を選べるようになる。

確かにハイライトが機能しているようだ。

ここまでは簡単だが、各自の言語の構文を一つ一つ実装していく必要がある。

LISE++ファイルの構文を実装してみたので、気になる人はGIthub のリポジトリを参考にしてほしい。

github.com

拡張機能として公開したい人はこのブログを参照されたし。

qiita.com

Python+matplotlib: ログスケールでの目盛り、サブ目盛りを設定する

十分な広さのfigsizeにグラフを書くと、軸はそれなりに表示される

import matplotlib.pyplot as plt

fig, axes = plt.subplots(ncols=2, nrows=2)
for ax in axes.flat:
    ax.plot([1,2], [0.00001,1])
    ax.set_yscale("log")
plt.tight_layout()
plt.show()

グラフに使える面積が小さくなると、目盛りやラベルを勝手に省略してしまうことがある。例えば、4x4のsubplotsの場合は目盛りがほとんど表示されなくなる。

import matplotlib.pyplot as plt

fig, axes = plt.subplots(ncols=4, nrows=4)
for ax in axes.flat:
    ax.plot([1,2], [0.00001,1])
    ax.set_yscale("log")
plt.tight_layout()
plt.show()

対処療法として、文字サイズを小さくするか、figsizeを大きくする方法があるものの、根本解決ではない。

1つ目の対応策は、set_xticks() set_yticks() で、目盛り=ticksを明示的に設定し、必要なticksを表示させる。

import matplotlib.pyplot as plt

fig, axes = plt.subplots(ncols=4, nrows=4)
for ax in axes.flat:
    ax.plot([1,2], [0.00001,1])
    ax.set_xticks([1.0,1.5,2.0])
    ax.set_yscale("log")
    ax.set_yticks([1e-5,1e-4,1e-3,1e-2,1e-1,1e-0])
plt.tight_layout()
plt.show()

2つ目の対応策は、locator を使う方法である。set_ticks では設定できない minor ticksの設定が可能になる。また、描画範囲が変わった時でもコードの修正を必要としない。

import matplotlib.pyplot as plt
from matplotlib.ticker import (MultipleLocator, LogLocator)

fig, axes = plt.subplots(ncols=4, nrows=4)
for ax in axes.flat:
    ax.plot([1,2], [0.00001,1])
    ax.set_yscale("log")
    ax.xaxis.set_major_locator(MultipleLocator(0.5)) #major ticksは0.5刻み
    ax.xaxis.set_minor_locator(MultipleLocator(0.1)) #minor ticksは0.1刻み

    ax.yaxis.set_major_locator(LogLocator(base=100)) #基数 100で描画
    ax.yaxis.set_minor_locator(LogLocator(base=100,subs=[10])) #基数 100、その 10倍 も描画
    ax.yaxis.set_minor_formatter("") #minor ticksのlabelは表示されるので非表示に

plt.tight_layout()
plt.show()