明日も楽をするために

めんどくさがりなITエンジニアが書くメモ帳

退職しました

私はこの度、5年間勤めた会社を退職することになりました。

//良いことを書く

20歳から働き始めて、1人で案件をこなしたり、部下を持ったりと、同じ年齢の人達が出来ない経験を得ることができたと思います。

その分もちろん辛い経験を何度もしましたし、くじけそうになる時もありましたが最後までやり遂げることが出来たと思います。

IT業界に入って良かったと思うところは、その技術を元に色んな人と交流できたことですかね。プライベートでもそうですし、仕事でも年齢の差を越えて色々な意見をまじえたり、話し合いができるのは楽しいことです。

新しい職場でも切磋琢磨し、より良いものを作っていきたいと思います。

自宅サーバー自動起動用シェルスクリプトメモ

サーバーの自動起動用に

/sys/class/rtc/rtc0/wakealarm

に時間をタイムスタンプで指定する。
上書きする際は0で初期化しないと書き換えられない?

crontabに設定してシェル実行後に起動する日程を設定して、そのあとでシャットダウン

例:
0 4 * * * sh /site/auto_power.sh

rootで実行しないとシャットダウンコマンドが動かないので注意

#!/bin/sh

#初期化
echo 0 > /sys/class/rtc/rtc0/wakealarm

#該当の時間が何曜日か取得する
day_of_week=`date -d +1hour +%w`
if [ $day_of_week -eq 6 ]; then
    #土曜日
    #4時設定で14起動
    echo `date +%s -d +10hour` > /sys/class/rtc/rtc0/wakealarm
elif [ $day_of_week -eq 0 ]; then
    #日曜日
    #4時設定で14起動
    echo `date +%s -d +10hour` > /sys/class/rtc/rtc0/wakealarm
else
    #4時設定で18起動
    echo `date +%s -d +14hour` > /sys/class/rtc/rtc0/wakealarm
fi

#設定内容の表示
#cat /proc/driver/rtc
/sbin/shutdown -h now

ホームページの表示速度を計測してみる

お前に足りない物、それは!情熱、思想、理念、頭脳、気品、優雅さ、勤勉さ!そして何よりもー!

f:id:makoto1212:20150312203147p:plain:w300
速さが足りない!!


なので今日はGooglePageSpeed Insightsを使って作ったのサイトのスピードを計測しようと思います。

使い方は簡単でPageSpeed InsightsにアクセスしてURLを入れて分析ボタンを押すだけ!すると・・・・

モバイル
f:id:makoto1212:20150312203608p:plain
パソコン
f:id:makoto1212:20150312203615p:plain

いや分かってたよ・・・画像は元サイズのまま使ってたしな。モバイルは対応してないので、こんなもんでしょ・・・

なので書かれている通り、画像サイズを圧縮して最適化してみた!!
↓以前書いたこれを使ってね。

すると・・・

f:id:makoto1212:20150312204023p:plain
青までにはいかなかったけど、まぁまぁいいんじゃないかな?キャッシュは運用的に辛そうだし。モバイルは今のところ対応するつもりはないので、ここには載せません。

ただ、Googleの検索はSEO的にモバイルに対応しないと順位が落ちるそうです。それを裏付けるようにGoogleウェブマスターからモバイル対応しろってメール来ましたね。

Javaの適切なバッファサイズとは?

例えば以下のようなコードがあったとして

byte[] data = new byte[1024];
while ((size = fis.read(data)) != -1 ) {
    fos.write(data, 0, size);
}

byteに指定する値はいくつが適正なのか?

ちなみにBufferedInputStreamなどを使う方法だと、デフォルトのサイズはJavaのバージョンによって異なるらしい(512~8024ぐらい??)

Java ファイルコピー(バッファサイズを変更) / Chat&Messenger
ここによると1MBが適切らしい。ネット検索すると1024のサンプルコードが多いけど、それはテキストを対象とした場合かなと思う。

zipなどを読み込もうとすると、だいたい容量で数十MBから数百MBはすると思うので1024だと1KBで、どう考えても時間がかかる。

//1MBの指定
byte[] data = new byte[1048576];

1024で指定してるコードが多いということは最近の人はJavaのコードをネットにあげてないのか。それともみんなコピペコードばかりなのかな。

Githubで検索すると、こんな感じで書いてあるコードがそこそこある。

Androidのアプリ内にファイルをフォルダ階層で持つ方法

Androidの仕様的に良いのか悪いのか分からないけど、問題なく動いているので折角なのでメモしておこうと思う(エミューレーターv4.4.2と実機v4.4で動作確認済み)

アプリ内にファイルを保存する場合は色々方法があるのだが、ローカルにファイルを持つ方法の一つとして/data/data/パッケージ名/filesにデータを保存する方法がある。

アプリにファイルを入れたい場合はassetフォルダや、res/rawに初めから入れておく方法もあるけど、そもそもGooglePlayで配信時にアプリの容量制限があるため大量のファイルを置く際は使用できない。

なので後からダウンロードしてfilesフォルダにデータを置く方法が一般的だと思う。

Androidにはfilesの中身を操作する関数がいくつか用意されていて

context.openFileOutput();
context.openFileInput();
context.deleteFile();
context.getfilesdir().getpath();

書き込み、読み込み、削除、パス取得などがあるが制限として「/」とか「¥」セパレータ文字が入るとExceptionが投げられるため使用できない。なので実質フォルダ階層を持つことが出来ない。

しかし私が試したところだと、Androidの関数を使わずJavaの関数を使うとフォルダ階層を持つことができるようだ。具体的に言うと以下のような感じで

//FileOutputStreamの場合は存在しないフォルダごと作ってくれる
String fileName = "test.txt";
new FileOutputStream(context.getfilesdir().getpath() + "/test/" + fileName);

//Fileを使う場合mkdirsで複数フォルダの同時作成が可能
new File(context.getfilesdir().getpath() + "/test/").mkdirs();

//以下Javaでそれっぽく・・・

Fileや、FileOutputStreamで作成できるようだ。ただしパスはfilesを使用しているが。

細かい検証はしてないが、書き込み、読み込み、削除は一通りできた。後は権限の設定が出来れば完璧だ(検証してない)

context.openFileOutputも返り値はInputStreamなので内部的には同じことをやっているだけかも知れない・・・・。

しかし折角フォルダ階層が使えるのに、それを制限してるのは勿体ない感じがする。

ちなみに言うとcontext.openFileOutputで/data/data/パッケージ名/filesのフォルダがないとExceptionが投げられるため、Fileのmkdirsを使用して初回はフォルダ作らないといけない

(´∀`;) o0(それぐらいはせめてやってくれ・・・)

Zenfone5はアプリ開発者向け?

結論からいうとASUS PC Linkって言うアプリなんだけど、たぶんASUSの端末には必ず入っていそう。何ができるかと言うとUSB接続でスマホの画面をパソコンの画面に表示できるみたい。しかもパソコンから操作可能という!!

USBデバックモードで接続する必要があるのだが最初からアプリ開発者を想定していたのか、あるいはデバックモードだと制限が解除されるのかな?

文字入力とかはすごい楽。コピーペーストには対応してないのかな・・・・

f:id:makoto1212:20150305224705p:plain

f:id:makoto1212:20150305224700p:plain

最近の流行りのAndroid開発環境に疑問

ここ最近Android開発環境の記事ネタを見ているとAndroidStudioの記事ばかりでEclipseの時代は終わったのかなと思う一方で仕事ではEclipseしか使ってない。

AndroidStudioは優秀なのは分かるが、そもそも全体的に英語で敷居が高いし、NDKにまだ標準対応してない。コンパイル設定やれば出来るよって書いてある記事見ても時間がかかるし、メインはwebなので時間をかけた割にはリターンがない。

アプリ作る時はどうしても課金処理を入れないといけないのでJavaだけだと暗号化に不安が残るから、NDKは必須に思えるのだが、暗号化やNDKについて深く掘り下げている記事はそこまで多くないように見える。

暗号化がJavaだけで完結するならAndroidStudioに移行してもいいのだが…

それと別にEclipseが好きなわけではない。単に選択肢がないだけで出来れば使いたくない。

IDEは基本的にどれも重すぎて弱小スペックの仕事PCだと、起動するだけでも5分はかかるので、やる気をどんどん奪っていく。

一番の敵は重いIDEか弱小スペックの仕事PCか。どちらにしろ軽い開発環境が今一番欲しいところ。

むしろAndroidStudioの記事書いてる人達はそんなに高いスペックのPCを使ってコード書いているのだろうか…