自宅サーバー自動起動用シェルスクリプトメモ
サーバーの自動起動用に
/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
ホームページの表示速度を計測してみる
お前に足りない物、それは!情熱、思想、理念、頭脳、気品、優雅さ、勤勉さ!そして何よりもー!
速さが足りない!!
なので今日はGoogleのPageSpeed Insightsを使って作ったのサイトのスピードを計測しようと思います。
使い方は簡単でPageSpeed InsightsにアクセスしてURLを入れて分析ボタンを押すだけ!すると・・・・
モバイル
パソコン
いや分かってたよ・・・画像は元サイズのまま使ってたしな。モバイルは対応してないので、こんなもんでしょ・・・
なので書かれている通り、画像サイズを圧縮して最適化してみた!!
↓以前書いたこれを使ってね。
すると・・・
青までにはいかなかったけど、まぁまぁいいんじゃないかな?キャッシュは運用的に辛そうだし。モバイルは今のところ対応するつもりはないので、ここには載せません。
ただ、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(それぐらいはせめてやってくれ・・・)
最近の流行りのAndroid開発環境に疑問
ここ最近Android開発環境の記事ネタを見ているとAndroidStudioの記事ばかりでEclipseの時代は終わったのかなと思う一方で仕事ではEclipseしか使ってない。
AndroidStudioは優秀なのは分かるが、そもそも全体的に英語で敷居が高いし、NDKにまだ標準対応してない。コンパイル設定やれば出来るよって書いてある記事見ても時間がかかるし、メインはwebなので時間をかけた割にはリターンがない。
アプリ作る時はどうしても課金処理を入れないといけないのでJavaだけだと暗号化に不安が残るから、NDKは必須に思えるのだが、暗号化やNDKについて深く掘り下げている記事はそこまで多くないように見える。
暗号化がJavaだけで完結するならAndroidStudioに移行してもいいのだが…
それと別にEclipseが好きなわけではない。単に選択肢がないだけで出来れば使いたくない。
IDEは基本的にどれも重すぎて弱小スペックの仕事PCだと、起動するだけでも5分はかかるので、やる気をどんどん奪っていく。
一番の敵は重いIDEか弱小スペックの仕事PCか。どちらにしろ軽い開発環境が今一番欲しいところ。
むしろAndroidStudioの記事書いてる人達はそんなに高いスペックのPCを使ってコード書いているのだろうか…
PHPでの画像リサイズ
どうしてもWeb関係だとあまり使う機会が少ないので覚えてるうちにメモ。PHPのGDを使用した画像のリサイズ。
PHPのGDインストールは以下のコマンドで。インストール後にApache再起動。
yum -y install php-gd service httpd restart graceful
横幅を重視し、縦の方が長い場合は真ん中辺りを切り抜いて表示する。細かくはやってないので割り切れない時の処理とか適当です・・・・
<?php $image_url = "適当な画像url"; list($width, $height) = getimagesize($image_url); $image = imagecreatefromjpeg($image_url); //作成する画像サイズ $new_height = 100; $new_width = 200; //元画像の左上の位置 $y = 0; //圧縮比率を求める $rate = $new_width / $width; //縦の方が長い場合は画像の真ん中を表示 if ($width < $height) { $rate_height = $rate * $height; $rate_y = ($rate_height - $new_height) / 2; $y = $rate_y / $rate; } $image_p = imagecreatetruecolor($new_width, $new_height); imagecopyresampled($image_p, $image, 0, 0, 0, $y, $width*$rate, $height*$rate, $width, $height); header('Content-Type: image/jpeg'); imagejpeg($image_p, null, 75); imagedestroy($image_p); exit;
そのうちWatchersにも適当に導入するかな・・・・やる気がでれば