月別アーカイブ 8月 2019

村上 著者:村上

【JavaScript】配列の要素を削除するspliceメソッド

本日は、JavaScript で配列の要素を削除する方法についてです。
あまり使うことがなく、使用するメソッドが分からなかったので備忘録としてまとめます。

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

JavaScriptの配列の使い方まとめ。要素の追加,結合,取得,削除。 – Qiita
https://qiita.com/takeharu/items/d75f96f81ff83680013f

配列の要素の削除方法だけでなく、追加や結合など基本的な操作方法がまとめられているので、配列の操作が分からなくなったら見ることをおすすめします。

 

さて、配列の要素を削除する方法ですが、タイトルにも記載した通り splice() メソッドを使用します。
なお、splice() メソッドは、削除のためだけのメソッドではなく、追加や置換なども行うことができます。
使用方法は下記のとおりです。

let result = ["a", "b", "c", "d", "e"];
result.splice(2, 1);  // 3番目から1つの要素を削除する

上記を実行すれば変数 result が書き換わります。
この場合、変数 result は ["a", "b", "d", "e"] となります。

なお、連続していれば複数の配列を同時に削除することも可能です。
その場合は、下記のようにします

let result = ["a", "b", "c", "d", "e"];
result.splice(1, 3);  // 2番目から3つの要素を削除する

結果は ["a", "e"] になります。

 

以上、JavaScript で配列を操作する方法についてでした。
使用頻度が低いとすぐ忘れてしまうので、他にもメソッドがあれば私の備忘録も兼ねてご紹介したいと思います。

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

www. を省略しない chrome 設定

Google Chrome の最近のバージョンから、再び www. が省略表示されるようになってしまいました。

情報を探したところ、見つけたため書いておきます。
【Google Chrome】アドレスバーのURLから省略された「www」を表示させる

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

【Linux】ほぼワンライナーで中身の伴ったファイルを作る

 SSHしてタイミングや画面の状態を考慮せず一行コマンドのスパムだけで環境構築したい時なんかに使えます。エディタを開くのもファイルのアップロードのための権限を得るのも面倒だけどsudoとコマンド送信はできるみたいな時、特に使えます。
 echoの結果をファイルに出力することで実現します。例えば次の様にシェルスクリプトのファイルを作れます。

set +H
echo -e "#!/bin/sh\n/home/pi/RTKLIB/app/str2str/gcc/str2str -in serial://ttyACM0:115200 -out tcpsvr://:12345\n" | sudo tee /opt/str2str_tcp_svr.sh

 以下解説です。
 一行目のset +Hはヒストリ参照の無効化のためのコマンドです。シェルには!hogeの様に打つと最近使ったhogeから使ったコマンドを呼び出す機能があります。面倒なオプションをコピペするよりもサクサク操作できるなど利点がありますが今回は邪魔になりがちです。シェルスクリプトファイルを生成したい時、先頭の#!/bin./shを誤って解釈していしまうので無効化します。setはヒストリ参照以外にも多くのオプションの制御ができます。
 二行目の-eは改行の有効化(\nが改行コードと扱われるようになる)です。これで複数行にわたるファイルの中身を表現します。ファイルをどこかで下書きした後に改行コードを文字列\nに置換すると楽です。
 できあがったファイルの中身をsudo tee [ファイル]で吐き出します。sudoのため権限絡みのファイル生成問題を避けられます。teeは次の通りのコマンドでパイプで渡された標準入力であるechoの中身をファイルに書き込みます。標準出力(画面とか)にも出力されるため書き込み内容も見やすい形で確かめられ安全安心です。

$ tee --help
使用法: tee [オプション]... [ファイル]...
標準入力を各 FILE にコピーし、標準出力にも出力します。

  -a, --append              指定されたファイルに追加し、上書きしない
  -i, --ignore-interrupts   割込みシグナルを無視
      --help     この使い方を表示して終了する
      --version  バージョン情報を表示して終了する

FILE に - を指定した場合、標準出力に再度コピーします

GNU coreutils online help: 
tee の翻訳に関するバグは  に連絡してください。
完全な文書を参照する場合は info coreutils 'tee invocation' を実行してください。
  • この記事いいね! (1)
takahashi 著者:takahashi

Android9でアプリを2画面で使う方法

Android9からついに画面分割して2画面でアプリが使えるようになりました!

PCと違い1画面を丸々占有するのがスマートフォンの基本的なUIでしたが、やはり調べものをしながらメモを取りたい…といったような場面も出てくるので、とてもありがたい機能追加です。

しかしながら、どこから2画面にするのかがちょっとわかりづらいという難点があります。

今回は、2画面に切り替える方法をご紹介したいと思います。

まず、何かアプリが起動した状態でタスク一覧画面を表示します。

ナビゲーションボタンが旧来の3ボタンの場合は、一番右の■を、ナビゲーションバーの場合は真ん中に表示されているバーを上に引き上げるようにフリックします。
(※メーカによってデザインや位置が異なる場合があります。)

するとこのような画面になるかと思いますので、タスク上部のアプリアイコンのあたりを長押しします。

メニューが出てくるので、中から”分割画面”をタップします。

すると

画面分割したアプリのウインドウ(?)が上部に最小化されるので、もう片方の画面で表示したいアプリを起動します。

するとこんな感じで半々に2分割されます。

また、真ん中のバーをつかんで上下に動かすことで、広さを3段階ほど調整することができます。

この機能を使えば、例えば調べものをしながらメモを取る、といった使い方もできそうですね。

ちなみに、バーを画面上、または画面下に完全にフリックしてしまえば、元の1画面に戻すこともできます。

とても便利なので、お手元にAndroid9の端末がある方は是非一度試してみて下さい。

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

【React】Material-UIのListsコンポーネントのrightIconButtonについて

ちょっとハマったので、対応方法をまとめ。
今回は、React のプロジェクトでマテリアルデザインを導入するために利用している「Material-UI」というフレームワークについてです。
このフレームワークで用意されている Lists コンポーネントを使ってリストを作成しているのですが、リストアイテムの右端にアイコンボタンを設置したとき、ボタンを押すとリストアイテムまで反応してしまうという現象が発生していました。

バージョンが古いのも問題なのでしょうが…依存関係の問題もあり、まだアップデートができていません。
時間を見つけて行いたいと思います。

 

サンプルのコードはこちら。

const rightButton = (
    <IconButton onClick={this.clickButton}>
        <MoreVertIcon color={grey400} />
    </IconButton>
);

<ListItem
    onClick={this.listClick}
    primaryText={[タイトル]}
    secondaryText={[サブタイトル]}
    leftAvatar={<img src={[画像URL]} height="40" width="40" style={style.image} />}
    rightIconButton={rightButton}/>

上記のように、右端に表示したいアイコンボタンを rightIconButton を使って定義したのですが、このボタンをクリックすると、ListItem で指定した onClick も発火してしまいます。
ドキュメントによると、rightIconButton を使って定義したボタンをクリックした時は、ListItem のクリックイベントは発火しないと書かれているのですが…。

で、正直面倒くさくなってしまったため、力業で解決することにしました。
それが下記のコードです。



<div className="listItem">
    <ListItem
        onClick={this.listClick}
        primaryText={[タイトル]}
        secondaryText={[サブタイトル]}
        leftAvatar={<img src={[画像URL]} height="40" width="40" style={style.image} />}
        rightIconButton={rightButton}/>
    <IconButton onClick={this.clickButton} className="rightButton">
        <MoreVertIcon color={grey400} />
    </IconButton>
</div>


ListItem から IconButton を外に出してしまい、CSS で位置を調整しました。
なお、CSS は下記のとおりです。

.listItem {
    position: relative;
}
.rightButton {
    position: absolute;
    right: 6px;
    top: 50%;
    transform: translateY(-50%);
}

恐らく上記の CSS であれば、ListItem の高さが変わってもボタンの位置は上下中央揃えになるはずです。
なお、CSS はデザインに応じて適宜変更してください。

 

以上、Material-UI のLists コンポーネントの rightIconButton が思った通りの動作をしなかった時の対処法でした。
正式な方法ではありませんが、少なくとも私の環境では問題なく動作しておりますので、お急ぎの時はこの方法を検討してみてはいかがでしょうか。

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

【sql】INTO句で一発で新規テーブルを作る方法

ここ最近はsqlのリファレンスも積極的に読むようになりました。

zendframeworkも最初見た時はなんじゃこりゃjavaみたいと困惑することもありましたが

今になってようやくその戸惑いも消えつつあります。

普通のINSERT句で新規にテーブルを作って与えられた値をレコードに突っ込むのは

簡単ですが、そのレコードの値を新たに作った新規テーブルにまた入れるとなると骨が折れますよね。

今回良いなと思ったINTO句は、一つの命令文で新規テーブル追加と旧テーブル両方にレコード

を追加することができます。一文でできるって素晴らしいです。


SELECT 名前、価格、産地、消費期限
  INTO 消費期限切れテーブル FROM 野菜テーブル

WHERE 消費期限 20190809

ここでは野菜テーブルから、消費期限切れレコードの値以下の行を抽出しています。例えば

ここに消費期限レコードの値が20190801や20180122に該当すれば、新規の消費期限切れテーブルに

移送されるということです。

一時的に目的のレコードを抜き出せるので、在庫処理などに向いてそうで便利そう。

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

【PHP】ファイルの中身からファイル形式を識別する

 webサービスではユーザがサーバにファイルを送ることはよくあります。送られたファイルの中身を扱うこともよくあります。想定していない振る舞いをするファイルを扱った際はバグに繋がりやすく、時にセキュリティの問題も引き起こします。ファイル形式の識別と識別結果による条件分岐は必要になります。
 ファイル形式の識別は簡易な方法がいくつかあります。例えば、ファイル名末尾にある拡張子から読み取れます。セキュリティ的にはとても信用できませんがファイル名のみで判別というのはとても高速で簡単です。例えば、MIMEタイプで大別できます。とはいえまだ偽装は簡単です。ファイルの中身からファイル形式を読み取る方法はこれらよりいくらか頑強な方法です。
 MIME タイプ (IANA メディアタイプ) – HTTP | MDN
 ファイルの中身の先頭にはマジックナンバーと呼ばれるバイナリ形式の署名が入っています。形式によってはテキストエディタで無理やり開くと文字列で一部が見えます。下の画像の”臼NG”のあたりです。


 ファイル形式とマジックナンバーは次のサイトらにまとめられています。
File Signatures
File Signature Database:
 これと読み取ったファイルの中身を突き合わせることでファイル形式を識別します。PNG形式ならば次の通り、16進コードで表して” 89 50 4E 47 0D 0A 1A 0A”となっています。

 PHPならば次の様に検証できます。

function isPng($content){
    $png_sig = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a";
    return strpos($content, $png_sig) === 0;
}

 ダブルクォーテーションでくくった文字列はエスケープシーケンスが使え、\xhhは”16進コードで hh の文字”を表します。
PHP: エスケープシーケンス – Manual
 先ほど得られた16進コードによるファイル先頭マジックナンバーをエスケープシーケンスによるも文字列で表し、strposで先頭からマジックナンバーが現れるかを確かめます。
PHP: strpos – Manual
 これでファイル形式を識別できます。先頭が正しくともさらに続きの部分で攻撃の余地があるかもしれませんがノーガードよりは随分ましになります。

 ファイルのバイナリはLinuxコマンドのod -h [ファイル名] | less -Fが読みやすかったです。

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

rc.localにSSHトンネルを張るコマンドを書いたらrc.localがこけるようになった話

先日、紆余曲折あってRaspberry Piに、起動時に特定のサーバーに対してリモートトンネルを掘るように、/etc/rc.localに

autossh user@example.com -R <待ち受けIPアドレス>:<源ポート>:<送り先IPアドレス>:<送り先ポート> -i /path/to/.ssh/id_rsa &amp;
# https://www2.filewo.net/wordpress/2014/08/05/ssh%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AF%E3%83%BC%E3%83%89%EF%BC%88ssh%E3%83%88%E3%83%B3%E3%83%8D%E3%83%AB%EF%BC%89%E3%80%90%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%BB%E3%83%AA/#i-21 を参考

のように記述していたのですが、OSの起動ログを確認してみると、

Failed to start /etc/rc.local Compatibility.

というエラーメッセージが発生。

起動後journalctlで調べてみると

ssh exited prematurely with status 0

というメッセージが出ていました。

調べたところ、こちらのサイトに答えが乗っていました。

Autossh error with upstart script: ssh exited prematurely with status 0 [closed] – serverfault

どうやら、rc.localでsshコマンドを動かしてしまうと、sshコマンドが出力する対話メッセージが原因で問題が起きてしまうようです。

ということで、ssh(autossh)コマンドに “-N”オプションを付けて、非対話モードにします。

autossh user@example.com -N -R <待ち受けIPアドレス>:<源ポート>:<送り先IPアドレス>:<送り先ポート> -i /path/to/.ssh/id_rsa &amp;

これで/etc/rc.localが起動で失敗することはなくなりました。

ちなみに、autosshは完全にkillされるまで動き続けるため、コマンドの最後に”&”をつけてバックグラウンドにしないといつまでたっても起動が終わらないという状態になりますので注意が必要です。

/etc/rc.localは手軽に起動時にスクリプトを実行させるにはいい仕組みですが、上記のようなことを考えるとやはり起動時に実行させる処理は可能な限りデーモン化した方がよいのかもしれませんね…(;´∀`)

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

Symantec と Broadcom

なんとブロードコムがシマンテックの企業部門を107億ドルで買収したとのこと。
しかもニコニコ現金払い!キャッシュですよ!かっこいい(笑)

ブロードコム、シマンテックの企業向け事業部門を買収へ-107億ドル

法人向け製品では以前 Endpoint Security を使用していました。今ではスタッフ数も減った関係で仮定向けの Norton 製品へ切り替えてしまいました。個人製品は引き続きシマンテック社の様です。ウィルス検知エンジンなど、そもそも別なのでしょうか。なんだか先行き不安ですが。

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

Linux系OSでタイムゾーンを変更する方法

OSに設定されているタイムゾーンが自分の使用したいものと異なっている場合、数時間時刻がずれてしまうことになるので、いろいろ困ることがあります。

そういった場合はタイムゾーンを設定しなおさないといけません。

Linuxでのタイムゾーンの変更方法をご紹介します。

/usr/share/zoneinfo

を見ると

$ ls /usr/share/zoneinfo
Africa      CET      Egypt    GMT+0      Iran       MST7MDT  Pacific    UCT          leap-seconds.list
America     CST6CDT  Eire     GMT-0      Israel     Mexico   Poland     US           localtime
Antarctica  Canada   Etc      GMT0       Jamaica    Msft     Portugal   UTC          posix
Arctic      Chile    Europe   Greenwich  Japan      NZ       ROC        Universal    posixrules
Asia        Cuba     Factory  HST        Kwajalein  NZ-CHAT  ROK        W-SU         right
Atlantic    EET      GB       Hongkong   Libya      Navajo   Singapore  WET          zone.tab
Australia   EST      GB-Eire  Iceland    MET        PRC      SystemV    Zulu         zone1970.tab
Brazil      EST5EDT  GMT      Indian     MST        PST8PDT  Turkey     iso3166.tab

あらゆるタイムゾーンの設定が書かれたファイルが置かれています。

これらは名前のタイムゾーンの設定がそれぞれ入っているので、設定したいタイムゾーンファイルのリンクを/etc/localtimeとして張ります。

ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

(日本語時間に設定する場合)

ただ、この設定では再起動時に変更する前のタイムゾーンに戻されてしまうようなので、永続化させるためには
/etc/sysconfig/clock
下記のように変更します。

ZONE="Asia/Tokyo"
UTC=false

これで設定完了です。

【Linux】タイムゾーン(Timezone)の変更 – Qiita

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