Hatena::ブログ(Diary)

The Voyage of a neuromancer

コンピュータや音楽の事書いてます

2018-08-03

Powerpoint VSTO スライド上のポイント座標と画面全体のピクセル座標の関係

Powerpointスライド上の図形やテキストなどの座標はポイントで表される。黒い余白部分は含まない。

マウスを使ったPowerpointアプリをつくる場合、マウスのカーソル位置は黒い余白部分を含む画面全体のピクセル座標で検知される為、スライド上のオブジェクトにマウスカーソルが当たっているかどうかの判断は非常に厄介なものになる。

VSTOのライブラリの中に、この座標変換や、余白部分の幅が分かる様な機能は見当たらない。

そこで、黒い余白部分の大きさを計算し、画像の位置とサイズをポイントではなく、ピクセル座標で求める方法を開発した。

左右に余白が出来る場合

f:id:neuromancer_sho:20180803164403j:image:w200:h112

上下に余白が出来る場合

f:id:neuromancer_sho:20180803164400j:image:w200:h150

//こういうオブジェクトがあったとして、
Presentation p;
Shape buttonNext; //画面上のボタンなどの図形/画像

//画面全体サイズのピクセル座標 黒い余白も含んでいる
int screenW = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width; 
int screenH = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;

//スライド部分のポイント座標 余白は含んでいない
float slideW = p.PageSetup.SlideWidth; 
float slideH = p.PageSetup.SlideHeight;

//ピクセルとポイントとの比率
float ratioX = screenW / slideW; 
float ratioY = screenH / slideH; 

//黒い空白が左右なのか、上下なのか判定し、余白部分を求める
float ratioScreen = (float)screenW / screenH;
float ratioSlide = slideW / slideH;
float ratio = ratioScreen > ratioSlide ? ratioY : ratioX; 
int marginX = (int)(screenW - slideW * ratio) / 2; //どちらかは0になる
int marginY = (int)(screenH - slideH * ratio) / 2; //

//画面全体ピクセル座標で見た場合のボタンの位置とサイズ
int bx = (int)(buttonNext.Left * ratio + marginX); 
int by = (int)(buttonNext.Top * ratio + marginY);  
int bw = (int)(buttonNext.Width * ratio);          
int bh = (int)(buttonNext.Height * ratio);         

2018-06-13 VBS(WSH)で管理者権限でdll登録

VBS(WSH)で管理者権限でdll登録

64bit,32bitの判断して管理者権限でregsvr32で登録。

UACの確認ダイアログがでる。

osbit = ws.Environment("Process").Item("PROCESSOR_ARCHITECTURE")
if 0 < instr(osbit, "64") then
	driverpath = "Driver\xxx\x64\yyy.dll"""
else
	driverpath = "Driver\xxx\x86\yyy.dll"""
end if
Shell.ShellExecute "regsvr32", """" & driverpath , "", "runas", 1

2018-01-17

DrawStringで変な縁取りが勝手についてしまうとき

頼んでもいないのに、黒くて汚い縁取りがつく。

TextRenderingHint を変更したら直った。


        private void Form1_Load(object sender, EventArgs e)
        {
            //描画先とするImageオブジェクトを作成する
            Bitmap canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            //ImageオブジェクトのGraphicsオブジェクトを作成する
            Graphics g = Graphics.FromImage(canvas);

            //フォントオブジェクトの作成
            Font fnt = new Font("MS UI Gothic", 20);
            //文字列を位置(0,0)、青色で表示
            g.DrawString("これはテストです。", fnt, Brushes.White, 0, 0);
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
            g.DrawString("これはテストです。", fnt, Brushes.White, 0, 40);

            //PictureBox1に表示する
            pictureBox1.Image = canvas;
        }

f:id:neuromancer_sho:20180117194929p:image

2017-09-26

msys2環境でyturlを使いたい

Windowsで動くLinux的なシェル

http://www.msys2.org/

youtube動画の本体ファイルURLを得られるツール

https://github.com/cdown/yturl

pacman -S svn

svn checkout https://github.com/cdown/yturl.git

pacman -S python3-pip

pip install -U yturl

2016-03-23

まとめ WindowsアプリからODBCでFileMaker Serverへアクセス

注意点まとめ

  • http://d.hatena.ne.jp/neuromancer_sho/20151201/1448964821
  • ここに設定されているのがfmpファイルを置く場所 f:id:neuromancer_sho:20160323124042p:image
  • (サーバに置く前に)拡張アクセス権に [ODBC/JDBC によるアクセス ] を追加しないと、「Unable to open file」になる それをすると、f:id:neuromancer_sho:20160323123547p:image この部分にフラグが立つ
  • FileMaker Serverの一般設定→「ODBC/JDBC」→「ODBC/JDBCを有効にする」 f:id:neuromancer_sho:20160323123926p:image

2016-03-14

script無しでネオンサイン風点滅CSS

カーソル合わせると変化します。

Neon Sign

<style>
#frame1 {
    background-color: black;
}

.neonsign {
  font-size: 80px;
  color: #550000;
  padding: 20px;
}

.neonsign:hover {
  color: #882222;
  text-shadow: 0 0 45px #ff5555;
  text-decoration: blink;
  animation: blink 0.5s step-end infinite;
  -webkit-animation: blink 0.5s step-end infinite;
}

@keyframes blink {
  90%  { opacity: 0.5; }
  35% { opacity: 0.5; }
}
@-webkit-keyframes blink {
  90%  { opacity: 0.5; }
  35% { opacity: 0.5; }
}

</style>

<div id="frame1">

<div class="neonsign">
Neon Sign
</div>

</div>

2016-03-02

.NET Framework を入れてあるのに、インターネット接続を要求される

一見、Microsoft .NET Frameworkのダウンロードをしようとしている様に見えるが、Language Pack が足りない場合に起こる事がある。

よく見ると、ダウンロード要求の文章の中に

MICROSOFT WINDOWS オペレーティング システム用 MICROSOFT .NET FRAMEWORK 4
MICROSOFT WINDOWS オペレーティング システム用MICROSOFT .NET FRAMEWORK 4 CLIENT PROFILE
および関連する LANGUAGE PACK

とかいてある。および〜の部分を読み落としやすい。

これに必要な追加パックは

Microsoft .NET Framework 4 Full 日本語 Language Pack (x86/x64) https://www.microsoft.com/ja-jp/download/details.aspx?id=3324&40ddd5bd-f9e7-49a6-3526-f86656931a02=True&navItemId=4c58c131-1e7a-44ec-f15b-77098df8bdc7

なので、これをUSBメモリなどに入れてもっていけば、製品リリース現場に到着してからインターネットが使えなくて慌てることがなくなる。

InstallShieldのsetup.exeの中に埋め込みたい場合

C:\Program Files (x86)\InstallShield\2013LE\SetupPrerequisites の中に存在していれば楽だが、ここにないのなら作る必要がある。

  1. どれか、似ていそうな.prqファイルをコピーして、名前をそれらしいものに変更する。
  2. file LocalFile= のところに先ほどの追加パックのexeのフルPath(ローカルPath)を書く
  3. execute file= のろころにも同じく書く。こっちはフルPathじゃなくファイル名だけでOK??
  4. dependency File= にはLanguage PackではなくMicrosoft .NET Framework 4 Fullの本体のprqファイルのPath(ローカルPath)を書く
  5. properties Id= には新しく生成したGUIDを書く。Visual Studioには、これを生成する機能がある。

2015-12-25

Form.Loadイベント内での例外の謎

Loadイベントから呼ばれる処理がうまくいっていない原因をVisual Studioで調査中のこと。

this.Load += new System.EventHandler(this.AAA_Load);
private void AAA_Load(object sender, EventArgs e)
{
  Top = Parent.Top + Parent.Height;

Top = 〜の行でParentがnullな為にSystem.NullReferenceExceptionが発生しているが、そこで_Load処理が中止され、エラーも無く、何もなかった様にアプリは動作し続けていた。普通ならVisual Studioのデバッグ動作が停止して、例外の知らせがあるはずだった。

そこで、Programクラスに

static void Main()
{
  Application.ThreadException += Application_ThreadException;
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
  throw new NotImplementedException();
}

これでApplication_ThreadExceptionが動作して、NotImplementedExceptionが発生するはずだ。

なのに、今度はAAA_Load(本来起こるハズの場所)でNullReferenceExceptionが発生した。

2015-12-18

FacebookのイベントをGoogleカレンダーにインポート

Facebookのイベントをいちいち手動でGoogleカレンダーに入力する手間がかなり低減出来るのでは??近日予定のイベントをまとめてコピー出来る。

Facebookのイベントページをどれでも良いから開いて、

f:id:neuromancer_sho:20151218185447p:image

「近日予定のイベントを全て〜」を右クリックしてリンクをコピーすると、webcal://というURLがコピーされるが、これをhttp://に変更して開く。そうすると、拡張子icsのファイルがダウンロードされる

f:id:neuromancer_sho:20151218185449p:image

Googleカレンダーのマイカレンダーのところの▼をクリックして、「設定」

f:id:neuromancer_sho:20151218185446p:image

「カレンダーをインポート」をクリックし

f:id:neuromancer_sho:20151218185445p:image

さっきのicsファイルを読み込ませる

f:id:neuromancer_sho:20151218185444p:image

Googleカレンダーの予定の詳細には、Facebookイベントへのリンクが!!

f:id:neuromancer_sho:20151218190437p:image

Facebookのメッセージを先頭まで辿る

https://www.facebook.com/messages

友達選んでから、chromeのDeveloper ToolsのConsoleに貼り付けてEnter。

var loop = 30; //丁度良い量に調整してね
var sArea = document.getElementsByClassName("uiScrollableArea contentBefore _5f0v")[0];
sArea = sArea.getElementsByClassName("uiScrollableAreaWrap")[0];
(function messageScrollUp(){
  sArea.scrollTop=0;
  if(loop) setTimeout(messageScrollUp, 800);
  var before = document.getElementsByClassName("_7hy")[0];
  if(before)before.click();
  loop--;
  console.debug("remaining: " + loop);  
})();

2015-12-08

smbclientの出力の謎

逆だよ!!!!w

夜間にcrontabでバックアップを走らせていたところ、どうも、smbclient コマンドの出力メッセージがおかしい。メッセージをファイルに出力してみたら、

smbclient //landisk/share -U neuromancer neuromancer -I landisk -c "recurse on; prompt off; cd 共有フォルダー/redminebackup/; mput alminium" 1>normal.txt 2>error.txt

normal.txtにはエラーメッセージが

Error opening local file alminium/vendor/bundler/ruby/2.0.0/gems/nokogiri-1.6.0/ports/archives/libxml2-2.8.0.tar.gz
Error opening local file alminium/vendor/bundler/ruby/2.0.0/gems/nokogiri-1.6.0/ports/archives/libxslt-1.1.26.tar.gz

error.txtには正常メッセージが

putting file alminium/app/helpers/roles_helper.rb as \alminium\app\helpers\roles_helper.rb (21.5 kb/s) (average 656.7 kb/s)
putting file alminium/app/helpers/boards_helper.rb as \alminium\app\helpers\boards_helper.rb (732.9 kb/s) (average 656.7 kb/s)
putting file alminium/Gemfile.lock as \alminium\Gemfile.lock (591.1 kb/s) (average 656.7 kb/s)

2015-12-01

FileMakerに対してODBCで接続する場合 インストール場所に注意

64bitのWindowsでは通常、c:\Program Files (x86)\FileMaker にインストールされるが、これだとODBC接続が出来なくなる。"Unable to open file"や、"Failed to connect to listener"エラーが発生する。

インストール場所をC:\FileMaker に変更したら、アクセス出来る様になった。32bit版ドライバ、64bit版ドライバ、共にOK。

f:id:neuromancer_sho:20151201191308p:image

f:id:neuromancer_sho:20151201191307p:image

c#での接続文字列指定

OdbcConnection conn = new OdbcConnection();
conn.ConnectionString = "DRIVER={FileMaker ODBC};HST=localhost;PRT=2399;UID=ユーザ名;PWD=パスワード;SDSN=DBのファイル名;";

ODBC Administrator 又は データソース(ODBC) と呼ばれているものの謎

以下2つは見た目が全く同じなのに、表示される内容が違う

%windir%\system32\odbcad32.exe ショートカット名「データ ソース (ODBC)」は64bit版のドライバが表示される

f:id:neuromancer_sho:20151201142440p:image:w200f:id:neuromancer_sho:20151201141802p:image:w250

C:\Windows\SysWOW64\odbcad32.exe ショートカット名「ODBC Administrator」は32bit版のドライバが表示される

f:id:neuromancer_sho:20151201142439p:image:w200f:id:neuromancer_sho:20151201141803p:image:w250

64bit版はExcelのウィザード*1に表示されない

f:id:neuromancer_sho:20151201144130p:image:w200

32bit版はExcelのウィザード*2に表示される

f:id:neuromancer_sho:20151201144530p:image:w200

通常構成でインストールされるMicrosoft Officeは32bitである為と思われる。

*1:外部データの取り込み→その他のデータソース→データ接続ウィザード→ODBC DSN

*2:外部データの取り込み→その他のデータソース→データ接続ウィザード→ODBC DSN

2015-11-16

Facebookの「いいね!」地獄からの開放

友達が多くなってくると、沢山の記事の中から重要な記事を探すのが難しくなってくる。時間が無いときには、なるべく優先度の高い記事を読みたい。そういう意味では、誰か経由の間接的な「いいね!」記事はスキップして読む事が良くあるだろう。

そんなときは、Chromeの右クリックで「要素を検証」の中の「Console」のところに以下を貼り付けて、Enterキー。と、消えるw

var comments = document.getElementsByClassName("_4ikz");
var delCount = 0, loop = 150; //丁度良い量に調整してね
(function exec(){
  window.scrollTo(0, document.documentElement.scrollHeight);
  for(var c in comments){
    var elm = comments[c];
    try {
      if(elm.innerText.indexOf("さんが「いいね!」しました。") > -1 ||
         elm.innerText.indexOf("について「いいね!」しました。") > -1 ||
         elm.innerHTML.indexOf("おすすめの投稿</span>") > -1 ||
         elm.innerText.indexOf("人が「いいね!」しました。") > -1 ||
         elm.innerText.indexOf("この投稿に「いいね!」しました。") > -1 ||
         elm.innerText.indexOf("さんがコメントしました。") > -1 ||
         elm.innerText.indexOf("さんがリアクションしました。") > -1 ){
        elm.remove();delCount++;}} catch(e){}}
  console.log("remaining: " + loop + " delCount: " + delCount);
  if(loop) setTimeout(exec, 850);
  loop--; })();

2015-10-19

2次元配列をLINQ可能に

なるべく少ない手数でダメなソースを改善したいとき、急激にやる気を削がれるのが2次元配列だと思う。

コンストラクタで参照をコピーするので、メモリを2倍消費する事はないはず。(未検証)

使用時

var qArray = 
    new Queryable2DimensionalArray<string>(昔の人が作った不便な2次元配列);
//2カラム目が"B"の行だけ列挙する
var result = qArray.Select((row) => row[2] == "B");

class定義

/// <summary>
/// 2次元配列をジャグ配列の様な扱いにして、LINQを使って、片方の次元を1つずつ取り出せる様にする
/// </summary>
/// <remarks>
/// 通常、2次元配列でforeachなどを使うと1次元的にアクセスしてしまうが、
/// これだと、ジャグ配列の様な取り出し方が出来る。
/// 2次元配列はLINQ出来ないが、出来るようになる。
/// </remarks>
/// <typeparam name="T"></typeparam>
class Queryable2DimensionalArray<T> : IEnumerable<T[]>
{
    T[,] data;
    int dim0 = 0;
    int dim1 = 1;

    public Queryable2DimensionalArray(T[,] d)
    {
        data = d;
    }
    /// <summary>
    /// reverseがtrueの場合、0次元と1次元が入れ替わる
    /// </summary>
    /// <param name="d"></param>
    /// <param name="reverse"></param>
    public Queryable2DimensionalArray(T[,] d, bool reverse)
    {
        data = d;
        if (reverse) { dim0 = 1; dim1 = 0; }
    }

    public IEnumerator<T[]> GetEnumerator()
    {
        for (int i = 0; i < data.GetUpperBound(dim0) + 1; i++)
        {
            T[] result = new T[data.GetUpperBound(dim1) + 1];
            for (int j = 0; j < data.GetUpperBound(dim1) + 1; j++)
            {
                result[j] = dim0 == 0 ? data[i, j] : data[j, i];
            }
            yield return result;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }

}

2015/11/05 ソース修正

2015-10-07

while read の謎

このCGIに単行の改行無しデータを送ると、件数が0件になる

#!/bin/bash

echo -e "Content-type: text/plain;charset=UTF-8\n\n"

i=0
while read line
    do
        echo "$line" 
        (( i++ ))
    done

echo "$i  成功"

これは良い。

$ printf "aaaaa\nbbbb\n" | ./readtest
Content-type: text/plain;charset=UTF-8


aaaaa
bbbb
2 件 成功

これも良い。

$ printf "aaaaa\n" | ./readtest
Content-type: text/plain;charset=UTF-8


aaaaa
1 件 成功

これは????

$ printf "aaaaa" | ./readtest
Content-type: text/plain;charset=UTF-8


0 件 成功
$ printf "aaaaa\nbbbb" | ./readtest
Content-type: text/plain;charset=UTF-8


aaaaa
1 件 成功

最終行に改行が無いとread文は読み込まない仕様だそうです。

2015-09-17

Microsoft.Office.Interop.PowerPoint ShapesとPlaceholdersの謎

Shapesをforeachすると、Shape型ではないオブジェクトも出てくる。調べてみると、Type==14なので、Placeholderだということが分かる。Shapesの中にあるのに、これはShapeにCastしようとすると例外がでる。ShapesをLINQしようとして、Cast<Shape>しても例外が出る。OfType<Shape>だと1つも拾えない。

おかしな事に、public interface Shapes : IEnumerableのメンバーの中に

Placeholders Placeholders { get; }
Shape this[object Index] { get; }

があるので、ShapesとPlaceholdersは親子関係にある様に見える。なのに、

public interface Placeholders : Collectionのメンバーの中に

Shape this[int Index] { get; }

Shape がある!!

そして、これをforeachすると、やはり、ShapeにCast出来ない!!

大ガッコでアクセス出来る型 = foreachで取り出せる型

というわけでは無いらしい。

2015-09-10

ExcelのRangeオブジェクトとstring[,]の相互一括代入

string[,]の大きさは

string[,] table = new string[Rowの数, Columnの数];

string[,]からRangeは素直に。

sheet.get_Range("a:b").Value = table;

Rangeからstring[,]の場合は、Rangeがdynamic型の為、as演算子?で変換する。

string[,] table = sheet.get_Range("a:b").Value as string[,];

2015-07-10

WindowsでUNIXの様にpopenを使えるのか?

popen ではなく _popen だとどこかに書いてあった。

しかし、

https://msdn.microsoft.com/ja-jp/library/96ayss4b.aspx

Windows プログラムで使用すると、_popen 関数は無効なファイル ポインターを返し、その結果、プログラムは無期限に応答を停止します。 _popen は、コンソール アプリケーションで正しく動作します。 入力と出力をリダイレクトする Windows アプリケーションを作成するには、Windows SDK の「リダイレクトされた入出力を持つ子プロセスの作成」を参照してください。

名前付きパイプは色々面倒臭そうなのでpopenにしたいのだが。。。。

2015-06-04

PowerPointのイベント実装年表

プログラム互換性の調査の際に必要だったので。

200020022003200720102013
SlideShowNextSlide
SlideShowNextClick
SlideShowOnNext
SlideShowOnPrevious
OnSlideShowPageChange
SlideSelectionChanged
SlideShowNextBuild
SlideShowBegin
SlideShowEnd

2015-05-14

WindowsUpdateの際に、無許可で再起動しないようにする

.regファイルを以下のように作成し、実行する。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU]
"NoAutoRebootWithLoggedOnUsers"=dword:00000001


2015-05-12

FacebookのMessageの小窓を長くする

長い会話履歴などを遡るとき、メッセージのページに行くより、小窓の方が他の作業をやりながら読めるので便利なので、これを長くする。

Chromeの「要素を検証」やFirefoxの「要素を調査」のコンソールに、以下を貼り付けてエンター。"700px"のところは、ディスプレイ解像度によって調整する。

{
    let boxes = document.getElementsByClassName("fbNubFlyoutInner"), b1, b2;
    for(b1 in boxes){
        b1 = boxes[b1].children;
        for(b2 in b1){
            b2 = b1[b2];
            try {
                if(b2.id.indexOf("js_") > -1){
                    console.log(b2.id);
                    b2.style.height = "700px";
                }
            } catch(e) {}
        }
    }
}

f:id:neuromancer_sho:20150512124936p:image

2015-05-07

Ascend Mate7 (MT7-J1)のBootloader Unlock

ここを見ると

http://mate7.net/ascend-mate7-bootloader-unlock/

unlockコードの入手ページは

http://en.club.vmall.com/emotiondownload.php?mod=unlock&action=pre

model listの中からY300-0000を選べ、と書いてあるが、日本向けのMate7は"MT7-J1"なので、このページでは機種選択が出来ない。

こっち http://emui.huawei.com/plugin.php?id=unlock&mod=detail に行って、ユーザ登録をすれば、出来る。使用許諾っぽい表示がでたら、「我已阅读以上条款并接受所有内容」のチェックを入れて、その下のボタンを押せばOK。登録の時、英語表示にするには、右上の「语言」から選ぶ。 こっち http://emui.huawei.com/en/plugin.php?id=unlock&mod=detail は最初から英語で表示されるが、成功未確認。 (ひろしさんから成功のご報告 2015/09/08 02:44)

f:id:neuromancer_sho:20150507121351j:image

Product IDはジェネレータなど使わずに、「How do I obtain the Product ID?」と書いてあるところを見れば、ダイアル番号が書いてあるので、それを電話番号として打ち込めば良い。その際、SIMカードが挿さってないと多分無理。

2015-04-13

64bit Windowsでのアプリ一覧取得

64bitアプリの一覧はレジストリ

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

内の情報を抽出すれば取得出来るが、32bitアプリに関しては

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\

に格納されている。

2015-03-05

1つのPCから、1つのサーバ上のネットワークフォルダに別ユーザでログインしたい

\\computer01 というサーバがあったとする。

\\computer01\aaaフォルダに、aaaというユーザ名でログインすると、

再起動するまで、\\computer01\bbbフォルダに、bbbというユーザ名でログインする事は出来ない。aaaで開いたファイルやフォルダを閉じてもダメ。

これでは、aaaの権限でやりたい作業と、bbbの権限でやりたい作業を同時にしたり、交互にする事が出来ない。Linuxなどでは当たり前に出来る事が出来ないのだ!

次のやり方で解決する事が出来た。(納得はいかないが)

C:\Windows\System32\drivers\etc\hostsというテキストファイルがある。これはLinuxなどで言う、/etc/hostsと同じ意味のファイルである。ここに、

#123.123.123.123はcomputer01のIPアドレス
123.123.123.123 computer01same

こうすると、computer01とcomputer01sameは同じマシンを指す事になるが、Windows君は違うマシンだと勘違いを起こす。この状態で、

\\computer01\aaaフォルダに、aaaというユーザ名でログインしながら、

\\computer01same\bbbフォルダに、bbbというユーザ名でログインする事が出来る。

2015-02-24

2015-02-13

LinuxからWindowsネットワークのホスト名を名前解決するには

/etc/nsswitch.confのhostsにwinsを追加

hosts: files wins dns

/etc/samba/smb.conf の[global]のところに

wins support = yes

sambaをリスタート

/etc/init.d/smb restart

2014-11-21

Google Spreadsheetで「You do not have permission to call 〜」

これを使って

CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
holidays = calendar.getEvents(startDate, endDate);

をonEditから起動し、日本の祝日を取得しようと思ったら、"You do not have permission to call getCalendarById"という例外が発生した。

理由は https://developers.google.com/apps-script/guides/sheets/functions に書いてあった。

If your custom function throws the error message You do not have permission to call X service., the service requires user authorization and thus cannot be used in a custom function.

To use a service other than those listed above, create a custom menu that runs an Apps Script function instead of writing a custom function. A function that is triggered from a menu will ask the user for authorization if necessary and can consequently use all Apps Script services.

onEditやonOpenからの起動では許可されず、custom menuからの呼び出しじゃないと許可されないらしい。。。。もっと目立つところに書いてくれよ。。。。

https://developers.google.com/apps-script/guides/menus

2014-11-20

Google SpreadsheetでonEditの引数eventはコード補完されない件

コード内で型を推論出来ないので、IDEのコード補完機能が効かないのだと思われる。効かせる為には、型が何であるかを、IDEに分からせれば良い。

var sheet = SpreadsheetApp.getActiveSheet();

function onEdit(e){
  var r = sheet.getRange(e.range.getRow(), e.range.getColumn()); //rのcode completionを効かせる為

これなら、

  • sheetはSheet型である
  • rはSheetをgetRangeしたのだから、Range型である

と推論してくれる。

2014-08-01

Xamarin でJavaライブラリを使う際のエラー:「アクセシビリティに一貫性がありません。 '(クラス名)' のアクセシビリティは (フィールド名やメソッド名) よりも低く設定されています。 」

Xamarinとは、C#Androidアプリを開発出来るという画期的な開発環境。

で、Javaで作られたライブラリをXamarinのC#から使うには、Java Bindings Libraryという project templateを使って、ラッパーdllを作る必要がある。Java Bindings LibraryテンプレートによってC#のソースが生成される。

その際、良く発生すると思われるエラーが「アクセシビリティに一貫性がありません」というやつだが、これの解決についてはっきりと日本語で解説されているページが無いのでメモ。

ここ http://www.buildinsider.net/mobile/insidexamarin/10 に

なぜビルドエラーが多発するのかというと、ひとえにJavaとC#の設計の違いにある。継承1つとっても、Javaではnon-publicなクラスからpublicなクラスを派生させられる。C#ではできない。

と、書いてあるので、エラーの出ているクラスをpublicに変更してやれば良い事が分かる。そして、ここ の"Resolving API Differences"という文章の中に、 Some classes are less accessible than their sub-classes という項目があって「アクセシビリティが低く設定されています」エラーと同じ事を言っているので、その後に書いてある方法でpublicに変更出来そうだ。Java Bindings Libraryテンプレートによって生成されてた".cs"ソース群の中から、エラーの出たクラス名を検索して、定義を良く見てみると、問題のクラスの定義のところに自動生成された、

// Metadata.xml XPath class reference: path="/api/package[@name='名前空間名']/class[@name='クラス名']"

Metadata.xmlにはこういうpathを書くんだよ、とコメントがあったので、さっきのサイトに載っていた、「じゃ、そのclassをpublic扱いにしてよ」という意味の

<attr path="/api/package[@name='名前空間名']/class[@name='クラス名']" name="visibility">public</attr>

をMetadata.xmlの中に書いたら、ビルドエラーが消え、dllが出来た。

2014-06-30

メモ イベントログを見やすく

イベントIDのところで、右クリック、グループ化

f:id:neuromancer_sho:20140630193249p:image

グループを折りたたむ

f:id:neuromancer_sho:20140630193250p:image

探しやすく整理された。

f:id:neuromancer_sho:20140630193251p:image

OS開始時刻を見たければ、イベントID 12を開く

f:id:neuromancer_sho:20140630194222p:image

2014-06-13

ファイル名やディレクトリ名が文字化けしてるけどアクセスしたい

何個目なのか確認

$ ls
??????  aaaa  bbb

配列に入れて、0番目であることを確認

$ a=($(ls))
$ echo -e ${a[0]}

$ echo -e ${a[1]}
aaaa

0番目にアクセス

$ rm -r ${a[0]}

#や、

$ vi ${a[0]}

#など