カテゴリーアーカイブ OS

村上 著者:村上

【備忘録】Firebase Cloud Messagingでのプッシュ通知の送信について

実は似たような記事を以前にも投稿しましたが、今回はメッセージを送付する際のHTTP構文についてです。
というのも、送信メッセージやタイトルを変えるだけならまだしも、パラメータを変更したり、追加・削除するときに毎回調べていたので、いい加減自分のためにまとめようと思ったからです。

そのため、この記事は私的重要ポイントのみをまとめてあります。
ご了承ください。

ちなみに、以前の記事はこちら。

【PHP】FireBase Cloud Messagingを利用したプッシュ通知をPHPから送る方法 – 株式会社シーポイントラボ|浜松のシステム開発会社
https://cpoint-lab.co.jp/article/201810/【php】fireBase-cloud-messagingを利用したプッシュ通知をphpから送る/

 

さて、まず Firebase の公式サイトのHTTP プロトコルについてのページがこちら。

Firebase Cloud Messaging の HTTP プロトコル|Firebase
https://firebase.google.com/docs/cloud-messaging/http-server-ref?authuser=0

このページですら毎回検索して探すので、こうしてまとめたかったというのが主ですね。

次に、各項目について。
送信先を指定するパラメータ to について、その具体的な指定値です。

指定値 対象
/topics/all 全端末に送信
/topics/android Android端末にのみ送信
/topics/ios iOS端末にのみ送信
/topics/[トピック名] 特定のトピックに登録されている端末にのみ送信
[デバイストークン] 特定の端末

こちらに関しては、特に説明不要かと思います。
送信先を指定したい場合、こちらの to の値を変更しますが、例が載っていなかったので、よく使いそうなもののみを抜粋しました。

次は dry_run というパラメータです。
こちらは未指定の場合のデフォルトは false になっています。
このパラメータを true にすると、実際にプッシュ通知を送らずに、レスポンス結果を取得することができます。
送信のテスト時に使うパラメータですね。

あとは、badge という、ホーム画面のアイコンにバッヂを追加するためのパラメータです。
こちらにバッヂの値を指定すると、プッシュ通知を受信した時にバッヂが追加されます。
なお、0 を指定すると、バッヂは削除されます。

よく使うのはこのあたりでしょうか。
他にも、Androidのみの設定で icon というパラメータでプッシュ用のアイコン画像を指定できます。
これがないと、アイコンが白い四角形になってしまい非常に味気ないので、Android アプリに通知を送る際は指定したほうが良さそうです。

 

以上、FCM でメッセージを送付する際のHTTP構文についてでした。
なお、レスポンスデータについては、上で挙げた Firebase の公式サイトのHTTP プロトコルについてのページの下の方に載っているので、こちらも参考にしてください。

  • この記事いいね! (0)
takahashi 著者:takahashi

Windowsのインターネット接続が頻繁にリセットされる時に確認したいこと

今朝PCを立ち上げたところ、Google Chromeで”接続が中断されました”というエラーが頻発し、どのページも正常に表示できない状態になってしまってい、またSlackなどの他のアプリでも接続が不安定になる症状が発生しました。

いろいろ調べたところ、原因が判明しました。

スタートメニュー(Windowsロゴ)を右クリック->ネットワーク接続->アダプターのオプションを変更する
からネットワークアダプタの一覧を確認したところ、Microsoft Wi-Fi Direct Virtual Adapterが現れたり消えたりを繰り返していました。

Microsoft Wi-Fi Direct Virtual Adapterとは、ノートPCなどに搭載されている無線LANモジュールを仮想的に分割することで、ノートPCを無線LANのホストとして使うことができるようにする仕組みが有効になっている際に現れる仮想アダプタのようです。

公式ドキュメントが探し出せなかったので、挙動からみた独自の解釈になってしまいますが、このMicrosoft Wi-Fi Direct Virtual Adapterが有効になっていることで、接続中のWi-Fiアクセスポイントから切断することなくMiracastやWi-Fi Directが利用できるようになっているようです。

また、Windows10に搭載されている”ホットスポット”機能(所謂逆テザリング)を有効にした時も、このMicrosoft Wi-Fi Direct Virtual Adapterの働きによって、他のWi-Fiデバイスから無線LANアクセスポイントとして認識されるようになります。

このMicrosoft Wi-Fi Direct Virtual Adapterですが、何らかの原因で動作がおかしくなってしまい、現れたり消えたりを繰り返したり、メトリック(複数ネットワークカードがある際のネットワークカードごとの優先度)の優先度が高く設定されてしまい、他のネットワークのトラフィックを奪ってしまうことでネットにつながらなくなってしまう、ということがしばしば起こります。

今回も症状的にそれが疑われたので、対策をしてみました。

まず、スタートメニュー(Windowsマーク)をクリックし、中から”デバイスマネージャー”を選択します(※要管理者権限)
開いた画面の中のメニューの

表示->非表示のデバイスの表示

をクリックし、接続されていないデバイスも含めた全デバイスを表示します。

次に、”ネットワークアダプター”の左にある “>”マークをクリックして項目を開きます。

その中にある

“Microsoft Wi-Fi Direct Virtual Adaptor #数字”
となっているものを右クリックし

”デバイスのアンインストール”をクリックします。

ウインドウが表示されるので”アンインストール”をクリックします。

この手順を”Microsoft Wi-Fi Direct Virtual Adaptor”がすべてなくなるまで行います。

※最悪の場合OSの再インストールが必要になる場合のものもありますので、今回の操作では”Microsoft Wi-Fi Direct Virtual Adaptor #数字” 以外のアダプターは絶対に削除しないように注意してください。

削除が完了したらOSを再起動します。

再起動後、再度
スタートメニュー(Windowsロゴ)を右クリック->ネットワーク接続->アダプターのオプションを変更する
を開き

画像の
“Microsoft Wi-Fi Direct Virtual Adaptor” が追加されていれば成功です。

自分の環境ではこの操作で冒頭の症状は解消しました。

お困りの際は是非参考にして頂ければ幸いです。

なお、一応システム周りの変更になりますので、操作には十分注意して自己責任でお試しください。

  • この記事いいね! (0)
takahashi 著者:takahashi

androidのあらゆる操作を自動化してくれるアプリ”macrodroid”

今回も、使わなくなったAndroidタブレットをナビ化する際に役に立ったアプリをご紹介したいと思います。

Macrodroidというアプリです。
デバイスが取得できるありとあらゆるきっかけをトリガーにして、様々な挙動を自動で行わせることができます。

起動すると画面のような表示が出てくるので”マクロの追加”をタップします。

最初に、何らかの動作をさせる際のきっかけとなる動作を指定します。

例えば、”充電器に接続した時”とか、”画面のロックを解除したとき”などなどです。

これらの指定の一部は以前ご紹介したSmartConnectでもできましたが、Macrodroidの特徴はそれをはるかに上回る種類のトリガーを仕掛けることができる点です。

きっかけとなる動作を選択すると、今度はその動作をしたとき、どのようなアクションを端末にさせるかを選ぶ画面が出てきます。

こちらもトリガーと同様にかなりたくさんの種類から選ぶことができます。
電源のON/OFFなど、中にはroot化しないと使えないメニューもありますが、root化していなくても大半のものは選ぶことができます。

かなり細かい設定ができますので、いろんなところで威力を発揮しそうです。

例えば、こんな使い方もできます。

指定された回数スマホロックの解除に失敗したら…

 

写真を撮らせる、という指定もできます。
盗難防止対策にもなりそうですね。

Androidをナビ化する際にはシガーライターから電源供給が途絶えたときに自動でディスプレイをOFFにさせたり、BluetoothやWi-FIを停止させたりなどで使っています。

無料版はタスクを5つまでしか登録できませんが、それでも十分の威力です。

気になった方は是非端末にインストールして試してみてはいかがでしょうか。

  • この記事いいね! (0)
村上 著者:村上

【アプリ】テキストエディタ「Sublime Text」の改行コードの確認と変更方法

仕事では、「Sublime Text」というテキストエディタを愛用しているのですが、改行コードの確認方法と、デフォルトの CR+LF から LF に変更する方法が分からなかったので備忘録としてまとめます。

今回参考にさせていただいた記事はこちら。

【Sublime Text】 デフォルトで使用する改行コードを指定する – Qiita
https://qiita.com/rico/items/15f423a4ea261766b774

 

まず、変更方法ですが、メニューバーの Preferences(基本設定)から Settings – Default(基本設定 – 標準)を開きます。
そうすると、この中に default_line_ending という記述があるはずなので、こちらを探します。
見つかったら、ここの値を system から unix に変更するだけ!
あとはファイルを保存したら、以上で改行コードの変更は完了です。
なお私の環境では、こちらの記述は Settings – Default に記載してあったのですが、参考記事では Settings – User に書かれているようです。
このあたりは、お使いの環境によって適宜変更してください。

次に、改行コードの確認方法ですが、上の方法で基本設定を確認する方法以外に、アプリ下部のステータスバーに常に改行コードを表示させる方法があります。
もしくは、メニューバーの表示 > 改行コードでも確認もできます。
こちらが一番お手軽ですね。
さて、ステータスバーへの表示方法は、Preferences > Settings – User を開き、このファイル内に "show_line_endings": true を追加(もしくは変更)するだけです。
こちらを保存すると、ステータスバーに変更が反映され、改行コードが常に表示されるようになります。
表示形式は windows(CRLF) / unix(LF) / Mac OS 9(CR)のように、OS の名前で表示されます。
LF の場合は、unix と表示されます。

 

以上、Sublime Text で改行コードの確認及び変更方法でした。
こういう設定系って、私の場合はかなりの高確率で忘却するので、むしろ私のための覚え書きの記事でした。
もし、同じことを知りたい人のご参考になれば幸いです。

  • この記事いいね! (0)
村上 著者:村上

【Android】カスタムデザインのListViewを表示する

Android の ListView は、昔作成したことがあるのですが、いかんせん昔過ぎてほとんど忘れていたので備忘録もかねてまとめ。
ちなみに、すでに用意されているレイアウトを使うのではなく、リストアイテムのレイアウトからカスタムする方法です。

今回参考にさせていただいたサイトはこちら。

Androidでリストビュー(ListView)をカスタムして表示する – Qiita
https://qiita.com/ksugawara61/items/2d63f0be279a94b74550

 

早速実装!
まず、作成するファイルの一覧は下記のとおりです。
・MainActivity.java
・activity_main.xml
・list_item.xml
・ListItem.java
・ListAdapter.java

MainActivity.java に追加するコードは下記のとおり。

ListItem item = new ListItem();
// item にデータ追加処理を行う

ListView listView = findViewById([ListViewのID]);
ListAdapter adapter = new ListAdapter(this, R.layout.list_item, item);
listView.setAdapter(adapter);
listView.setOnItemClickListener((adapterView, view, position, l) -> {
    // ListViewのアイテムクリック時の処理
});

activity_main.xml ファイルには、ListView を追加します。

<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/[ListViewのID]" />

ListItem.java には、ListView で使う値を扱えるクラスを定義します。

public class ListItem {
    private String entry_title;
    private String adate;
    private String url;

    public EntryListItem() {};

    public EntryListItem(String e_entry_title, String e_adate, String e_url) {
        entry_title = e_entry_title;
        adate = e_adate;
        url = e_url;
    }

    public void setEntryTitle(String title) {
        entry_title = title;
    }

    public void setAdate(String e_adate) {
        adate = e_adate;
    }

    public void setUrl(String e_url) {
        url = e_url;
    }

    public String getEntryTitle() {
        return entry_title;
    }

    public String getAdate() {
        return adate;
    }

    public String getUrl() {
        return url;
    }
}

ブログ記事を扱うことを想定しているので、それらの値が格納されるようになっています。
値の格納と取得を行うための関数も定義しています。

ListAdapter.java は、ArrayAdapter を継承していて、上の ListItem.java クラスを利用するためのクラスです。

public class ListAdapter extends ArrayAdapter<ListItem> {

    private int mResource;
    private List<ListItem> mItems;
    private LayoutInflater mInflater;

    public EntryListAdapter(Context context, int resource, List<ListItem> items) {
        super(context, resource, items);

        mResource = resource;
        mItems = items;
        mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;

        if (convertView != null) {
            view = convertView;
        }
        else {
            view = mInflater.inflate(mResource, null);
        }

        // リストビューに表示する要素を取得
        ListItem item = mItems.get(position);

        // タイトル、投稿日時を設定
        TextView title = view.findViewById(R.id.title);
        title.setText(item.getEntryTitle());
        TextView adate = view.findViewById(R.id.adate);
        adate.setText(item.getAdate());

        return view;
    }
}

ListView にセットする Adapter がこのクラスです。

 

以上のコードとファイルを作成すると、カスタマイズされた ListView を実装することができます。
覚え書きのため、かなり簡単なまとめになっているので、もっと詳しく知りたい方は、最初に紹介した参考サイトを読んでください。

  • この記事いいね! (0)
takahashi 著者:takahashi

WinSCPを使うと、多段接続のSSHサーバーでも直接SFTP接続ができる!

先日、とあるきっかけでymさんに教えていただいたWinSCPというアプリを使用してみたのですが、想像していたよりもかなり多機能で便利だったのでご紹介したいと思います。

WinSCP

WinSCPって名前からしてSSH経由の通信しかできないものだと思ってたのですが、ちゃんとFTPなどの通信もできたんですね。

WinSCPの一番の特徴は踏み台サーバー経由のSSH接続が可能な点。

SFTPやSCPをサポートしているクライアントはそこそこありますが、踏み台経由でのアクセス機能はなかなか実装しているものはありません。
とくにフリーの…となると、探した限りではWinSCP以外は見つかりませんでした。

他にも自動同機能を供えていたりなど、他の機能もかなり充実していてとても便利です。

唯一の欠点はWindoes盤のみという点。
自分はmacOSもよく使ってますし、macOS向けのクライアントに、WinSCPほどの機能を持ったクライアントがないので、せめてmacOS版だけでも出てほしいですね…w

  • この記事いいね! (0)
村上 著者:村上

【Android】アプリ画面のスクリーンショットを禁止する方法

当初は最近使用している家計簿アプリのご紹介を使用と思っていたのですが、アプリがスクリーンショットを撮影できない設定になっていることが判明しました。
そのため、急遽予定を変更しまして、今回はアプリのスクリーンショット操作を禁止する方法についてご紹介!
というか、あまりスクリーンショット自体を撮らないし、アプリにも組み込んだことがなかったので、そもそもそんな機能があったことを知りませんでした…。

ちなみに、その撮影禁止のアプリでスクリーンショットを撮影しようとしたところ、下記の画像のようなメッセージが通知エリアに表示されました。

初めてみましたが、こんなことができたんですね!

 

今回参考にさせていただいたサイトはこちらから。

[Android]アプリでスクリーンショットを無効にする|DevelopersIO
https://dev.classmethod.jp/smartphone/android/prevent-screenshot/

実装方法は案外シンプルで、Activity の場合は、下記のコードを追加します。

Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_SECURE);

Fragment で実装したい場合は、下記のように記述するとのこと。

WindowManager mWindowManager; 
FrameLayout mOverlapView;
WindowManager.LayoutParams mParams;
 
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mParams = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_SECURE,
            PixelFormat.TRANSLUCENT);
    mWindowManager = (WindowManager)getActivity().
        getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    mOverlapView = new FrameLayout(getActivity());
    mWindowManager.addView(mOverlapView, mParams);
}
@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    if (hidden) {
        mWindowManager.removeView(mOverlapView);
    } else {
        mWindowManager.addView(mOverlapView, mParams);
    }
}

なお、実際に無効化を操作しているのは、8行目からの mParams の記述になります。
そして、その操作を反映するために、onHiddenChanged() でその変更反映の処理を行っています。

Activity もしくは Fragment でのスクリーンショット禁止の記述は以上です。

 

以上、Androidアプリでスクリーンショット操作を禁止にする方法でした。
もし開発中のアプリでスクリーンショットを制御したい場合は、是非参考にしてください。

  • この記事いいね! (0)
村上 著者:村上

【Cordova】外部サイトをアプリ内ブラウザで表示する方法

実際に試してはいないのですが、今後実装すると思われるので、その備忘録としてまとめ。

見つけた記事はこちらです。

PhoneGap/Cordovaでの外部サイトリンク 内部表示/アプリ内ブラウザ/標準のブラウザ – Qiita
https://qiita.com/tsunet111/items/272f3e052c332ddf9b9d

 

実装方法ですが、Cordova の初期テンプレートに最初から追加済みのプラグイン「cordova-plugin-whitelist」を使います。
まず、config.xml にアプリ内で表示したいアドレスを追加します。
記述例は下記のとおりです。

<allow-navigation href="https://cpoint-lab.co.jp/*" />

上の例では、このサイト全体の表示を許可しています。

<a href="https://cpoint-lab.co.jp/">株式会社シーポイントラボ</a>

あとは、aタグでリンクを設置します。
作業としては以上です。
こちらを実行すると、ホワイトリストに追加したアドレスであれば、内部ブラウザで表示されます。
なお、それ以外のアドレスにアクセスした場合は、端末のデフォルトブラウザが起動しますので、ご注意ください。

 

以上、Cordovaアプリのアプリ内ブラウザで外部サイトを表示する方法でした。
もし、上記の方法でうまくいかない場合は、「cordova plugin add cordova-inappbrowser」を使う方法もあるとのこと。
ホワイトリストが働かない場合は、こちらのプラグインもお試しください。

  • この記事いいね! (0)
takahashi 著者:takahashi

CentOS 7 でepelリポジトリのnpmでアップデートを行うとnpmが消されてしまう問題の回避方法

CentOS 7 の新環境を作り、epelリポジトリからyumでnpmをインストール。

sudo yum -y install epel-release
sudo yum -y install npm

npmのバージョンを確認すると
3.10.10
と古かったため

sudo npm -g update npm

としたところ

- fstream-npm@1.2.0 node_modules/npm/node_modules/fstream-npm
- normalize-git-url@3.0.2 node_modules/npm/node_modules/normalize-git-url
- realize-package-specifier@3.0.3 node_modules/npm/node_modules/realize-package-specifier
/usr/lib
└── (empty)

npm ERR! Linux 3.10.0-862.el7.x86_64
npm ERR! argv "/usr/bin/node" "/bin/npm" "-g" "update" "npm"
npm ERR! node v6.14.3
npm ERR! npm  v3.10.10
npm ERR! path /usr/lib/node_modules/npm/node_modules/fs-write-stream-atomic
npm ERR! code EEXIST
npm ERR! errno -17
npm ERR! syscall mkdir

npm ERR! EEXIST: file already exists, mkdir '/usr/lib/node_modules/npm/node_modules/fs-write-stream-atomic'
npm ERR! File exists: /usr/lib/node_modules/npm/node_modules/fs-write-stream-atomic
npm ERR! Move it away, and try again.

npm ERR! Please include the following file with any support request:
npm ERR!     /home/username/npm-debug.log
npm ERR! code 1

のようなエラーが出てしまい、更新に失敗します。
そればかりか…

$ npm -v
-bash: npm: コマンドが見つかりません

$ which npm
/usr/bin/which: no npm in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/username/.local/bin:/home/username/bin)

なんとnpm本体が消えてしまいました。
そんな馬鹿な…

流石にちょっと困ってしまったので、いろいろ調べたところ、npm公式のGitHubページのIssueでも同様の報告が上がっていました。

Try to update the npm cli and got an error #15821 – GitHub

内容を見ていくと、epelではなくnodejs公式のnodesourceというリポジトリを使用したら成功したという記述が。
半信半疑ながらも、nodesourceを使うことにしました。

とりあえず、一旦npmをアンインストールします。

sudo yum -y remove npm
$ sudo yum -y remove npm
読み込んだプラグイン:fastestmirror
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ npm.x86_64 1:3.10.10-1.6.14.3.1.el7 を 削除
--> 依存性の処理をしています: npm = 1:3.10.10-1.6.14.3.1.el7 のパッケージ: 1:nodejs-6.14.3-1.el7.x86_64
--> 依存性の処理をしています: npm = 1:3.10.10-1.6.14.3.1.el7 のパッケージ: 1:nodejs-6.14.3-1.el7.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ nodejs.x86_64 1:6.14.3-1.el7 を 削除
--> 依存性解決を終了しました。

依存性を解決しました

========================================================================================================================
 Package                 アーキテクチャー        バージョン                                リポジトリー            容量
========================================================================================================================
削除中:
 npm                     x86_64                  1:3.10.10-1.6.14.3.1.el7                  @epel                  9.8 M
依存性関連での削除をします:
 nodejs                  x86_64                  1:6.14.3-1.el7                            @epel                   16 M

トランザクションの要約
========================================================================================================================
削除  1 パッケージ (+1 個の依存関係のパッケージ)

インストール容量: 26 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  削除中                  : 1:npm-3.10.10-1.6.14.3.1.el7.x86_64                                                     1/2
警告: ファイル /usr/lib/node_modules/npm/scripts/update-authors.sh: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/scripts/relocate.sh: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/scripts/release.sh: 削除に失敗しました: そのようなファイルやディレクトリはあり ません
警告: ファイル /usr/lib/node_modules/npm/scripts/publish-tag.js: 削除に失敗しました: そのようなファイルやディレクトリは ありません
警告: ファイル /usr/lib/node_modules/npm/scripts/maketest: 削除に失敗しました: そのようなファイルやディレクトリはありま せん
警告: ファイル /usr/lib/node_modules/npm/scripts/install.sh: 削除に失敗しました: そのようなファイルやディレクトリはあり ません
警告: ファイル /usr/lib/node_modules/npm/scripts/index-build.js: 削除に失敗しました: そのようなファイルやディレクトリは ありません
警告: ファイル /usr/lib/node_modules/npm/scripts/gen-changelog: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/scripts/doc-build.sh: 削除に失敗しました: そのようなファイルやディレクトリはあ りません
警告: ファイル /usr/lib/node_modules/npm/scripts/dev-dep-update: 削除に失敗しました: そのようなファイルやディレクトリは ありません
警告: ファイル /usr/lib/node_modules/npm/scripts/dep-update: 削除に失敗しました: そのようなファイルやディレクトリはあり ません
警告: ファイル /usr/lib/node_modules/npm/scripts/clean-old.sh: 削除に失敗しました: そのようなファイルやディレクトリはあ りません
警告: ファイル /usr/lib/node_modules/npm/scripts/changelog.js: 削除に失敗しました: そのようなファイルやディレクトリはあ りません
警告: ファイル /usr/lib/node_modules/npm/scripts: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/package.json: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules/realize-package-specifier: 削除に失敗しました: そのようなファイル やディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules/normalize-git-url: 削除に失敗しました: そのようなファイルやディレ クトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules/fstream-npm: 削除に失敗しました: そのようなファイルやディレクトリ はありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/write-file-atomic/package.json: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/write-file-atomic/index.js: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/write-file-atomic/README.md: 削除に失敗しました: そのよう なファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/write-file-atomic/LICENSE: 削除に失敗しました: そのような ファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/write-file-atomic: 削除に失敗しました: そのようなファイル やディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/wrappy/wrappy.js: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/wrappy/package.json: 削除に失敗しました: そのようなファイ ルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/wrappy/README.md: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/wrappy/LICENSE: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/wrappy: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/which.js: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/package.json: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/node_modules/isexe/windows.js: 削除に失敗しました:  そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/node_modules/isexe/package.json: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/node_modules/isexe/mode.js: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/node_modules/isexe/index.js: 削除に失敗しました: そ のようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/node_modules/isexe/access.js: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/node_modules/isexe/README.md: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/node_modules/isexe/LICENSE: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/node_modules/isexe/.npmignore: 削除に失敗しました:  そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/node_modules/isexe: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/node_modules: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/bin/which: 削除に失敗しました: そのようなファイルや ディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/bin: 削除に失敗しました: そのようなファイルやディレ クトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/README.md: 削除に失敗しました: そのようなファイルや ディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/LICENSE: 削除に失敗しました: そのようなファイルやデ ィレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which/CHANGELOG.md: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/which: 削除に失敗しました: そのようなファイルやディレクト リはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/validate-npm-package-name/package.json: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/validate-npm-package-name/node_modules/builtins/package.json: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/validate-npm-package-name/node_modules/builtins/builtins.json: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/validate-npm-package-name/node_modules/builtins/Readme.md: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/validate-npm-package-name/node_modules/builtins/History.md: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/validate-npm-package-name/node_modules/builtins/.travis.yml: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/validate-npm-package-name/node_modules/builtins: 削除に失 敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/validate-npm-package-name/node_modules: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/validate-npm-package-name/index.js: 削除に失敗しました: そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/validate-npm-package-name/README.md: 削除に失敗しました:  そのようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/validate-npm-package-name/LICENSE: 削除に失敗しました: そ のようなファイルやディレクトリはありません
警告: ファイル /usr/lib/node_modules/npm/node_modules.bundled/validate-npm-package-name/.npmignore: 削除に失敗しました: そのようなファイルやディレクトリはありません
(省略)

大量の”ファイルが見つかりません”エラーが。
やっぱり本当に消えてしまってるようです…

アンインストールが完了したらnodesourceリポジトリをインストールします。

curl -sL https://rpm.nodesource.com/setup_8.x | sudo bash -

処理が完了したら、”npm”ではなく”nodejs”パッケージをインストールします。

sudo yum install -y nodejs

パッケージ名はnodejsですが、実際には同時にnpmもインストールされているため、インストールが完了すればnpmも使えます。

$ npm -v
6.4.1

バージョンも新しくなっています。

$ sudo npm -g update npm
$ which npm
/usr/bin/npm

アップデートも問題なく動作するようになったようです。

しかし、安定性の高いはずのepelリポジトリのnpmが致命的なバグを抱えたままになっているというのは…大丈夫なんでしょうか…

  • この記事いいね! (0)
村上 著者:村上

【Android】XMLデータから特定のタグの値を取得する方法

もしかしたらもっとスマートなやり方があるのかもしれませんが…問題なく動作しますので、XMLの扱いでお悩みの方は是非。
XMLデータから、特定のタグの値を取得する方法です。
なお、参考にしたサイトをうっかり失念してしまったので、今回はリンクはありません。

 

では早速、コードはこちら。

private void getXmlData(String xml) throws XmlPullParserException, IOException {
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    XmlPullParser parser = factory.newPullParser();
    parser.setInput(new StringReader(xml));
    int eventType = parser.getEventType();

    String data;
    List<String> arrData = new ArrayList<>();

    while (eventType != XmlPullParser.END_DOCUMENT) {
        if (eventType == XmlPullParser.START_TAG) {
            switch (parser.getName()) {
                // データを取得したいタグが一つ
                case "[データを取得したいタグ名]":
                    parser.next();
                    data = parser.getText();
                    break;
                // データを取得したいタグが複数
                case "[データを取得したいタグ名]":
                    parser.next();
                    arrData.add(parser.getText());
                    break;
            }
        }
        eventType = parser.next();
    }
}

こんな感じです。
関数にしているので、そのままコピー&ペーストしてもらえば動作するかと思います。
なお、渡すXMLでデータは 文字列 に変換しています。

重要そうな部分だけを説明すると、10行目から XMLデータを while で、タグやデータなど 1つずつ見ていって、それが開始タグで、かつそれがデータを取得したいタグだった場合はそのタグの値を取得しています。
また、14行目からの case句は、タグが一つしかない場合のデータの取得方法で、対して 19行目からの case句は、タグが複数あった場合のデータの取得方法です。
といっても、データを格納する変数が StringList かの違いしかないのですけどね。

これでデータの取得ができますので、あとはこのデータを行いたい処理などに使ってください。

 

以上、XMLデータから特定のタグのデータを取得する方法でした。
やり方を変えれば、全タグのデータも取得できるかと思いますので、是非ご活用ください。

  • この記事いいね! (0)