2017年6月12日月曜日

OS@小さいELFファイルを作ってみる。

■はじめに

私の自作カーネル(Qiitaの紹介記事参照。http://qiita.com/master_mochi/items/431b3b11410a0eed8f4e)にELFローダを実装したのですが、ELFローダをお試しするにはELFファイルを外部記憶装置からメモリに配置しておく必要があります。
ELFファイルを読み込むには、ブートローダにちょっとしたファイルシステムの機能を入れたり、ブートローダからカーネルへ配置情報を渡す機能を入れたりと、たいぶ先が長い道のりとなります。

でも、それはめんどくさいし、もっと手っ取り早く試したい。

というわけで、小っちゃいELFファイルを作って、カーネルに変数として埋め込んでしまおうと企んだわけです。

■コードを用意する

ELFローダを試すといっても、ちゃんとロードされる事だけじゃなくちゃんとプログラムが動く事までを試したいので、無駄に数をカウントアップして画面に表示するプログラムを作って、これをELFファイルにします。

あと、リンカスクリプトも用意しときます。

■単純にコンパイルしてみる

とりあえず、そのままコンパイルしてみます。
サイズを見てみると、
5.2KB!でかい。

■頑張って小さくしてみる

とりあえず、下記コマンドでコンパイルしてみました。サイズ優先の最適化を行うオプション-Osは、悪さしたら嫌なので今回は使いません。
0.6KBくらい減った!
オプション-staticは、共有 ライブラリとのリンクを抑制する様です。がよくわかりません。readelfで確認すると、セクション名.eh_frame_hdrが消えて、セグメント名GNU_EH_FRAMEが消えました。
オプション-fno-identは、#identディレクティブを無視する様です。がよくわかりません。readelfで確認すると、セクション名.commentが消えてました。
オプション-Wl,-sは全てのシンボル情報を削除します。
オプション-Wl,--build-id=noneは、.note.gnu.build-idセクションを削除。ビルドIDはビルドした時に付けられる固有識別番号で、gdbとかで使われたりするのかな?

とはいえ、まだ4.6KB…
readelfで確認してみます。
セクション名.eh_frameは、デバッグ用なのでいりません。オプション-fno-asynchronous-unwind-tablesで消せるようです。
もう一度、readelf。
ん~。セクション名.textがファイルオフセット0x1000から配置されてしまっている為、ELFファイルが4KBを超えてしまっている様です。
これはLDコマンドオプションの--nmagicで詰めれるようです。
もう一度、readelf。
564byteになりました!
GNU_STACKセグメントがいらないけど、まぁいいでしょう。

2017年2月28日火曜日

BLOG@広告が表示されない

広告の枠が表示されるようになりましたが、一向に広告自体が表示されません。
なんでだろ・・・?

また、記事の投稿数が不足しているからだろうか?
それとも、なにか規約違反が?

bloggerがこんなにも広告表示する事が大変だとは・・・

教えてっわかる人!

2017年2月27日月曜日

C言語@do-whileのcontinue

下記のコード、どんな動きをするコードに見えるだろうか。

i = 1;
do {
    printf( "%d\n", i++ );
    continue;
} while ( false );

恥ずかしながら、無限ループと思ってしまった。
しかし、よくよく考えるとこれはループしません。

continueは{に戻るのではなく、}に飛ぶと覚えておけば、混乱することも無さそう。

こんなコード書かねぇ!と思ってしまうのは抜きで。

2017年2月26日日曜日

Android@Firebaseってなんじゃろな

Androidアプリの構想を練っていると、ユーザ間同士で通信をする様なアプリを作りたいとか、ゲームのスコアランキング機能を付けたいとか、必ずサーバが欲しくなります。

だけど、有料のレンタルサーバはお金かかるから気が進まないし、自宅サーバは自分のネット環境を圧迫したくないし電気代もかかるから気が進まないし。

そんな分けでふと検索してみたら、Firebaseなる単語が出てきました。
そのFirebaseについてちょっと調べてみました。

MBaaS。えむばーす。Mobile Backend as a Service。と呼ばれるサービスだそうです。
MBaaSとは、簡単に言うと、「スマートフォンアプリケーションのバックエンド機能が開発不要になるクラウドサービス」なのだそうです。
なるほどわからん。
まぁ、アプリのサーバサイドの管理サービスを提供しちゃうよ!って事なのかな。

Firebaseはgoogleに買収されたそうです。
つまりgoogleアカウントで簡単に登録できるって事ですかね!それは便利。

なにやら、データベース的なものを提供してもらえるそうです。
チャットみたいなものもこのサービスを使えば実現できるとか。

とりあえず、登録してみよう。
ここ(https://firebase.google.com/?hl=ja)を開いて、「無料で開始」をクリック!

アカウントにログインしていたので、特に何も入れることもなく管理画面?っぽいページが表示される。
「新規プロジェクト」を押してみる!

プロジェクト作成ウィンドウが表示されて、なにやら説明が。
「アプリ間でデータベース、ユーザ管理、リモート設定などの機能を共有します。」
なんかわからないけど、ユーザのアカウント管理とかもやってくれちゃうのかな!
プロジェクト名を「test」と入れて、国を「日本」に設定して、「プロジェクトを作成」

プロジェクトの管理画面が表示された!

ページにいろいろ機能説明がされています。
Analytics詳細な分析情報を入手し、アプリがどれだけ使われているか測定、分析します。
Authenticationサーバ側のコードを使わずに、様々なプロバイダのユーザを認証および管理します。
Database接続されている全てのクライアントでデータの保存と同期をリアルタイムで実行します。
Storageサーバ側のコードを使わずに、画像、音声、動画など、ユーザが作成したコンテンツを保存および取得します。
Hostingセキュアなグローバルコンテンツ配信ネットワークを使用してウェブアプリやモバイルウェブアプリを数秒でデプロイします。
Test Lab幅広い端末に対してAndroidアプリをテストします。
Crash Reportingアプリがクラッシュした場合、または動作を停止した場合に、実用的な情報と包括的な分析情報を取得します。
Notifications通知キャンペーンを管理し、適切なタイミングでメッセージを送信して、適切なユーザを惹きつけます。
Remote Configサーバ側の設定パラメータを使用し、アプリの動作をカスタマイズおよびテストします。
Dynamic Linksアプリのインストールの有無にかかわらず、アプリ内の最適な場所にユーザを送ります。
AdMob数多くのGoogle広告主の広告を表示し、アプリからの収益をスマートに向上させます。
Cloud Messagingプラットフォーム間でメッセージを確実に送受信します。
AdWordsインストールを促進し、コンバージョンに対する詳細な分析情報を得て、ターゲットを絞り込んだキャンペーンを実施する事で、ユーザ層の関心をひきつけます。
App Indexingアプリに対するオーガニック検索トラフィックを促進します。

わぁ・・・いっぱい機能がある。どれもすごい魅力的!

これを活用して、自分が作ったしょーもないアプリ「すし道楽 - 暇つぶしゲーム」にスコアランキング機能を付けてみようかなぁ!

2017年2月2日木曜日

家庭菜園@2016冬サニーレタス収穫

2016年秋(10月)に種まきしたサニーレタスがついに収穫開始です。

2017年1月15日に撮影しました。

無事に育ちました。1プランターに3株で、3プランタなので全部で9株です。
マンション最上階の南向きなので、日当たりが良く、大分赤い色が入りました。

手前にネギが埋まって見えますが、去年撒いたサニーレタス(不発)が何故か今になってネギ畑に出てきたものです。せっかくなのでそのままにしたら食べられるまでに。

一気に全部は収穫せず、使いたい分だけ外側から収穫です。
自家製って素晴らしいですね。使いたい時に新鮮な、無農薬の野菜が食べられる。
なかなか幸せです。

さて、次は何を作ろうかな?もう一度夏前にサニーレタスができそうですが。

2017年1月18日水曜日

BLOG@AdSense承認されない

本ブログも立ち上げてから6ヶ月経ちました。
Google先生で検索して、広告が出せるようになるまで最長でも6ヶ月はかかる、的な記事を始めに見つけていたので、6ヶ月のんびり待ち続けていたのです。

下記の通り「Ad Sense に登録」ボタンはクリックできるようになりました。


そしてクリックすると下記ページが表示されます。


そして、「はい」を選択。


「AdSenseアカウントではないか、承認待ちの状態です。」
ダメじゃ~ん!

まだ、何か条件未達なのだろうか?記事数の問題?記事の内容がしょぼい?
モンモンとしていると、こんなページを見つけました。


とりあえず、藁にも縋る思いで、送信しました。
さてはて、どうなる事やら。

つづく。。。

[2017/01/19追記]

この記事を投稿した翌日、なんと先のページに進めるようになりました!


「関連付けを承認」をクリックして、


で、できたー!


さて、、
  • この記事を投稿して15個の記事となりました。
  • 投稿フォームの回答は貰えていません。
つまり、条件は15記事以上、6ヶ月経過、が濃厚・・・?


こんなことなら早く15記事以上書いておくんだった!(爆


2016年12月15日木曜日

GIT@よく使うコマンド早見表

仕事ではsvnを使用している為、数日git触ってないとキャッシュメモリの少ない私には覚えていられない。なので、よく使うコマンド早見表?なるものを作成しようと思います。(日々更新中)

■ clone

git clone <リポジトリアドレス>アドレスが指すリポジトリをクローン(ダウンロード)する

■ add

git add .ワークディレクトリ配下すべてのファイルをステージ(インデックスに記録)する
git add <ファイル>指定したファイルをステージ(インデックスに記録)する
git add -uワークツリー内で版管理中の全てのファイルをステージ(インデックスに記録)する

■ diff

git diff.ワークツリーとインデックス間で全ての版管理中のファイル差分を表示する
git diff HEAD.ワークツリーと最新のコミット間で全ての版管理中のファイル差分を表示する
git diff --cached.インデックスと最新のコミット間のファイル差分を表示する

commit

git commit.コミットする(コミットログエディタ起動)
git commit -m <コミットログ要約>.指定したコミットログ(要約)でコミットする
git commit -a.git add -uとgit commitを連続して実行する

push

git push <登録リポジトリ名> master.登録リポジトリのmasterにプッシュする

status

git status.現在の状態を表示する

log

git log.コミットログを表示する
git log -p.コミットログと差分をパッチ形式で表示する
git log -<数>.コミットログを指定した数だけ表示する
git log --pretty=short.各コミットログの最初の一行(要約)だけを表示する