月別アーカイブ 9月 2019

takahashi 著者:takahashi

LinuxでCPUやマザーボードから温度を取得する方法

Linuxでは標準で(マシンのマザーボードやCPUなどが対応していれば)簡単に温度センサーの値にアクセスできる仕組みがあるようです。

cat /sys/class/thermal/thermal_zone数字/temp

などとすると、マザーボード上に存在する何かしらの温度センサーの値を拾うことができるようです。

ただし、センサーの値が読み取れるファイルの位置やディレクトリ構造などはマシンによって異なるため、じぶんでそれっぽい場所を探す必要があります。

$ cat /sys/class/thermal/thermal_zone0/temp
27800

上記の例の場合は、27800と出ていますが、これは27.800℃を表しているようです。

自分の環境の場合は

$ cat /sys/class/thermal/thermal_zone0/temp
27800
$ cat /sys/class/thermal/thermal_zone1/temp
29800
$ cat /sys/class/thermal/thermal_zone2/temp
44000

といった形で3か所のセンサーの値を読み取ることができました。

ただ、どの値がどの部分の温度なのかはマニュアル等を見ないと知ることができないのが難点です。

CPUの温度を知る方法もありました。

$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp1_label 
Package id 0
$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp1_input 
44000

$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_label 
Core 0
$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input 
42000

$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp3_label 
Core 1
$ cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp3_input 
43000

こちらはlabelも用意されていたため、どの温度なのかわかりやすかったです。

なお、どのセンサーが存在しているのか、どの温度がどの部分のものなのかを正確に知りたい場合はLinux向けの温度チェックツールを使うとわかりやすそうです。

lm_sensors – Arch Linux

参考サイト:

LinuxでCPUの温度を取得する – Qiita

LinuxでCPUの温度やファンの回転数を取得する – パソコン鳥のブログ

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

【android】setTextの間違った使い方について

好きなtextをコードから挿入したい時はsetTextを使いますが、setTest

で+”なんとかかんとか”という連結したコードを書くと

Do not concatenate text displayed with setText.という警告に見舞われます。

 

これは、setText内で文字列を連結させるのは推奨しませんよという警告で、

エラーには直結しませんが、javaの書き方としては汚いと見なされ

警告を受けるみたいです。デバッグには影響はありません。

 

ですが将来的にバージョンアップ時に書き方が変更になったり

デバッグがより強硬になった時に足を掬われるのでできれば

ここで潰したいところ。。。

 

このままではむずかゆいのでString.formatを使って引数の

任意の文字列をformat形式にあてはめてsetTextに投げることで

事を収めました。

 


//stateは適当な文字列</pre>
<span style="font-family: Consolas, Monaco, monospace;">@SuppressLint("DefaultLocale") String str = String.format("%sの通報", state);</span>
<pre>contentsText.setText(str);</pre>
<pre>

 

久々に別言語に入ると前の言語での癖がそのままついてくるので

難儀なところです。

自分もしばらくjavascriptばかり書いていたので、知らずにjavascriptの

コードを書いてよくandroidStudioさんに突っ込まれました。

 

他にもstring.xmlに文字列を置いてプレースホルダーとしてactivityに

表示する手もありましたが、上のやり方が一番簡単だったので

こちらを採用しました。

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

【Vue.js】コンポーネントの持つ値をCSSに伝える

 Vue.jsで小さなコンポーネントを作っていると時折デザインの一部をコンポーネントを呼び出す側で自由に決定させたい時があります。この記事ではそのやり方を紹介します。
 コンポーネントの持つ値をCSSに伝えるために重要な機能はCSSにおける変数であるカスタムプロパティです。
 カスタムプロパティ (–*): CSS 変数 – CSS: カスケーディングスタイルシート | MDN
 CSS カスタムプロパティ (変数) の使用 – CSS: カスケーディングスタイルシート | MDN
 カスタムプロパティは次のように用います。カスタムプロパティの適用対象は定義したHTMLElementの子方向の要素全てです。

div.hoge-box {
    --hoge-box-width: 3em; /* --hogeで宣言 */
    width: var(--hoge-box-width); /* var(--変数名)で使用 */
}

div.hoge-box > div {
    width: calc(var(--hoge-box-width) / 6) /* calcでも使える */
}

html {
    --global--base-color: hsl(0, 0, 0); /* html, :root, bodyの様な広い範囲で指定するとグローバル的に使える */
}

 コンポーネントのルートエレメント上でコンポーネントの持つ値を用いてカスタムプロパティを定義することでCSSへ任意の値を与えます。これは例えば次のようにpropsで与えられた値をcomuputedでまとめ、まとめた値をルートエレメントであるdiv.check-boxのスタイルとして定義、定義した変数をCSS内で扱う、というやり方です。

<template>
  <div
    :style="styleVariables"
    class="check-box"
  >
    <div class="check"/>
  </div>
</template>
<script>
export default Vue.extend({
  props: {
    checkboxWidth: {
      type: String,
      default: '3em',
    },
  },
  computed: {
    /**
     * このコンポーネント中で用いるCSS変数をまとめる.
     * @return {object}
     */
    styleVariables() {
      return {
        '--checkbox-width': this.checkboxWidth,
      };
    },
  },
};
</script>
<style lang="scss" module>
  .check-box {
    --checkbox-width: 3em;// 事故防止のデフォルト値
    border: 2px solid #9e9e9e;
    border-radius: 2px;
    width: var(--checkbox-width);
    min-height: var(--checkbox-width);
    display: flex;
    justify-content: center;
    align-items: center;
  }
  .check{
    position: relative;
    top: calc(var(--checkbox-width) / 6); // def=0.5em
    left: calc(var(--checkbox-width) / -20);// def=-0.15em
    transform: rotate(-45deg);
    transform-origin: left top;
    border-left: 2px solid #000;
    border-bottom: 2px solid #000;
    width: calc(var(--checkbox-width) / 2.4 * 1.618); // def=2.0225em
    height: calc(var(--checkbox-width) / 2.4); // def=1.25em
  }
</style>

 上記コードの動作は次のデモの通りです。

 いたるところでサイズをemで指定していますが変数を介しているためデザインを崩さずデザインを容易に変更できます。変数はコンポーネントのプロップで決定しているため、コンポーネントを呼び出す側が安全にデザインを変えられます。この変数渡しのやり方に加えて、アニメーションや状態の定義と変化を用いることで自由に簡単に扱える最小単位のコンポーネントを作りやすくなります。
 余談ですが、カスタムプロパティを用いる際、CSS独立ファイルでは未定義の変数名を呼び出そうとするか、定義セレクタを多量にコピペすることになり辛くなります。SCSSの様な階層構造を定義できるCSS拡張言語を用いると安全に簡潔に記述できます。

// scssコード
div.hoge-box {
    --hoge-box-width: 3em; // --hogeで宣言
    width: var(--hoge-box-width); // var(--変数名)で使用

    div { // div.hoge-box divと同じ意味になる
        width: calc(var(--hoge-box-width) / 6) // calcでも使える
    }
}
  • この記事いいね! (1)
村上 著者:村上

【AndroidStudio】「File ‘root/res/drawable-hdpi/sym_keyboard_feedback_delete.png’ uses reserved file or directory name ‘res’.」エラーの対処法

今回遭遇した Android Studio のエラーについてです。
リリースを行う際に、「Android App Bundle」を作成しようとしたら、「File ‘root/res/drawable-hdpi/sym_keyboard_feedback_delete.png’ uses reserved file or directory name ‘res’.
」というエラーが発生しました。
なお、こちらのエラーは APK を作成した時には発生しませんでした。
なので、Android App Bundle ではなく APK を使ってアプリをリリースするという方法もありますが、Android App Bundle だとアプリのサイズが小さくなって最適化されるので、なるべく Android App Bundle を作成したいところ。

 

エラーメッセージだけでは解決方法が分からなかったので検索したところ、下記の記述を削除するという方法が多数ヒットしました。

exclude group: 'com.google.android'

が、自分の環境を確認してみても、該当する記述がなく…。

色々検索ワードを変えてみたところ、下記の記事がヒットしました。

android – uses reserved file or directory name ‘res’ – Stack Overflow
https://stackoverflow.com/questions/57400384/uses-reserved-file-or-directory-name-res

こちらの投稿では、Fasebook SDK をアップデートする方法と、build.gradle に下記の記述を追加する方法がありました。

// Facebook SDK を更新
implementation 'com.facebook.android:facebook-android-sdk:5.0.0'
// 下記の記述を build.gradle に追加
android {
    configurations {
        compile.exclude group: 'com.google.android'
    }
}

私の環境では、既に Facebook SDK は最新になっていましたので、2番目の記述を追加しました。
build.gradle に上記の記述を追加し、Sync Now を実行してからビルドを実行。
その後、再度 Android App Bundle を作成したところ、問題なく作成することができました!

 

以上、Android Studio で発生したエラー「File ‘root/res/drawable-hdpi/sym_keyboard_feedback_delete.png’ uses reserved file or directory name ‘res’.」の対処法でした。
参考になれば幸いです。

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

DMARC レポートメール

DMARCの設定を入れた所、メールレポートが到着した。

Report Domain: abcdefg.example.jp Submitter: oneoffice.jp Report-ID: <99999999999999999=xxxxxxxxxxxxxxxxxxxx@oneoffice.jp>

これはどの様な意味があるのだろうか。到着したメールには添付ファイルが gz 圧縮された状態で添付されています。中身は xml ファイルの様です。

<?xml version="1.0" encoding="UTF-8" ?>
<feedback>
  <version>1.0</version>
  <report_metadata>
    <org_name>oneoffice.jp</org_name>
    <email>*************@oneoffice.jp</email>
    <extra_contact_info></extra_contact_info>
    <report_id>99999999999999999=xxxxxxxxxxxxxxxxxxxx@oneoffice.jp</report_id>
    <date_range>
      <begin>1111111111111</begin>
      <end>999999999999</end>
    </date_range>
  </report_metadata>
  <policy_published>
    <domain>abcdefg.example.jp</domain>
    <adkim>r</adkim>
    <aspf>r</aspf>
    <p>none</p>
    <sp></sp>
    <pct>100</pct>
  </policy_published>
  <record>
    <row>
      <source_ip>192.168.1.1(global-ip)</source_ip>
      <count>1</count>
      <policy_evaluated>
        <disposition>none</disposition>
        <dkim>fail</dkim>
        <spf>fail</spf>
      </policy_evaluated>
    </row>
    <identifiers>
      <header_from>abcdefg.example.jp</header_from>
      <envelope_from></envelope_from>
    </identifiers>
    <auth_results>
      <spf>
        <domain>hijklmn.example.jp</domain>
        <scope>helo</scope>
        <result>none</result>
      </spf>
    </auth_results>
  </record>
</feedback>

Top Reporting Domains

https://dmarc.org/stats/dmarc-reporting/

dmarc.org のページを見ると、Top Reporting Domains に列挙されているので、恐らく送ってくるんだろうけど。これを見てなにか判断しろという事だろうけど。

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

CentOS 7 のApache 2.4でmpmを切り替える方法

Apacheには、mpmと呼ばれる動作モードがあります。

最近のApacheでは、デフォルトで”prefork”が指定されているかと思います。

このモードでは、1アクセスごとに1つのApacheプロセスを立ち上げ、ブラウザからサイトへの要求にこたえます。

この方式では、アクセスが増えれば増えるほどApacheのプロセスが増えていくため、大量のアクセスが来るとOSの負荷が増えてしまい、サーバー全体の動作が重くなってしまいます。

一方、MPM動作モードには workerとeventとよばれるものもあります。

これらのモードを使用すると、使用されるプロセス数を節約することができるため、サーバー全体への負荷を少なくすることができます。

ただし、ノンスレッドセーフなモジュールを使用している場合などはそのモジュールは使用できなくなるとのことで、注意が必要です。

さて、このMPMの切り替えですが、OSによっては設定ファイルが分散化されていることがあります。

CentOS 7 の場合は

/etc/httpd/conf.modules.d/00-mpm.conf

にMPMの切り替えが行える記述があるので、ここを変更します。

# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so


内容としては非常に親切で、コメントアウトの付け替え後、Apacheを再起動するだけでMPMの切り替えを行うことができます。

上記の例では、6行目のmpm_prefork(Preforkモード)が有効になっています。

例えば、もしworkerモードを有効にしたい場合は、12行目の

#LoadModule mpm_worker_module modules/mod_mpm_worker.so

の先頭のコメントアウト(#)を外し、先程の6行目の

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

の先頭に#をつければOKです。

# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so


この状態で

sudo apachectl configtest #設定が間違っていないかチェック
sudo systemctl restart httpd #Apache再起動

とすればMPMを切り替えることができます。

・変更前

$ sudo apachectl -V
...
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug  8 2019 11:41:18
Server's Module Magic Number: 20120211:24
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     prefork
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
...

・変更後

$ sudo apachectl -V
...
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug  8 2019 11:41:18
Server's Module Magic Number: 20120211:24
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     worker
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
...

Server MPMの部分が切り替わっていることが確認できるかと思います。

素のApacheの場合は元の設定ファイルであるhttpd.confに統合されていたりするので、あらかじめわかりやすく別ファイルに準備されているのはありがたいですね。

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

【Laravel】6.0.4リリースとLaravel製APIテストの拡張

 Laravel6.0.4がリリースされました。
 Releases · laravel/framework
 機能の追加は次の通りです。

Added

  • Added TestResponse::assertJsonPath() method (#29957)
  • Added hasMacro \ getGlobalMacro \ hasGlobalMacro methods to Eloquent Builder (#30008)
  • Added Illuminate\Database\Eloquent\Relations\BelongsToMany::getPivotColumns() method (#30049)
  • Added ScheduledTaskFinished \ ScheduledTaskStarting events to signal when scheduled task runs (#29888)
  • Allowing adding command arguments and options with InputArgument \ InputOption objects (#29987)


 自分にとって特別な追加はTestResponse::assertJsonPath()です。これのおかげでAPIのミドルウェア込みテスト(疑似的なリクエストを投げて、ルーターとコントローラを通して、レスポンスを返してもらって、レスポンスをチェック)をより簡潔に必要な分だけ作れる様になりました。
 LaravelのTestCaseではAPI用にJSONレスポンス用のassertが用意されています。もともと用意されていたのは大規模にならざるを得ないメソッドや素朴すぎるメソッドです。例えば、assertExactJsonがあります。これは完全一致のJSONを期待するassertで次のように使います。

$this->getJson(route('api.post.show', [$post->id]))
	->assertExactJson([
	    'title' => 'My blog post',
	    'body' => 'Lorem ipsum ...',
	    'tags' => [],
	    'comments' => [
	        [
	            'body' => 'First!',
	            'user_id' => 42,
	            'user' => [
	                'id' => 42,
	                'username' => 'ecrmnn',
	            ],
	        ],
	        [
	            'body' => 'This is my comment',
	            'user_id' => 731,
	            'user' => [
	                'id' => 731,
	                'username' => 'ventrec',
	            ],
	        ],
	    ],
	]);

 これはこれで便利なのですが、細かい単位でテストし難いです。また、同じコントローラメソッドを繰り返しテストすると微妙な差分の期待するJSON定義が膨らみます。もっと言えば、何をテストしたいのかぱっと見分かりません。Laravel6.0.4で追加されたassertJsonPathはこれを解決します。次のコードの様に、JSONの特定のパスについてのみassertをすることで簡潔に必要な分だけ検査をできます。先述のassertExactJsonをassertJsonPathに書き直すと次のようになります。

$this->getJson(route('api.post.show', [$post->id]))
    ->assertJsonPath('tags', [])
    ->assertJsonPath('comments.0.user.username', 'ecrmnn')
    ->assertJsonPath('comments.*.body', [
        'First!',
        'This is my comment',
    ]);

 ちなみにJSONレスポンスを期待する疑似リクエストを投げる時のコードは次のようになります。get, postのみならずput等HTTP2.0で定義されるメソッドにも対応しています。

class HogeControllerTest extends TestCase
{
    public function HogeTest(){
        $this->getJson(route('hoge'));
        $this->postJson(route('hoge'), ['id' => 0, 'password' => '']);
        $this->deleteJson(route('hoge'), ['id' => 0]);
    }
}
  • この記事いいね! (1)
asaba 著者:asaba

【android】edittextの文字制限

edittextで文字制限をするときはどうするのかなと考えながらググってみると

意外と簡単にできてしまいました。

 

javaScriptだと、inputtypeでpatternで[A-Z]*を指定するだけでできてしまうのですが

こちらではxmlにそのまま書き込むことができます。

例えば、数字以外を入れてほしくない場合は、digitsプロパティで1234567890を指定します。

 

</pre>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tel"
android:hint="電話番号"
android:maxLength="11"
android:digits="1234567890"/>
<pre>

 

これを入れるだけで、数字以外の文字をキーボードで打っても文字が入らない

ようになります。

 

これだけでも上等ですが、数字を入れるからにはキーボードの起動時には

数字から入ったほうがユーザーには優しいと思うので、

今度はinputTypeでnumberを指定してみます。

</pre>
android:inputType="number"
<pre>

 

これでキーボードが起動時に数字から打てるようになります。

数字以外にも、無効な文字が打たれた時にキーボードの入力を

感知するコードを作って組み合わせれば幸せになれそう。

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

【Xcode】「Error: Multiple commands produce」エラーの対処法

今回は Xcode で遭遇したエラーについて。
諸事情あって、Cordova で開発した iOS アプリを一度削除して、再度 iOS プラットフォームを追加し直したのですが、その際に「Error: Multiple commands produce」というエラーが発生しました。
GoogleService-Info.plist のファイルパスがエラーメッセージに含まれていたので確認したところ、またこのファイル内容がおかしくなっていたため正しいファイル内容と置き換えたのですが、やはり解決できず。

で、検索したところ、下記の Qiita の記事がヒットしました。

Xcode10 Error: Multiple commands produceを解決する – Qiita
https://qiita.com/SatoTakeshiX/items/047a313f564879e290ec

 

こちらの記事によると、古いビルドシステムに戻すことで解決できるとのことでした。
他のエラーでもお世話になった方法ですね。

Xcode のヘッダメニュー「File」から、「WorkSpace Settings…」をクリックします。
そうすると、下記のウィンドウが表示されるので、「Build System」を「Legacy Build System」に変更します。

あとは、通常通り Build > Run を実行します。
私の環境では、こちらの方法でエラーが解消できました!

なお、この方法はちょっと…という場合は、上で紹介した Qiita の記事に、新しいビルドシステムのままでエラーを解決する方法も掲載されているので、そちらを参考にしていただければと思います。

 

以上、Xcode で「Error: Multiple commands produce」エラーが発生した場合の対処法でした。
こちらの古いビルドシステムを使う方法は、他のエラーの解決方法としても紹介されていることがあるので、覚えておいて損はないはず。
また、少し古いプロジェクトを実行する場合は、先に変更しておいてもいいかもしれませんね。
ご参考になれば幸いです。

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

【Google】ハングアウトで音声が聞こえない時に確認する事

今日遭遇した機材トラブルについてです。
Web 会議でハングアウトを利用したのですが、接続先の方の音声が聞こえず、30分くらい奮闘しました。
ので、次回こうなったときの確認事項をまとめ。

公式のサポートページもありますので、基本的にはこちらを参考にすればOKです。

音声通話やビデオハングアウトの問題を解決する – ハングアウト ヘルプ
https://support.google.com/hangouts/answer/1355579?hl=ja

 

まず確認する事項は、マイク、スピーカーなどの機材と接続している場合はそれが ON になっているかです。
もし、PC 内臓のマイク、スピーカーを使用している場合は、それらが OFFミュートになっていないかを確認します。
また、ハングアウト以外のプログラムでマイク、カメラ、スピーカーが使用中になってる場合、可能であれば一旦終了します。

上記を確認して問題がなかった場合は、ハングアウトの設定を確認します。
画面上に歯車アイコンがあると思うので、そちらから各種設定が正しいかを確認します。
今回はスピーカーに問題ありだったので、スピーカーの出力先を確認し、「テストサウンドを再生」します。これでスピーカーが正しく設定されているかが確認できます。

それでもだめな場合は、ハングアウトの再接続とパソコンの再起動を試してください。
また、接続先の方にも上記の確認をしてもらうと良さそうです。
ここまで確認してもトラブルが解決しないなら、相手側の問題も疑った方が良いですね。

なお、今回の場合は、どうやら接続先の方のマイクトラブルが原因だったようでした。
音声のみスマートフォンで接続していただいたら解決できました!

 

以上、ハングアウトで音声が聞こえない場合に確認する事の一覧でした。
参考になれば幸いです。

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