Translate

BTemplates.com

Powered by Blogger.

2019年5月3日金曜日

2019-02-27、03-01、05-03 到達点メモ


前に作ったプロジェクトを起動してSyncしたところ以下のエラーが出た。

Error:No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android

幾つか参考にしたサイトだと、NDKをダウンロードして
足りないファイルを入れよう。という話が出ていたのだが
その肝心のmips64el-linux-androidが無かった。

参考サイト:Android Studio 3.2 でビルドエラー「No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android」が出た時の対処方法
参考サイト:Error:No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android


下記のサイトによると、どうもバージョンが上がるとmips64自体が対応されなくなったようである。恐らくなくなってしまった可能性が高い。

参考サイト:"No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android" のコメントより

で、対策に関しては、gradleのバージョンを
 classpath 'com.android.tools.build:gradle:3.3.1'
に上げた後にGradle自体?のバージョンを4.10.1?に上げたところ
エラーが出なくなった。

で、なおしてたらなんか見覚えのあるエラーを見つけた。
Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.3.11

案の定、以前の日記に同じ現象があった

という訳で前回と同じように以下のように修正した
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"


久しぶりにAdMobを動かしたら、落ちたんだが???
一部のみを抜粋するが、こんなエラー文だった。

02-27 22:12:43.031 28083-28083/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.nononagainfo.www.admobtest, PID: 28083
    java.lang.RuntimeException: Unable to get provider com.google.android.gms.ads.MobileAdsInitProvider: java.lang.IllegalStateException: 
    
    ******************************************************************************
    * The Google Mobile Ads SDK was initialized incorrectly. AdMob publishers    *
    * should follow the instructions here: https://goo.gl/fQ2neu to add a valid  *
    * App ID inside the AndroidManifest. Google Ad Manager publishers should     *
    * follow instructions here: https://goo.gl/h17b6x.                           *
    ******************************************************************************
    
    
        at android.app.ActivityThread.installProvider(ActivityThread.java:5921)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:5510)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5449)
        at android.app.ActivityThread.-wrap3(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1587)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6184)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
     Caused by: java.lang.IllegalStateException: 
    
    ******************************************************************************
    * The Google Mobile Ads SDK was initialized incorrectly. AdMob publishers    *
    * should follow the instructions here: https://goo.gl/fQ2neu to add a valid  *
    * App ID inside the AndroidManifest. Google Ad Manager publishers should     *
    * follow instructions here: https://goo.gl/h17b6x.                           *
    ******************************************************************************
    
    
        at com.google.android.gms.internal.ads.zzze.attachInfo(Unknown Source)
        at com.google.android.gms.ads.MobileAdsInitProvider.attachInfo(Unknown Source)
        at android.app.ActivityThread.installProvider(ActivityThread.java:5918)
        ... 10 more

で、対策を簡単に述べると
AndroidManifest.xmlに以下のようにAdMobのIDを追加する必要があるようである。
<manifest>
    <application>
        <!-- Sample AdMob App ID: ca-app-pub-3940256099942544~3347511713 -->
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="[ADMOB_APP_ID]"/>
    </application>
</manifest>

更に言うと、 Google Mobile Ads SDK バージョン 17.0.0 でこの対策をしないと
クラッシュするようである

参考サイト:スタートガイド - AndroidManifest.xml を更新する


ruby

evalは文字列をコードとして実行することができる
例:
puts eval "1+2"


javascript

puppeteerで特定のサイトを開いたらチェックボックスにチェックを入れるといった事をしたかった。
なので、以下のように書いた

const puppeteer = require ('puppeteer');
(async () => {
  const browser = await puppeteer.launch ({
    headless: false,
    defaultViewport: {
      width: 1366,
      height: 728,
    },
  });
  const page = await browser.newPage ();
  var linkAdders = 'https://www.nononagainfo.com/';
  await page.goto (linkAdders, {waitUntil: 'domcontentloaded'});
  await page.click ('#test_test_testID');
  await page.waitFor (100);

  const page2 = await browser.newPage ();
  var linkAdders2 = 'https://play.google.com/store/apps/details?id=com.aaa.nononaga.voicetimerr';
  await page2.goto (linkAdders2, {waitUntil: 'domcontentloaded'});
  await page2.waitFor (100);

  const page3 = await browser.newPage ();
  var linkAdders3 ='https://www.nononagainfo.com/p/blog-page_1.html';
  await page3.goto (linkAdders3, {waitUntil: 'domcontentloaded'});
  await page3.waitFor (100);
}) ();

・ヘッドレスモードとは、CUIのみで処理を行う事。
つまり、普通にGUIとして使いたい(ブラウザを表示したい)場合は、launchメソッドで
headless: falseを入れてあげればよい。
・デフォルトだと表示画面が小さいのでlaunchメソッドでdefaultViewport: {}の値を指定する必要がある
・executablePathで、起動するデフォルトchromeをしているすることができるが
その際の注意として、/(バックスラッシュ)は、一つではなく二つ指定する必要がある。
例:'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe'
・チェックボックスに関しては、clickメソッドに対象のIDを指定すればチェックボックスにチェックが入る。
・複数のタブを作りたい場合は、browser.newPage ();を新しく作ればよい

参考サイト:Puppeteer で Headless Chromeを操ってE2Eテストする(予定) - 入力・操作編
参考サイト:Puppeteerでスクレイピング

ただ、一つ問題があってキャッシュを保持したかったのだが
(元々の目的から考えるに当たり前なのだが)保持することは出来なかった。

なんか、操作できる良いやつってなんかあったっけ・・・?


気が付いたら、二ヶ月もたってたわ・・・。

RubyのStringのdeleteの仕様について

以下のコードを書くとどういう結果になると思いますか?

puts "chochoc".delete("ch")

理想
ooc

現実
oo

deleteはどうも一文字ずつを削除する仕様の様で
二文字だけを消したい場合はこの書き方ではできない
どう実装するかというとgsubを使う

puts "chochoc".gsub(/ch/,"")

以上。