サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
今年の「かわいい」
daichan4649.hatenablog.jp
実はこのイベントを見つけたとき、「自分は行く気まんまんなのだけど、福岡で LINE Bot に反応する人どのくらいいるのだろうか」と考えていた。去年の LINE BOT AWARDS が終わってからネット上でもあまり話題にあがってない気がしてたし。(すんません) line.connpass.com 実際参加してみると・・なんと 90名弱。いままでこのジャンルに興味ある人にあまり出会わなかったので正直嬉しかった。完全に開発モチベ復活。参加してよかった。 というわけで、登壇者や参加者の方々との会話の中で自分に刺さったこと、気になったことを箇条書きしてみる。 大事なこと ユーザが Bot について何もわからなくても使えること 「何をしていいかわからない」はNG 直感的に使えることが理想 Webの劣化版を作ってはいけない 人が対面で行っている部分 Webがやれていない部分 ただの検索クライアントな
Googleカレンダーにイベントを一括登録したい事案が発生したので調べた。GAS で Calendar は予想以上にお手軽だった。 このデータ達がー こうなる。 手順 データ登録(spreadsheet) date: イベントの日程 title: イベントのタイトル description: イベントの詳細 calendar 出力先のカレンダーの カレンダーID をメモる gas spreadsheet のスクリプトエディタに以下の script を貼り付け 定義部分(spreadsheet の URL とか)を修正 spreadsheet 「メニュー>管理者用>カレンダーへ登録」を実行 コード(gas) 課題 スクリプトを複数回実行すると、同じイベントが複数登録されてしまう(同一イベントなら更新したい) カレンダーに一度に登録できるイベント数が上限が50くらい 解決。 stackover
Android アプリに限らず、JSON データを表示するようなアプリって作ること多いですよね。で、自分はその時いつもサーバサイド作るのがめんどくさくなっちゃう。なので、spreadsheet のデータをそのまま JSON として返すようなサーバーサイドアプリを GAS(Google Apps Script) で書いてみました。いまさら何言ってんだ、いつのネタだよという感じだけど、がしがし開発するときにこういうのあるとやっぱり便利だった。 目的 こんな感じで spreadsheet に定義したデータが JSON で一括で欲しい。 やること spreadsheet 作成 1行目は タイトル行(JSON のキーに該当) 2行目以降は データ行 spreadsheet のスクリプトエディタに以下の gas を貼り付け gas 内に以下を自分の環境に合わせて修正 spreadsheet のURL
非同期処理を組んでると、 「別スレッド上でも Handler みたいなキュー管理がしたい」 って時があったりしますよねー。(きっと) そんなとき、HandlerThread を使うとわりと簡単に実装できたりする。 HandlerThread(公式) HandlerThread は java.lang.Thread を継承したクラスで、 android標準の Handler と組み合わせて使うための仕組みが入ってたり。 具体的な使い方。 まずは Handler(defaultコンストラクタ) を使う場合。 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Handler handler =
DialogFragment を private なインナークラスで定義してたら、 画面の回転(Activity再生成) でアプリが落ちてしまった。 出力された例外はこれ。 Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment ErrorCaseDialogFragment: make sure class name exists, is public, and has an empty constructor that is public Fragment が private なインナークラスなので、 外部からコンストラクタ呼び出せなくて例外になった様子。 使用したコードはこんなかんじ。 ErrorCaseDialogFragment のクラス定義を private s
Android Advent Calendar 2012 12/18(裏) 担当の @daichan4649 です。 よろしくお願いします。 経緯 Android Design のサイト、ありますよね。Android公式から提示されてるガイドライン。アプリはこう作ってねとか、画面遷移はこういう風に、とか、アイコンはこういうサイズで、とか。しかし、コード例へのリンクがない。理想のパターンを定義するなら一緒にコードも公開してくれたらいいのに。 なんて思いから 「自分ならこう実装する」 というのをやってみました。実際にはどう実装するのがベストプラクティスなのかわからないので、コード晒すのでみなさまぼこぼこにしてください。 #ドM Multi-pane Layouts Android Design にはいろんなパターンが書いてありますが、まずは Patterns の中から Multi-pane L
お題 画面回転させて、縦/横で別のレイアウトを表示する 縦画面のときは ListView を表示 横画面のときは GridView を表示(1行2列) ただし、一度取得したデータは使いまわしたい 縦画面 横画面 実装のポイント Activity コンフィグ変更のたびに毎回 再生成 Fragment Fragment#setRetainInstance(true) を設定し、Activity 再生成時に Fragment は再生成されないようにする(Fragment#onCreate/onDestroy を抑止) Activity 再生成のたびに走る Fragment#onCreateView でレイアウト再読込させる データ取得 一度だけ(今回の例では一度だけ呼び出される Fragment#onCreate 内で) レイアウト res/layout, res/layout-land に 縦
GoogleI/O 2012 のセッションで LruCache の話が出てたので使ってみた。 Doing More With Less: Being a Good Android Citizen pdf(右側の 「Session presentation」 リンク) の p.8 くらいから。 LruCache(android.util.LruCache) Least Recently Used アルゴリズム(wiki) を用いたキャッシュ管理クラス 中身は LinkedHashMap インスタンス生成時に保持キャッシュサイズの最大値を指定 要素がputされたときに↑を超えていたら既存要素を自動的に破棄 API Level 12 support library(v4) にもあるから APILevel が ↑以下でも使える 使い方は基本的にこんなかんじ。 実装方法 LruCache の拡張クラ
ネットワークからデータ取得(画像とか) データ取得完了したら画面にデータ反映 こういうパターンってよくありますよね。このときに画面回転等のコンフィグ変更(縦横切替とか)が行われると 「Activity のインスタンスが破棄->再生成」 されるので、何も考えてないと保存データも一緒に破棄されてしまいます。なので、内部に保存しているデータを 「保存/復元」 する必要があります。 自分、コンフィグ変更で Activity再生成 とかされると正直めんどくさいので、基本的に "android:configChanges" の属性指定で Activity再生成抑止 して データの保存/復元 とか考えない方向でいいんじゃね。とか思ってたんです(すみません)。 でもよくよく調べてたら Activity再生成 を回避できないケース がありまして。例えば、「フォント切替」。 こいつは configChange
AsyncTask の挙動が Gingerbread と ICS で違う、という話を聞いて調べてみた。 複数AsyncTask実行=バックグラウンドで並行処理 と考えてると、実は並行処理になってなくて処理が遅い、ってこと。 結論を言うと、ソースをここだけ修正すればよさそう。 修正方法 AsyncTask#execute を AsyncTask#executeOnExecutor に変更する AsyncTask#executeOnExecutor の引数に AsyncTask.THREAD_POOL_EXECUTOR を指定する 1行で済みそうな修正。よかったw とはいえ気になったので、AsyncTask#execute の挙動の違いについてまとめてみる。 ↓はSDKのバージョンを変えて検証した結果。 検証結果 複数AsyncTask の AsyncTask#execute を実行した場合
前回 のエントリに引き続き、さらに ListView の高速スクローラまわりをカスタマイズしてみました。 (ついでにタイトル変更) 環境 2.3.3(API Level10) before after スクローラもいじったりましたw ここで疑問。 ICSではどうなるのだろうか。 とりあえずソースそのままで API Level だけ変えて実験。 環境 4.0(API Level14) before after ガイド(overlay)部分が3Dぽい感じに、スクローラは細身な感じに。 ソースはこちら。(前回エントリで使用した部分も合わせてます) https://gist.github.com/1384757
AlertDialog.Builder#show〜 でダイアログ表示した状態で、 画面の縦横切替 を行うと例外発生してアプリ終了してしまった。 ログを見るとこんなエラーログが出力されている。 XxxActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4053b7b0 that was originally added here リーク発生!! AndroidManifest.xml の 「android:configChanges」 属性をいじって 「Activityの再生成を行わないようにする」 が対応としては簡単なんだが、 これは根本的解決になっていないので却下。 ではどうしたものか、、というわけで調べてみると公式に記載発見。 Creating Dialogs ダイアログ表示
Android Advent Calendar 12/18 担当の @daichan4649 です。 豪華メンバーがものすごく有意義なネタを記載されている中で、 空気を無視して ListView について誰得なネタを書いてみるとします。 ListViewには項目が多い場合に 「高速スクローラ」 を表示する機能がありますよね。 このとき 「スクロール中に項目のどのあたりを表示しているか」 を示す、 ガイドみたいなヤツを表示することができたりもします。 高速スクローラ、ガイド表示の実装に必要なのはこの2つ。 AbsListView#setFastScrollEnabled(true) 1のListViewに設定するAdapterに SectionIndexer をimplementsする 1で高速スクローラを有効にし、 2でガイド表示内容を実装する、と。 実装してみると実際のイメージはこんなか
例えば、アプリ内のボトルネック調査するとき、 重そうな処理にアタリつけて処理時間測定しますよね。 ベタにやるとこんな感じ。 // 測定開始 long start = System.currentTimeMillis(); // 測定したい処理 // 測定終了 long end = System.currentTimeMillis(); Log.d(getClass().getName(), "measure: " + (end - start)); 何かないかなーと思って公式javadoc見てたら 便利そうなクラスを発見。 android.util.TimingLogger 使い方はざっくりこんな感じ。 コンストラクタ(測定開始) // 処理1 addSplit(処理1 の処理時間測定) // 処理2 addSplit(処理2 の処理時間測定) ・・・ dumpToLog(測定終了+ログ出
表題のような常駐serviceを作成しようとすると BroadcastReceiver が intent(ACTION_BOOT_COMPLETED) を受けたらそれを契機にservice起動する という仕組みが主流だと思う。(自分はこれしか知らない) こんなserviceをeclipseで修正/動作確認しようとすると、 eclipseでソース修正->build->apkファイル作成 apkファイルuninstall apkファイルinstall emulator再起動 と非常にめんどくさい。 emulatorの再起動は時間がかかるのでなるべく控えたい。。 こんなときにー! intentはコマンドラインでも投げれたりする。 たとえば、intent(ACTION_BOOT_COMPLETED)を投げる方法はこんなかんじ。 >adb shell #am broadcast -a android
Mapの初期化をするとき、いままでこんなかんじでstaticブロックでやってたり。 private static Map<String, String> map = new HashMap<String, String>(); static { map.put("key", "val"); } んで、今日こんな方法もあるよー、と id:yone098 に教えていただいた。 private static Map<String, String> map = new HashMap<String, String>() { { put("key", "val"); } }; 無名クラス初期化子を使うこの方法。こっちのほうがわかりやすい。 追記 「無名クラスじゃないよ!」という指摘をさっそく @hsmt からいただきまして。実行順番がよくわからなくなったので実験。 コンストラクタ インスタンス初期化
弊社初の自社サービスとして「LINE ミニアプリを利用したテイクアウトシステム」を作成、運用していたのですが・・・今年大人の事情でクローズしましたという話です。 記憶が風化する前に紆余曲折や LINE プラットフォームの感想についてまとめましたので、ミニアプリ開発を検討されてる方々の参考になれば幸いです。 要約 (ChatGPT) LINE公式アカウントでテイクアウト注文を可能にした システムは3つのアプリで構成 2020年7月にプロジェクト開始、2021年5月に実店舗での運用開始、2022年12月にミニアプリ版リリース、2023年8月にサービス終了 LINEプラットフォームは低い導入障壁と使いやすさが強みであり、複雑な業務システムにも応用可能と感じた どのようなサービスか? 今では普通になりましたが、店舗の LINE 公式アカウントに Uber Eats のようなテイクアウトシステ
このページを最初にブックマークしてみませんか?
『プログラマってこんなかんじ??』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く