Facebook広告もつくってみました。

前回、トライした際には、たぶん、クレジットカードで

高い買い物をした直後で限度額ぎりぎりだったため、支払い方法のところで

なかなか登録できなかったから断念していたと思う。

クレジットの買い物残高がおそらく5万以下程度の今日ためしてみたら、

普通に支払い登録できました。

大変なんじゃないかなぁって思ってたけど

表示するだけなら思ったより簡単だった。

 

ただ、私が詳しく理解していなかったのが原因だが、

課金はテスト用の少額だったからよかったけど、ちゃんとプレビューをするという基本的なことを初回にもかかわらずやっていなかったため。

数日後にプレビューをみたら、想定と違った感じで表示されていた。

ちゃんと公開前に当然にプレビューしよう、あと、ポイントは正しいURLからスタートすることかな。(下記)

 

 

facebookデベロッパーのアプリの広告のリンクからだと、facebookアプリをつくって、それの広告だから

以前、facebookアプリも作らなければいけないと勘違いしてしまったが、そういうわけではない。

 

 

 

Youtube広告は一回出稿しようとして、審査もとおったようであったが、たぶん自分のどこかのミスで表示されなかったのがあったが(そのうち表示されるかなぁと思いつつ、ほっといても表示されなかった、コンバージョンとかその他の設定不足かも)、

それは、一時停止にして、新しいやつを出稿してみた。

これも性的とは一切関係ない動画だったのに、一部が性的ポリシーに違反となったが、再審査請求リンクで再審査を請求したら

出稿された。

単なる推測で違ってるかもだけど、後から冷静に見て自分の予想だと、「欲しい時に」というキーワードかもなぁ、文脈によっては性的になりえるけど、性的とは全然関係ない文脈でつかっているので、再審査でOKになったのではという感じかもしれません。

以前は、理由も不明だし、粘りもせずに失敗して、今回も再審査だったから、YOUTUBE広告課金されていっただけで、ほんの少し感動。

 

多少高くなっても短期間のテストと動画作成の頑張りを無駄にしないためにも、抑え目のテスト用金額2000円の範囲内であれば、

絶対に表示させたいという意思から、広告視聴単価は200円に設定、「スキップ可能なインストリーム」で実施した結果は下記のとおり

本日中に消費稼働で費用的には2000円中1771円消費した時点で

上限広告視聴単価(私が設定):200円

平均広告視聴単価:5円

タイプ:スキップ可能なインストリーム

表示回数:1858

視聴回数:359

視聴率:19.32%

費用:1711円

コンバージョン率:0% (App内課金をコンバージョンにしたから、すぐに反映されるはずがないので、これでOK、ただ、設定したの他の広告だったかも)

 

他にもアプリ用広告も初めてだしてみたが、こっちもどうなるか、テストしてみて、利益がでそうなら、本格的に広告という感じにしたいが、利益でそうな感じになるかなぁ

こっちはまだ、学習中とかになってて一回も表示されていないが、学習中ってなんなんだろう?

 

 

迷惑メールかどうかを判断するひとつにURLがありますが、

HTMLメールの場合

https://xxx.xx/aaa

と書いてあっても、実際のリンクは違う場合もあるし、HTMLメールかどうかチェックするのも

メーラーによっては判別しにくいのもあるので、要注意だな。

aタグの中身がURLの時、ドメインが一致しなければ、迷惑メールという判断基準を採用してほしい

<a href="https://ngng.com/aaa">https://xxx.com/aaa</a>

 

こんなとこでつぶやいても、伝わるわけないとは思いつつ

 

 

昔から位置が変わった気がする

Finder>アプリケーション>ユーティリティ>VoiceOverユーティリティ

有効にした後

読み上げたい文字列をマウスで反転させた後、

右クリック>スピーチ>読み上げを開始

 

 

テキストデータの書式といえば、JSONが流行っていると思う。

CSV、XMLもあり、一時テキスト通信データの書式としてXMLが流行っていた時期もあったが、現在は大体JSONになっている。

JSONは言語に依存しないデーター形式がいいらしい。

JSONもいいけど個人的には単純なXMLの方がわかりやすく、扱いやすいから好きだ。

といっても、既存のXMLだと、扱いずらい、いろいろなオプションや拡張や決りが多くて

正式なXMLとして読み取るとなると、書式エラーでNGとなったり、いろいろできることはいいと思うが

かえってわかりずらくなってしまっている。

単純に<xxx>内容</xxx>で囲まれているという規則で、同じ名称の項目の場合上書きされるというだけの

単純XMLで他の規則は無視するとテキストデータとしては

JSONより個人的には優れている気がするし、大体の言語で数十行で対応できるようなテキストデーター書式になるのではと思われる。

データによっては欠点もあるが、それは、他の方式でもあるし、コード変更で対応もできる。

■PHPの場合の例

function fnc_xmlget($xml,$colnm){
    return fnc_tagcut($xml,'<'.$colnm.'>','</'.$colnm.'>');
}
function fnc_xmlset($xml,$colnm,$setvalue){
    if ($colnm=='')return '';
    $xml=str_replace('</data>','',$xml);
    $xml=trim($xml);
    if (strpos('_'.$xml,'<data>')!=1)$xml='<data>'."\n";
    $ck=fnc_xmlget($xml,$colnm);
    $xml=str_replace('<'.$colnm.'>'.$ck.'</'.$colnm.'>','',$xml);
    $setvalue=($setvalue);
    if ($setvalue!=''){
        $xml=trim($xml);
        $setvalue=str_replace('<','<',$setvalue);
        $setvalue=str_replace('>','>',$setvalue);
        $xml.="\n<".$colnm.'>'.$setvalue."</".$colnm.'>';
    }
    $xml.="\n</data>";
    return $xml;
}
function fnc_tagcut($moto,$startstr,$endstr){
    $ret='';
    $eind=0;
    $sind=strpos('_'.$moto,$startstr);
    if ($sind>0){
        $moto2=substr($moto,$sind+strlen($startstr));
        $eind=strpos('_'.$moto2,$endstr);
    }
    if ($sind>0 && $eind>0){
        $ret=substr($moto,($sind-1),($eind+strlen($startstr)));
        $ret=substr($ret,strlen($startstr));
    }else{
        $ret='';
    }
    return $ret;
}

■Javascriptの場合の例

function fnc_xmlset(xml,colnm,setvalue){
    if (colnm==''){ return ''; }
    xml=fnc_okikae(xml,'</data>','');
    xml=fnc_trim(xml);
    if (('_'+xml).indexOf('<data>')!=1)xml='<data>';
    var ck=fnc_getxmldata(colnm,xml);
    xml=fnc_okikae(xml,'<'+colnm+'>'+ck+'</'+colnm+'>','');
    setvalue=fnc_trim(setvalue);
    if (setvalue!=''){
        xml=fnc_trim(xml);
        xml+="<"+colnm+'>'+setvalue+"</"+colnm+'>';
    }
    xml+='</data>';
    return xml;
}
function fnc_getxmldata(nm,xml){
    var startstr='<'+nm+'>';
    var endstr='</'+nm+'>';
    var ret='';
    var eind=0;
    var sind=xml.indexOf(startstr);
    if (sind>0){
        var xml2=xml.substring(sind+startstr.length);
        var eind=xml2.indexOf(endstr);
    }
    if (sind>0 && eind>0){
        ret=xml2.substring(0,eind);
    }
    return ret;
}

function fnc_okikae(str,mae,ato){    
    for(i=0;i<1000;i++){
        str=str.replace(mae, ato);
        if (str.indexOf(mae)<0){
            i=1001;
        }
    }
    return str;
}

■javaの場合(読み取りのみだが、書き込みも上のような感じですぐつくれるはず)

    public String fnc_xmlget(String xml,String colname){
        return fnc_tagcut(xml,"<"+colname+">","</"+colname+">");
    }
    public String fnc_tagcut(String strMoto,String strStart,String strEnd){
        String ret="";
        int intEnd=0;
        int intStart = (strMoto.indexOf(strStart)+1);
        String strTmp = "";
        if (intStart > 0 && strStart.length()>0 && strEnd.length()>0){
            strTmp = this.fnc_substr(strMoto,(intStart + strStart.length()));
            intEnd = (strTmp.indexOf(strEnd))+1;
        }
        if (intStart > 0 && intEnd > 0){
            ret=fnc_substr(strMoto,(intStart - 1),(intEnd + strStart.length()));
            ret=fnc_substr(ret,strStart.length());
        }
        return ret;
    }

 

■swift(読み取りのみだが、書き込みも上のような感じですぐつくれるはず)

    func fnc_xmlget(xml: String,colname: String) -> String {
        return fnc_tagcut(strMoto: xml, strStart: "<" + colname + ">", strEnd: "</" + colname + ">")
    }
    func fnc_tagcut(strMoto: String,strStart: String,strEnd: String) -> String {
        var ret = "" as String
        var intEnd = 0 as Int
        let intStart = (fnc_indexOf(strMoto: strMoto, strKwd: strStart) + 1) as Int
        var strTmp = "" as String
        if (intStart > 0 && strStart.count > 0 && strEnd.count > 0){
            strTmp = fnc_substr(strMoto: strMoto, intStart: (intStart + strStart.count), intLen: 0)
            intEnd = (fnc_indexOf(strMoto: strTmp, strKwd: strEnd) + 1)
        }
        if (intStart > 0 && intEnd > 0){
            ret = fnc_substr(strMoto: strMoto, intStart: (intStart - 1), intLen: (intEnd + strStart.count))
            ret = fnc_substr(strMoto: ret, intStart: strStart.count, intLen: 0)
        }
        return ret
    }