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

memo-pad’s blog

自分のためのメモをまとめています。ここに書いてある内容については責任は負いません。全て自己責任でお願いします。

クロスバイクのパーツが盗まれました

日常

先日ライト用ブラケットとベルを盗まれたため、新品で買い直したのですが、新しくつけたその日にまた盗まれてしまいました。

 

その際初めて、警察に被害届を出したのでその時の流れをメモしておきます。(ちょっと前のことなので少し記憶が曖昧)

 

「自転車 パーツ 盗難 警察」でググると警察の方があまり良い対応をしてくれなかったという情報が見つかったため、ビクビクしながら行ったのですが、結論からいうと普通に対応していただけました。

 

まず、被害届の際に聞かれた情報としては下記のものになります。

 

・盗難にあった場所

・盗難にあった分かる範囲での時刻(~日の~時まではあること確認できて、~日の~時に盗られている事に気づいたという感じ)

・盗難にあったものの時価(購入時の価格から使用した分をざっくり引いた金額)

・盗難にあったものの見た目(自分の場合はネット通販だったため、その商品の写真を見せました)

 

あとは住所やら生年月日や氏名、勤め先などを聞かれて、署名するくらいだったと記憶しています。

 

情報を伝えて、書類に記名した後は、証人として現場検証に立ち会いました。

 

その際、使っていた自転車のタイヤのインチ数やらフレームが何製かなど聞かれました。

 

基本的には盗難された商品の情報と、それがついていた自転車の情報がわかっているとスムーズかなと思いました。

 

ちなみに今回現場への移動やら諸々含めてかかった時間は1時間半程度でした。

 

買い物に行こうとしたところで盗まれていたため、買い物にも行けず、被害届出すので時間を使い、と中々散々な日でした。

 

2回連続同じ場所で盗まれているので、警察の現場検証の様子を犯人が目撃して、ここはリスクが高いと感じてこれ以上盗まれないことを願います。

rubyの勉強始めました

プログラミング ruby

個人的に気になった特徴

  • 末尾にセミコロン(;)が不要

文字出力(print, puts, p)

  • Objectを文字列として出力する
    • print
    • puts
      • 改行が付与される
    • p
      • デバッグ用に使われる
      • オブジェクトの形式を含め表示

# コード
array = ['test1','test2','test3']

print array
puts array
p array

# 出力結果
test1test2test3test1
test2
test3
["test1", "test2", "test3"]
  • 上記のようにputsでは配列の要素1つ1つに対して改行が付与されていることがわかる
    • ハッシュに対しては特に要素毎の改行はされなかった

配列

定義

array = ['test1','test2','test3']

# コード
array = ['test1','test2','test3']
p array[0]     # 0番目、つまりtest1
p array[-1]    # 後ろから1番目、つまりtest3
## 要素の呼び出しは範囲でも可能
p array[0..2]  # 0から2まで
p array[0...2] # 0から1まで(2を含まない)

# 出力結果
"test1"
"test3"
["test1", "test2", "test3"]
["test1", "test2"]

ハッシュ

定義

hash = {"test1" => 10, "test2" => 20, "test3" => 30}

キーにシンボルというものを使って、下記のように表記することも可能(文字列キーよりアクセスが早い)

hash_symbol = {:test1 => 10, :test2 => 20, :test3 => 30}

また、シンボルは次の様に省略して記述可能(ruby1.9からサポート)

hash_symbol2 = {test1: 10, test2: 20, test3: 30}

# code
hash = {"test1" => 10, "test2" => 20, "test3" => 30}
p hash
hash_symbol = {:test1 => 10, :test2 => 20, :test3 => 30}
p hash_symbol
hash_symbol2 = {test1: 10, test2: 20, test3: 30}
p hash_symbol2

# 出力結果
{"test1"=>10, "test2"=>20, "test3"=>30}
{:test1=>10, :test2=>20, :test3=>30}
{:test1=>10, :test2=>20, :test3=>30}
  • ruby2.2.4でpで出力すると省略して記述したものも、通常のシンボルでの表記で出力された

javascriptのコールバック関数

プログラミング javascript

javascriptの勉強はじめました。

いきなりコールバック関数ってなんじゃこれという感じになったので、今わかってる範囲内でメモ。

下記のように、test1のcallback(‘aaa’, ‘bbb’)がtest2の引数a,bにそれぞれ渡される挙動をするのがコールバック関数。

function test1(callback) {
    callback('aaa', 'bbb');
}

function test2(a, b) {
    console.log(a + "," + b);
}

test1(test2);

使い所としては、非同期の場合に処理の順序を制御する場合など。

例えばこれだと出力はfugaとなり想定通りなものとなる。

function test1(hoge) {
    hoge = 'fuga';
    return hoge;
}

function test2(hoge) {
    console.log(hoge);
}

var hoge = 'hoge';
test2(test1(hoge));

出力:fuga

一方で非同期なため、下記のようにtest1で時間をかけてしまうとfugaに文字列がセットされる前にtest2が走ってしまいundefinedとなってしまう。

function test1(hoge) {
    setTimeout(function () {
        hoge = 'fuga';
        return hoge;
    }, 1000);
}

function test2(hoge) {
    console.log(hoge);
}

var hoge = 'hoge';
test2(test1(hoge));

出力:undefined

そこでコールバック関数を使って制御をしてあげるとちゃんと出力がfugaとなる。

function test1(callback) {
    var hoge = 'hoge';
    setTimeout(function () {
        hoge = 'fuga';
        callback(hoge)
    }, 1000);
}

function test2(hoge) {
    console.log(hoge);
}

test1(test2);

出力:fuga

それにしても、時間かけるようにするためsleep関数とかないかなーと思ったのですが、javascriptってsleep関数ないのですね……

docomo端末でのMVNOテザリング有効化方法

MVNO

導入

だいぶ前に手に入れた0sim(0 SIM | nuroモバイル)を長らく放置していたので、余っていたDocomo端末にさしてモバイルルータ代わりにしました。

月500MBまでしか無料じゃないですけど、そこまで頻繁には使わないので中々快適です。

ただ、Docomo端末でMVNOを使ってテザリングする際に罠が一つあったのでここに書いておきます。

ちなみにメインで使ってるau端末はMVNO使ってますがテザリングはそのまま使えたのでdocomo端末特有の問題だと思われます。

どんな罠があるのか?

結論から言ってしまうと、Docomo端末でMVNO使ってテザリングするとネットに繋がりません。

これは、テザリングする際にDocomo端末はデフォルトのAPNを見にいってしまって、MVNO用に設定したAPNを見に行かないのが原因みたいです。

どうやってテザリング中にネット接続をできるようにするのか

まずはadb使えるように環境を整える必要があります。

自分はMac環境ですが、Android Studioを入れていたため既にadbが入っている状態でしたので、ここは省略

下記は実際に自分の持っている端末(Docomo L-05D)に対して行ったことです。

  1. PCでadbを使える環境を整える
  2. スマートフォンをUSBデバッグ状態でPCと接続する
  3. コマンドプロンプトやターミナルで下記コマンドを実行(L-05Dの場合)
$ adb shell content insert --uri content://settings/secure --bind name:s:tether_dun_required --bind value:i:0

–bind value:i:に0を指定することでテザリング時にAPNが変更されなくなります。

もとに戻したい時はここの0を1にすればOK。

PCとスマートフォンを接続するケーブルは給電専用ではなくて、下記のようなデータ通信可能なケーブルを使ってください

補足: adb contentコマンドの使い方

下記コマンドでcontentコマンドの使い方が見れる

$ adb shell content

出力結果

usage: adb shell content [subcommand] [options]

usage: adb shell content insert --uri <URI> --bind <BINDING> [--bind <BINDING>...]
  <URI> a content provider URI.
  <BINDING> binds a typed value to a column and is formatted:
  <COLUMN_NAME>:<TYPE>:<COLUMN_VALUE> where:
  <TYPE> specifies data type such as:
  b - boolean, s - string, i - integer, l - long, f - float, d - double
  Note: Omit the value for passing an empty string, e.g column:s:
  Example:
  # Add "new_setting" secure setting with value "new_value".
  adb shell content insert --uri content://settings/secure --bind name:s:new_setting --bind value:s:new_value

usage: adb shell content update --uri <URI> [--where <WHERE>]
  <WHERE> is a SQL style where clause in quotes (You have to escape single quotes - see example below).
  Example:
  # Change "new_setting" secure setting to "newer_value".
  adb shell content update --uri content://settings/secure --bind value:s:newer_value --where "name='new_setting'"

usage: adb shell content delete --uri <URI> --bind <BINDING> [--bind <BINDING>...] [--where <WHERE>]
  Example:
  # Remove "new_setting" secure setting.
  adb shell content delete --uri content://settings/secure --where "name='new_setting'"

usage: adb shell content query --uri <URI> [--projection <PROJECTION>] [--where <WHERE>] [--sort <SORT_ORDER>]
  <PROJECTION> is a list of colon separated column names and is formatted:
  <COLUMN_NAME>[:<COLUMN_NAME>...]
  <SORT_OREDER> is the order in which rows in the result should be sorted.
  Example:
  # Select "name" and "value" columns from secure settings where "name" is equal to "new_setting" and sort the result by name in ascending order.
  adb shell content query --uri content://settings/secure --projection name:value --where "name='new_setting'" --sort "name ASC"

phpのin_array, array_key_exists, issetの速度比較

プログラミング php

phpのバージョンは5.6.29

実行結果

$ php isset.php 
isset
5.6982040405273E-7seconds

$ php array_key_exists.php 
array_key_exists
1.3089179992676E-6seconds

$ php in_array.php 
in_array
0.011404228210449seconds

$ php or.php 
||
0.028414559364319seconds

速さはisset, array_key_exists, in_array, 論理演算子の順番で大体イメージ通りの結果になりました。
やっぱりissetやarray_key_existsと比較するとin_arrayは遅いですね。
ただ、issetとarray_key_existsはin_arrayと違ってkeyに対して探索行わせるので、そのために下記のように毎回array_flip噛ませるとかやってると逆に遅くなって本末転倒なので注意

$ php isset_flip.php
isset_flip
0.059537370204926seconds

$ php array_key_exists_flip.php
array_key_exists_flip
0.058682680130005seconds

今回のコード

github.com

isset.php
<?php
$search_number = 99999;
$list = range(0, 99999);
$loop_count = 100;

echo "isset\n";
$start_time = microtime(true);
for ($i=0; $i<$loop_count; $i++) {
    if (isset($list[$search_number])) {}
}
$time = microtime(true) - $start_time;
echo $time/$loop_count . "seconds\n";
array_key_exists.php
<?php
$search_number = 99999;
$list = range(0, 99999);
$loop_count = 100;

echo "array_key_exists\n";
$start_time = microtime(true);
for ($i=0; $i<$loop_count; $i++) {
    if (array_key_exists($search_number, $list)) {}
}
$time = microtime(true) - $start_time;
echo $time/$loop_count . "seconds\n";
in_array.php
<?php
$search_number = 99999;
$list = range(0, 99999);
$loop_count = 100;

echo "in_array\n";
$start_time = microtime(true);
for ($i=0; $i<$loop_count; $i++) {
    if (in_array($search_number, $list, true)) {}
}
$time = microtime(true) - $start_time;
echo $time/$loop_count . "seconds\n";
or.php
<?php
$search_number = 99999;
$list = range(0, 99999);
$loop_count = 100;

echo "||\n";
$start_time = microtime(true);
for ($i=0; $i<$loop_count; $i++) {
    if ($search_number === 0 ||
        $search_number === 1 ||
〜〜〜〜〜〜〜〜〜〜〜〜〜略〜〜〜〜〜〜〜〜〜〜〜〜〜
        $search_number === 99999) {}
    }
$time = microtime(true) - $start_time;
echo $time/$loop_count . "seconds\n";
isset_flip.php
<?php
$search_number = 99999;
$list = range(0, 99999);
$loop_count = 100;

echo "isset_flip\n";
$start_time = microtime(true);
for ($i=0; $i<$loop_count; $i++) {
    $flipped_list = array_flip($list);
    if (isset($flipped_list[$search_number])) {}
}
$time = microtime(true) - $start_time;
echo $time/$loop_count . "seconds\n";
array_key_exists_flip.php
<?php
$search_number = 99999;
$list = range(0, 99999);
$loop_count = 100;

echo "array_key_exists_flip\n";
$start_time = microtime(true);
for ($i=0; $i<$loop_count; $i++) {
    $flipped_list = array_flip($list);
    if (array_key_exists($search_number, $flipped_list)) {}
}
$time = microtime(true) - $start_time;
echo $time/$loop_count . "seconds\n";