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

XamarinでAndroidのServiceクラスが使えないとき

[Android] FusedLocationProviderApi を使って位置情報を取得

を参考にVisualStudio for Mac(Xamarin)でServiceとBroadcastReceiverを使おうとしたら呼ばれない。ブレークポイントすらも止まらない。AndroidManifest.xmlに記述が抜けてるのかと思ったがそれも違う。

なぜなんだと思ってXamarinの公式サンプル見たらわかった。

クラスの定義にカスタム属性つけるだけだった。。

Service
[Service]
public class MyService : Service
{
    /* ... */
}
BroadcastReceiver
[BroadcastReceiver(Enabled = true, Exported = false)]
public class MyReceiver : BroadcastReceiver
{
    /* ... */
}

これ書いとけばAndroidManifest.xmlには何も書かなくても動いた。

Xamarinはこういうくだらないけど知らないとハマるポイントが結構あってムカつく。Xamarinは生産性に寄与しない気がする。

Xamarinの良いところって結局C#で書けるということくらいだろうと思う。

正直C#よりもSwiftとKotlin使えるのであればそっち使えたほうが嬉しい。。

C#のHttpClientでPOSTしてresponse bodyを受け取る

リクエスト送信
async public Task<string> HttpPost(string url)
{
    var client = new HttpClient();
    var content = new FormUrlEncodedContent(new Dictionary<string, string>
    {
        /**
         * POSTするデータを書く
         * { "key", value }
         * のような感じで
         */
    });

    var response = await client.PostAsync(url, content);
    return await response.Content.ReadAsStringAsync();
}

responseにはStatusCodeとかHeadersも入ってる。

レスポンス取得
var url = "http://127.0.0.1:8080";
var task = Task.Run(() => {
    return HttpPost(url);
});
System.Console.WriteLine(task.Result);

ググってみたら他所のサイトのサンプルコードには

var task = await HttpPost(url);

で値が取れるかのように書いてあるところもあったけど、自分の場合は無理だった(アプリが止まった)

.NETのWEBアプリじゃなくてXamarinのスマホアプリだからだろうか。。

neovimで言語ごとのインデントとかの設定をする方法

まあマニュアル読めば書いてある話ではあるんだけど、そこらへんうまいこと日本語で解説してくれてる人がいるかと思ったらあんまりいないみたいだったので自分用にメモっておく。

1. runtimeディレクトリにftpluginディレクトリを作る

Unix系のシステムでは通常これは “~/.config/nvim” になるらしい。

mkdir -p ~/.config/nvim/ftplugin

runtimeディレクトリがわかんない場合は、vim上で

:set runtimepath?

とコマンド打てば表示される。
表示された中で一番最初に出てくるパスを普通は使うものらしい。

2. さっき作ったftpluginディレクトリに “ファイルタイプ名.vim” ファイルを作る

で、そのファイルの中身には普通にinit.vim(.vimrc)みたいにインデントとかの設定を書くわけだけど、:setじゃなくて:setlocalとしておくとそのバッファだけに設定が反映されるので他のファイルタイプに影響がないようにできるらしい。

e.g.
setlocal shiftwidth=2

同様にキーマップについてもbufferローカルな設定にしとくと良いらしい。

ftplugin/javascript.vim
let maplocalleader = ","
map <buffer> <LocalLeader>A o新しい行だよ!<ESC>

上記を設定した後に.jsのファイルを開いて",A(shift+a)“とつづけて入力すると、カーソルの下の行に「新しい行だよ!」と追加されて、ノーマルモードに戻っている。

ネットカフェで勉強することの良い点悪い点

ネットカフェで勉強することの良い点悪い点

最近土日とかにネットカフェで勉強することが増えた。家にいると勉強しないから。

でもネットカフェが勉強する場所として最適というわけではない。家にいるよりは気持ちを切り替えて勉強できるんだけど勉強を阻害する要因も同時にある。それについて感じたことをメモ。

  • 良い点

    • 気持ちを切り替えられる

      家にいると勉強してる最中であっても部屋のゴミが気になったり洗濯物を始めてしまったり本を読み始めてしまったりYouTubeを観始めてしまったりしてなかなか固まった作業の時間が取れない。

      対してネットカフェだと個室なので他に注意を向ける対象がない。MacBookに集中して向き合うことができる。

    • 金がかかっているので頑張れる

      ネットカフェの利用にはカネがかかる。そこで遊んでしまったらカネが無駄になってしまうという意識が働くため、家にいて作業するより頑張ることができる。

    • 飲み物が飲める

      これは意外に良い。所詮ネカフェで飲める飲み物なんてインスタントのコーヒーとか体に悪いジュースとかだから品質が良いというわけではないんだけど、インスタントであってもコーヒーを一杯飲んでから作業を始めると集中できる。普段カフェイン絶ちをしているのでなおさら効く。

      もちろん家にいてもコーヒーくらい沸かせば良いんだけど、ボタン一つで出てくるので意識を妨げられる度合いが少ない。

    • 腹が減ったら飯を注文できる

      これも飲み物と同じで、意識を妨げられずに食事を取れるというのが良い。家で腹が減ると、買いに行くか作るかせねばならずそこで作業が中断させられる。

      しかもネカフェの飯は安価である。栄養価スコアは悪そうだけど。

    • 休憩時の気分転換アイテムがある

      マンガは豊富に揃っているし、雑誌、新聞などある。店によってはテレビとか映画とかある。色々あるんだけどやはりマンガが一番気分転換としては良い。休憩時に読みたいマンガ4、5巻取ってブースに入るといい感じだ。

  • 悪い点

    • 時間を気にしないといけない

      多くのネカフェは3時間とか6時間のコースがある。最近は自動でプラン切り替えてくれる店も多いけど、入店時にプラン決めとかないといけない店も多い。3時間コースで入って3時間を超えてしまうと延長料がバカ高くて割高になる。

      作業始めて数時間経ってから調子が出てくるので、ちょうどいいときにもう出る時間だったりする。

    • ネットが繋がらないときがある

      MacBookにはLANケーブルを刺す穴がない。無線でネットに繋がないといけないわけだが、店によっては(というか大抵の店で)Wifiの環境が良くない。席次第でブチブチ切れたり、FreeSpotしかない店もある。せっかくはるばるやってきたのにネット環境なしでは今日日何も作業できないに等しい。ネットが繋がらなくなったりしたらあとはもうマンガを読むしかなくなり勉強できない。

    • うるさいやつがいたときに殺意が湧く

      たまにエンターキーめちゃくちゃうるさく叩くやつがいると殺意が湧く。イヤホンを必ず持ち込んだほうが良い。

      また、咳払いがうるさいやつとかいびきがうるさいやつとかもいる。店によってはカラオケルームの子供がうるさいとか、ビリヤードコーナーの高校生がうるさいとかもある。本当にイヤホン必携。

    • マンガを読んでしまう

      マンガが置いてあるのはメリットでもありデメリットでもある。休憩しようと思ってマンガを読み始めると、続きが気になって結局最後まで読んでしまい、ほとんど作業が進まなかった、という経験も何回かある。長編物のマンガには気をつけたい。

まとめ

まずは家で勉強やってみて、はかどらないというときにネットカフェとかに行くと良いのかもしれない。休日家で勉強してるとせっかくの休みなのに俺は何をやってるんだろうか、とか考えてしまうけど、ネカフェに行くと適度に出かけた感も得られて精神衛生上も良い。

勉強は孤独な作業なので、その分外に出かけたりとか人と会話したりする機会を意識して作ると良いのだと思う。

ExpressでSocket.io使うとき

そもそもSocket.ioの公式サイトにも書いてあるんだけど何回やっても覚えられないので自分への戒めとして書いておく。

ExpressでSocket.io使うとき

var express = require('express');
var app = express();
var http = require('http').Server(app);

app.get('/', () => {
    // do something.
});

var port = process.env.PORT || 3000;
http.listen(port, () => { // app.listen(port, ...) じゃない!
    console.log('Listening port' + port + '...');
});

参考

プログラマーになって良かったことと悪かったこと

二年くらい前からプログラマーになった。

始めたのは31歳の頃からだ。それまでの職歴はプログラミングと全く関係ないものだった上に、プログラミングの経験は皆無だったので年食ってからプログラミングを始めたわけだが、多分自分にはこの仕事は合っているみたいでプログラミングが辛いとか思ったことは無いというかむしろ楽しい。カネ貰って楽しいことができるのだからプログラマーとはなんていい仕事なんだ、と今は思う(SIの人たちみたいにエクセルの質疑応答表作ったり上流工程から下ってくる謎の仕様と戦ったりするのはもちろん辛い)。

とはいえプログラミングの仕事は良いことばかりというわけでもない。最近プログラマーという仕事の良い点ばかりではなくデメリット的なことも感じ始めてきたので、良かったことと悪かったことをそれぞれ書いておきたいと思う。

プログラマーになって良かったこと

プログラミングが楽しい。つまり仕事が楽しい

これはまず第一にあげられる。仕事は人間が起きてる時間の大半を費やすわけで、それが楽しい時間であるに越したことはない。仕事が楽しいと単純に得してるなと思う。

プログラミングが楽しい。新しい趣味が増えた

31年も生きてきてプログラミングがこんなに楽しいものだとは知らなかったので新しい趣味が増えて得した気分だ。

手に職がついた感じがする

これまでは割りと一般的なというか事務的なこともやれば営業的なことも多少しつつ事務所のインターネット回りの世話を(素人知識で)少しするというような中小企業の若手サラリーマンが典型的に押し付けられそうな仕事をしてきただけだったので、30をすぎると応募できそうな求人とかすげー少なくて将来どうなるんだろうとか手に職があったら良いなとか思っていた。
社会福祉士の資格をとってフリースクールの先生になろうかななどと考えていたこともあったが、思わぬところで手に職がついた感じする。JavaPHPPostgreSQLJavaScript、Node.js、.NET、C#Objective-C、Swift、AndroidVimなどを経験したので多分世の中のプログラマーの求人票にはそこそこ応募できるようにはなったと思う(もちろん年食ってるのでハネられるというのはある)。

人と喋らなくていい

地味に良い。特に自分のようにお世辞とか挨拶的な会話とか営業トーク的なのがうまくない人間にはよい。たまに打ち合わせとかするときも論理的な話をすればいいので無理して会話しないといけない感じがない。

プログラマーになって悪かったこと

疲れる

これは本当に疲れる。ずーっと頭使ってるので会社から帰ってくるとyoutubeをみるくらいしかすることのない人間になってしまう。今みたいに頭しか使わない仕事というのはやったことなかったので頭脳労働と言うか専門的な技術職の大変さが少しわかった。それまでの仕事では仕事帰りに遊んで帰ったりとかは割りと平気だった。今は頭がぼーっとしてきついことがある。

腰と肩が痛くなる

これに関しては姿勢の問題とか使ってるハードウェアの問題とかもあるんだろうけど、当然座ってばっかで一日中パソコンの画面見てるわけだから腰にも肩にも悪いわな。という感じ。忙しいときに一日あたりの残業が2時間を超えてくると結構辛くなる。まあそんなに残業することめったに無いけど。

創作活動できなくなる

なんでかというと、プログラミングそのものが創作活動なので創作欲がそっちで満たされてしまうから。自分はどっちかというと音楽作ったり小説書いたりブログ書いたりして結構創作する人だったんだけどプログラミングが仕事になってからはさっぱりそれらをやらなくなった。なんか、それらをするためのエネルギーというか衝動みたいなものが沸き起こらなくなってしまった。これは結構真剣に悩んでいる。

人と喋らないので精神的におかしくなる(ことがある)

人と喋らないというのは良い点でもあるのだけど、あまりに会話が少ないと情緒に悪影響を及ぼすみたいだ。特に俺のように独身一人暮らしだと。職場に自分と同年齢くらいで同スキルくらいの同僚がいればこの点は悩みに思わないのかもしれない。自分の場合は自分と近い立場の人が会社に一人もいないので、日常的に会話する相手がいない。

まとめ

プログラミングの話ができる友達が欲しい。

AndroidのWebViewでindexedDBを使っててUncaught SecurityErrorが出る時の対処法

AndroidでWebViewでindexedDBを使っていると

I/chromium: [INFO:CONSOLE(23)] “Uncaught SecurityError: Failed to execute ‘open’ on ‘IDBFactory’: access to the Indexed Database API is denied in this context.”, source: about:blank (23)

こういうエラーがでることがある。

何が原因か調べてもわからなかったけど、なんか怪しそうなのは

webView.loadDataWithBaseURL(null, index, "text/html", "UTF8", null);

最初の引数にnullが入ってるこれだろうとあたりをつけた。

これを

webView.loadDataWithBaseURL("http://localhost", index, "text/html", "UTF8", null);

こう書き換えたらうまくいった。

考えてみれば当たり前で、ドメイン名が無いとローカルに保存した時にファイル名がつけられないから保存もできないということなのだろう。

そう考えるとlocalhostというのは多分良くない名前なので、アプリ固有の名前とかを使うと良いのかもしれない。

webView.loadDataWithBaseURL("http://application.example.com", index, "text/html", "UTF8", null);

みたいな感じで。