月別アーカイブ 8月 2019

takahashi 著者:takahashi

Microsoftが正式にLinuxのexFAT対応を支援

HDDやSSDなどのストレージ上でファイルの管理の仕方を定義する”ファイルシステム”の一つとして、exFATと呼ばれるものがあります。

このexFATは昔Windows上でよく使われていたFAT32というファイルシステムを拡張したものです。

FAT32にはほかのモダンなファイルシステムと比較して、いろいろと難点がありました。

  • 4GBまでのファイルしか保存できない
  • 実質2TiB(厳密な1024進数上での2TBのこと)までのパーティションしか扱えない
  • 圧縮、暗号化機能なし
  • ジャーナリング機能なし

ジャーナリング機能がないためファイルシステムが破損しやすく、また、保存できるファイルの大きさにも制限がありました。

ただ、FAT32はほかのファイルシステムの中でも、Windows以外の多くのOSで実用的なレベルでサポートされている数少ないファイルシステムでもあります。
(NTFSも一応MacOSやLinuxでも使えますが、これらのOSで標準で使われるNTFS-3Gドライバは、実はNTFSを完全にサポートしておらず、Windowsで使用しているときと比較してリスクがあるらしいです。)

そんな中、MicrosoftはFAT32の改良版として、exFATというファイルシステムをリリースしています。

このexFATでは、モダンなファイルシステムにあってFAT32にはなかった性能や機能が盛り込まれています。

  • ファイルあたりの容量制限は16EiBに増加(現状のハードウェアでは1ファイル16EiBのファイルは事実上作成できないため実質無制限)。
  • 16 EiBまでのパーティションを扱える
  • ジャーナリング機能を搭載⇒FAT32と比較してデータが壊れにくい。
  • FAT32と比較して読み書きが高速

上記のように、FAT32と比較して、最新のマシンでも問題なく使えるレベルまでには進化しました。

ただ、FAT32と比較した唯一の欠点が、Linuxでのサポートがいまいちだった点です。

例えば、Linux上で視覚的にパーティションの編集やディスクのフォーマットができる gparted ではNTFSは何とか操作できますが、exFATは作成することすらで着ない状況でした。

そんなexFATですが、先日Microsoftから、Linux上でexFATをちゃんと扱えるようにするための実装の支援を公式に行うことが発表されました。

Microsoft、Linuxカーネルで公式に「exFAT」サポート – ITMedia News

うまくいけば、Linuxカーネル上でも標準でexFATがサポートされ、どのOSでも扱うことができる安全なファイルシステムとして利用できる状態になるかもしれません。

USBメモリなど、最近はOSを問わずファイルを移動したい場合も非常に多くなっているので、こういった対応はとてもありがたいですね。

公式サポートのリリースが楽しみです。

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

【Cordova】使ってみたいモバイルアプリ向けUIフレームワーク「Onsen UI」

現在開発中の新アプリのUIを導入することにしたのですが、その際に使ってみたいフレームワークをメモ。
Onsen UI という UI フレームワークです。
アプリのような見た目を簡単に実装でき、React でも使うことができます。
公式の説明でも「Cordovaを用いたハイブリッドアプリ開発に最適です」とあったので、使ってみたかったんですよね。

公式サイトはこちらから。

Onsen UI 2: HTML5モバイルアプリを速く、美しく – Onsen UI
https://ja.onsen.io/

 

CDN を使う場合は、下記の3行を HTML の head 内に追加すればOKとのこと。

<link rel="stylesheet" href="https://unpkg.com/onsenui/css/onsenui.css">
<link rel="stylesheet" href="https://unpkg.com/onsenui/css/onsen-css-components.min.css">
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20src%3D%22https%3A%2F%2Funpkg.com%2Fonsenui%2Fjs%2Fonsenui.min.js%22%3E%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />

が、私の開発環境では React を利用しているので、それに対応した導入方法を使います。
導入についての説明ページは下記にあります

React – Onsen UI
https://ja.onsen.io/v2/guide/react/

まず、下記の npm コマンドを実行します

npm install onsenui react-onsenui

コマンドを実行し終えたら、あとはこの UI を使いたいページで下記のようにインポートすれば使うことができます。

import {Page, Toolbar, Button} from 'react-onsenui';

なお、サンプルコードは下記の通りです。

import React, { Component } from 'react';
import {List, ListItem, Button} from 'react-onsenui';

class ListPage extends Component {
  render() {
    return(
      <List dataSource={['Row 1', 'Row 2']} renderHeader={this.renderHeader} renderRow={(row, idx) => (
          <ListItem modifier={idx === this.state.data.length - 1 ? 'longdivider' : null}>
            {row}
            <Button modifier="quiet" onClick={this.remove.bind(this, idx)}>Remove</Button>
          </ListItem>
         )}
         renderFooter={this.renderFooter}
      />
    );
  }
}
module.exports = ListPage;

上記コードはコンポートページの List UI のコードを参考にしました。
まだ導入したばかりで見よう見まねなのですが、何となくどこで何をやっているのかはわかりそうです。

とりあえず、メニューバーとリスト表示は必要したいので、この2つをまず実装してみたいと思います。

 

以上、Cordova アプリで使ってみたい UI フレームワーク「Onsen UI」のご紹介でした。
今後も、何か発見や備忘録としてまとめたい事項があれば、投稿していきたいと思います。

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

【gradle】CardViewをgradleに定義していないとビルド直前でクラッシュする

Caused by: android.view.InflateException: Binary XML file line #10: Error inflating class android.support.v7.widget.CardView

というエラーに遭遇。以下logcatで出てきたエラーの内容

 

Caused by: java.lang.ClassNotFoundException: Didn’t find class “android.support.v7.widget.CardView” on path: DexPathList[[zip file “/system/framework/org.apache.http.legacy.boot.jar”, zip file “/data/app/your.applicationid.here.beta-s4nTgtJxcLhYh6AuEzrF6w==/base.apk”],nativeLibraryDirectories=[/data/app/your.applicationid.here.beta-s4nTgtJxcLhYh6AuEzrF6w==/lib/arm64, /system/lib64, /system/vendor/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.view.LayoutInflater.createView(LayoutInflater.java:606)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)

 

cardViewなんて使ったことないぞと思ったら冒頭のページで記事のトップページを

切り分けて表示しているのを見てあぁこれか!と思い納得。

そういえばずっとloadingでぐるぐる回っていたけどこれだったのか・・・・。

なにかの拍子でcardviewを導入するためのプラグインが抜けていたのが原因でした。

解決方法は、buildgradle(module:app)の中にdependencies群があるので

その中に下記のように追加します。

<pre>implementation 'com.android.support:cardview-v7:28.0.0'</pre>

入れるときにバージョンが28でないと警告を受けるので必ず最新のものに変えてから

gradleに入れましょうと。

スタックオーバーフローさん、ありがとうございます。

http://Error inflating class android.support.v7.widget.CardView

 

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

【PhpStorm】PHP新規プロジェクトのパッケージ群が豪華

 プロジェクトはフレームワークを選定してインストに従って素地を配置。フレームワークに沿った上で自由にコーディングとするだけでできます。これでも勿論いいのですが、世の中にはフレームワークと個別の成果物の合間にあるようなプロトタイプのパッケージも多くあります。PhPStormは下図の赤丸の様にフレームワークのみならず、そういったプロトタイプもカバーしています。

 何をしているかというとcomposer create-project hoge/fugaで生成されるプロジェクトの一覧を用意し、適宜composer create-projectしています。
 PHPには自らを呼び出すためにHTTPサーバを用意することができます。Laravelをはじめとしていくつかのフレームワークはこの機能をリッチにラッピングしています。
PHP: ビルトインウェブサーバー – Manual
 この組み込みサーバと合わせることで、すぐにそれらしいものを扱えます。Laravelならばenv編集, npm install, artisan migrate, artisan seed, npm run devでフロントエンド、バックエンドが大体完成です。
 このある程度何かが作られたプロジェクトパッケージの中にはDB等のリソースさえ用意すれば、もうそれだけで製作者が望んだ完成品になるようなものもあります。使い方次第でアプリのダウンロードの様にも扱えます。

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

【Cordova】「cordova-plugin-device」プラグインでプラットフォームを取得できない

最近になって遭遇した Cordova アプリのエラーについて。
プラットフォームごとに処理を変えたい箇所があったので、下記の「cordova-plugin-device」を使って、Android か iOS なのかを判断していました。

GitHub – apache/cordova-plugin-device: Apache Cordova Plugin device
https://github.com/apache/cordova-plugin-device

 

が、低頻度ではありますが、時折エラーが発生。
下記のコードを使って、プラットフォームの文字列を取得していたのですが、platform が未定義だと言われることがありました。

var platform = window.device.platform;

プラグイン自体はインストール済みですし、発生頻度もよく分からず…。
ただ、なんとなくブラウザで起動した時には発生することが多かったように思います。

 

で、対処法ですが、原因が分からなかったため、とりあえず対症療法で何とかすることにしました。

if (typeof window.device !== "undefined") {
    const platform = window.device.platform;
    switch (platform) {
        case "Android":
            // Android の時に実行する処理
            break;
        case "iOS":
            // iOS の時に実行する処理
            break;
    }
} else {
    // プラットフォームが所得できなかった時の処理
}

確認したところ、window.device が未定義な場合に今回のエラーが発生していたため、1行目でそれを確認しています。
何故未定義になるのかはまだ分かってはいませんが、理由は判明したため上記のように対処しました。
時間を見つけて、原因の調査も行いたいと思います。

 

以上、Cordova のプラグイン「cordova-plugin-device」で時折エラーが発生する時の対処法でした。
対症療法で、根本的な解決にまでは至れておりませんが、もし同じことでお悩みの方の参考になれば幸いです。

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

Redisの用途

最近ふと興味がわいて、NoSQLのことを調べてたりします。

NoSQL(Not only SQL)とはMySQLやPostgreSQLのような従来のRDBとは異なるデータの持ち方の概念(データモデル)でデータを管理するデータベースシステムのことです。

なぜわざわざRDBとは違うシステムが必要になるのかというと、RDBだけではうまく対応できないような場面や、RDBでない方が都合がよいケースが存在するためです。

例えば、有名なMastodonはNoSQLの一つであるRedisをプロセス間のデータ共有に使用していますが、これをもしRDBで置き換えたなら、おそらくリアルタイムに次々とデータが投稿されるMastodonでは追い付かなくなるでしょう。

Redisならインメモリにデータが保持されているので、このあたりの処理がRDBと比較して高速化できます。(ただし、NoSQLにはデータの整合性や、RDBのような複雑な条件での検索などが弱いため、この部分は逆にRDBで補うことになります。)

そんなRedisですが、具体的にどんな場合で利用すると効果的なのか、ちょっと調べてみました。

・複雑なデータを保持するキャッシュストレージとして使う

例えばWebsocketを使ったシステムをNode.jsとApache+PHPの組み合わせで構築した場合、Node.jsとApache(PHP)は別の環境で動作しているため、そのままではデータの共有ができません。

そこで、同じデータを参照できるようにするために、データの橋渡し役が必要になります。

RDBやファイルといった選択肢もありますが、ここにRedisを使うことで、高速かつある程度複雑な構造のデータも簡単に扱うことができるようです。

・キャッシュしたデータを(半)永久的に保持したい

RedisはMemcachedとよく比較されますが、Memcachedは再起動すれば値が消失してしまうのに対し、RedisはファイルとしてDBのデータを保持しておく仕組みもあるため、設定をしておけばRedisサービスやサーバーの再起動を行ってもデータを保持しておくことができます。

・Pub/Subを使った仕組みを実装したい。

メッセージのやり取りをする仕組みのモデルとして”Pub/Sub”というものがあるのですが、Redisではこのモデルにのっとった仕組みを標準で提供してくれるようです。

Pub/Subモデルを使用したシステムを作りたい場合は、最適な選択肢になるかもしれません。

このように、システムによっては従来にない便利な仕組みを提供してくれるRedisですが、注意しなければならないのはRedisが”インメモリDB”であるという点です。

メモリ(RAM)上ででデータの保持を行う仕組みのため、メモリの容量の限界を超えたデータの保存は行うことができません。(記事によってはRAM全容量の約半分以上は保存できない、という話も記載されています。)

そのため、万が一容量がいっぱいになってしまった場合は、書き込み失敗とするか、古いデータを削除する以外に方法がありません。

データを永続させられるとは言え、Redisに置いておく必要のなくなったデータは積極的に削除するか、完全に永続化が可能なRDBやファイルなどに移しておくなどの工夫が必要となりそうです。

実際のところ、RedisはRDBを置き換えるのではなく、DBとアプリケーションの間に+αで追加することで、より高速な動作を可能にする使い方に最も効果がありそうです。

調べていてかなり興味がわいてきたので、是非一度Redisを使ったシステムも作ってみたいですね。

参考記事:
RedisとElastiCacheを分かりやすくまとめてみた – Qiita

Redisのメモリ検証 – Qiita

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

【Laravel】バージョンごとの変更点をリファレンスリポジトリ中のファイル差分から見つける

 Laravelは週単位でとても細かくリリースされていますが、それとは別に5.7, 5.8, 6.0などと中くらいの単位、大きな単位でも更新されています。そういった大きな更新の際には、それまでにあった小さな多数の更新の内の注目すべき変更点をリファレンスに載せます。LaravelはリファレンスもGitHubで管理されており、これを扱うことでバージョンごとの違いを容易に比べることができます。
 laravel/docs
 特に有効なのはバージョンを示すブランチ間の比較でしょう。例えば、最新の5.8と9/2にリリースの決まった6.0のブランチの差分が次のリンクから読めます。プルダウンで任意のブランチを選ぶこともできます。
 Comparing 5.8…6.0 · laravel/docs
 これのFiles Changedから見ていって、例えば次のようにあります。

 6.0ではLaravelデフォルトの認証機能プロトタイプをプロジェクト内に設置するコマンドはphp artisan make:authからphp artisan ui vue –authに代わり、composerパッケージのlaravel/uiを入れておく必要もあるとわかります。同様に順々にファイル差分を読んでいくことで大きな変更点を見つけられます。
 ちなみにlaravel/uiはVue.jsで作るLaravelデフォルトの画面を扱うためのリポジトリの様です。
laravel/ui

  • この記事いいね! (1)
asaba 著者:asaba

【androidjava】scrollviewを初めて使ってみた

androidのアプリを作っているとどうしても要素が多くなってきて縦長になってしまう

時があります。

今使っているrelativeLayoutはデフォルトではスクロール機能がついておらず、今回のお題の

scrollviewというコンポーネントを付けないとスクロールしてくれないみたいです。

さてscrollviewの使い方ですが、単純明快超シンプルでスクロールしたいレイアウトを

<scrollview></scrollview>で囲むだけ。

 

</pre>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#C0C0C0"

<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/scrollView">

<RelativeLayout
android:id="@+id/relativeLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints">

//ここにレイアウトを入れていく

</RelativeLayout>

</ScrollView>

</android.support.constraint.ConstraintLayout>
<pre>

未だレイアウトに手を焼いている自分でもさくっと使えたのでlinearlayoutや

relativelayoutでレイアウトを構築している方にはおすすめです。

 

最後に自分はレイアウト作成はxmlで書いているのですが、ConstraintLayoutで普通に制約バリバリつけて自由に

レイアウト作っている人を見ると本当に尊敬します。柔軟なレイアウトが作れる

魔法使いになれるよう力を付けたいと思います・・・。

 

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

Gmail の smart_label_root_name ラベルの削除

最近気がついたのですが、Gmail のラベルで “smart_label_root_name” というラベルが有ることに気が付きました。

このラベル、どうやっても削除出来ないのです。

・・・・

色々情報を探したところ見つかりました。

Gmailのラベル「smart_label_root_name」の削除
「簡易HTML表示」に切り替えた上で「ラベル管理」から削除する。

何じゃそりゃ。

以下 URL が、簡易HTML 表示用の URL です。

https://mail.google.com/mail/u/0/h/

 

無事削除できました。

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

【android】エラー:Error:No such property: GradleVersion for class: JetGradlePluginについて

Error:No such property: GradleVersion for class: JetGradlePluginというエラーに遭遇。

こちらは現在のgradleバージョンに対してandroidStudioのバージョンが低くgradleのプラグインが使えない

ことで起きたエラーです。解決方法は、最新のandroidStudioをダウンロードして終了という

至ってシンプルな感じです。

まず、help->check Updataをクリックすると以下のダイアログが出てきます。

 

 

last checkedがアップデート可能なandroidStudioのバージョン、Current versionが

現在使っているandroidStudioのバージョンになります。

ここではそのままOKを押します。特にこだわりがなければデフォルトのままアップデート

を進めてしまっても構いません。

終了ダイアログを押すとandroid Studioが自動で再起動するので外観が変わったか

どうか確認してみてください。

一緒にError:No such property: GradleVersion for class: JetGradlePluginが消えていることが

確認できれば成功です。

これで他のエラーが出ていないことが確認できれば従来通りandroidStudioを使うことができます。

今まで自分はアップデートするとエラー増えそうだとか要らないファイルがダウンロード

されて煩わしそうだとか勝手に悪いイメージを抱いていたのですがまあ以外に優しかったです。

同じエラーで悩んでいる人は試してみてください~。

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