読者です 読者をやめる 読者になる 読者になる

MasKのpermission denied.

新卒2年目WEBエンジニアの僕がぶつかった技術的な問題や発見のメモ

ES6のアロー関数を使うとjqueryのon()でthisが効かない

例えばselectボックスが変更された時点でその値を取って何かしたい場合
以下のように書くとエラーになります。

$(document).on("change", ".hoge", (() => {
        // this が undefined
        console.log(this.value);
}

これはES6の新仕様ではthisが呼び出し元拘束されているため(?)です。

上記を今までのイメージ通りどうささせるには

$(document).on("change", ".hoge", (event => {
        console.log(event.currentTarget.value);
}

のようにちゃんと第一引数のeventからcurrentTargetを使用する必要があるみたい。

参照
shirusu-ni-tarazu.hatenablog.jp

SequelProでVagrant内のMySQLに接続する方法

VagrantMySQL立てたけど、SequelProとの接続ってどうやるんだろーと思って調べたのでシェア。
SQL系は素でコマンド叩くよりGUIの方が扱いやすいですよね。

↓SequelProが何かわからない方向け
iritec.jp

PhpMyAdminよりだいぶ使いやすいですよね。
ってなわけでmacにインストールしているSequelProでなんとか触れないかなーと思ったらやっぱりちゃんとつなげるっぽい。

で、Vagrantと接続する方法が↓
qiita.com

これで快適なSQLライフが送れる!笑( ◉ ∀ ◉ )

【Android】アプリ起動時にキーパッドが表示されるのを防ぐ方法

f:id:mask0702:20160117180731p:plain

Androidアプリを開発中、アプリ起動時にEditTextにフォーカスが当たってしまい、キーパッドが表示されてしまう問題を解決したので共有。

その方法は「起動時に、EditText以外にフォーカスが当たるようにする」というシンプルなもの。

layoutのxmlファイルでEditText以外の要素に
android:focusable="true"
android:focusableInTouchMode="true"
を追加して、requestFocus タグをその要素で挟めば良い。
例えばButtonタグにフォーカスを当てるにはこんな感じにすれば良い。

<EditText
    android:id="@+id/editText"
    android:layout_width="0dp"
    android:layout_weight="4"
    android:layout_height="wrap_content"
    android:inputType="text" />

<Button
    android:id="@+id/addButton"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:layout_height="wrap_content"
    android:text="追加"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:onClick="addList"
    >
    <requestFocus />
</Button>

なるほど。

※参考
exiz.org

【Android】CustomListViewでクリックイベントが拾えない問題【解決】

f:id:mask0702:20151209100945j:plain

Androidで普通のリストビューの時は

ListView lv = (ListView) findViewById(R.id.listView);

lv.setOnItemClickListener(new AdapterView.OnItemClickListenner() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Log.d("DEBUG", "触ったよ");
    }
});

みたいな感じでクリック時の処理が効いていたのに、ちょっと工夫してカスタムしてみたら動かず、ログをみても
D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
と表示されるだけになってしまった。

いろいろググって試してみたけど、うまくいかないものが多かったけど、stackoverflow様が教えてくれた。

stackoverflow.com

Usually this happens because the items in your listview are in focus. Try adding

というわけでViewのxmlファイルのリストビューのレイアウト部分に

android:descendantFocusability="blocksDescendants"

を追加したらちゃんとクリックもロングクリックも拾えるようになった。
どうやらListItemの子要素にButtonとかのクリックできるViewがあると、ListViewのクリックイベントをブロックするらしい。

なるほどなー(・ε・)

aftercider.hatenablog.com

【Android】overridePendingTransitionとは

f:id:mask0702:20151209100945j:plain

外のソースを読んでて、たまにActivity.overridePendingTransition()みたいなソースがあってなんだろうなーと思ったのを調べたのでシェア

Intent intent = new Intent(getActivity(), SubActivity.class);
startActivity(intent);
getActivity().overridePendingTransition(enterAnim, exitAnim);

みたいな使われ方で、どうやらActivity間の移動時のアニメーションに使えるらしい。引数のenterAnimとexitAnimは両方ともint型。

↓引数二つに0を渡すと高速で遷移しているように見せられるらしい。
d.hatena.ne.jp


↓フラグメントで使うとうまくいかないパターンもあるらしい。
qiita.com

PHPでAndroidのデフォルトブラウザ判定する方法

f:id:mask0702:20151209100945j:plain

もろもろ調べたけど、「androidを含んで、かつlinux; u; を含んでかつchromeを含まない」あたりが妥当っぽい。

せっかくなのでUserAgentUtilクラス作っていろんなところから参照できるようにしました。

<?php

class UserAgentUtil
{
    /**
     * Andoidのデフォルトブラウザの時のみtrueを返す。
     * @return boolean
     */
    static function isAndroidDefault()
    {
        $ua = mb_strtolower($_SERVER['HTTP_USER_AGENT']);
        $isAndroidDefault = false;

        // androidを含んで、かつlinux; u; を含んでかつchromeを含まない
        if (strpos($ua, 'android') !== false
            && strpos($ua, 'linux; u;') !== false
            && strpos($ua, 'chrome') === false) {

            $androidDefault = true;
        }

        return $isAndroidDefault;
    }
}

こんな感じで。

GoogleAppScript(GAS)をgit管理

f:id:mask0702:20160214172940j:plain

1日1草活動を続けている関係で、ずっとGoogleAppScriptをgit管理したいなーと思ってました。
f:id:mask0702:20160214172824p:plain

でもさすがにソースがローカルにないから無理だよなーと思って、検索すらしてなかった。

qiita.com
あった。

というわけで

npm install -g gas-manager

でgasコマンド入れて、あとは上の記事同様設定をすればok。
もしnpmでエラー出たら僕と同じ症状かもなので以下参考

mask.hatenadiary.com

で上のqiitaの記事で一部よくわからなかったのが

gas-managerでできないこと

ファイルにひもづいているスクリプトを対象としたインポート/エクスポート

ここ。ファイルにひもづいてないスクリプトって何?みたいな。
だってGAS書くときって新しいスプレッドシート開いて[ツール]->[スクリプト エディタ]で開くよね?ファイルに紐付いてないやつってあるん??


あった。

f:id:mask0702:20160214174121p:plain

GoogleDriveのページに行って、[新規]->[その他]->[+ アプリを追加] で「script」とかで検索すれば出ます。

たしかにこれで作成したスクリプトファイルは

% gas upload
can't change type of existing file
Success uploading for GmailScript

uploadできました!