"Simple" is "Best"

開発時に詰まったところや 調べた結果日本語での情報が無かったり古かったりした場合に自分用のメモとして高校生(?)が更新していくブログ

Debian9でJava開発

まっさらなDebian9にJDKをセットアップしたのでその記録

過去のメモを元にセットアップしてある

特に手順の変更点はない

インストールディスクは以下から拾ってきたものを使用

Index of /cdimage/unofficial/non-free/cd-including-firmware/9.3.0+nonfree/amd64/iso-dvd

インストール時のオプションはDesktop環境とGNOME以外はチェックを外してある

 

JDKのインストール

とりあえずJREが入っているか確認

$ java -version

 入っていないようであれば以下コマンドで入れる

$ sudo apt install openjdk-8-jre

続いて本題のJDKをインストールする

$ sudo apt install openjdk-8-jdk

以下コマンドで結果が帰ってくればインストールは完了

$ javac -version

完了したら次はパスを通す

 

JAVA_HOME

JavaのインストールといえばJAVA_HOME

それはWinであろうとMacであろうとLinuxであろうと変わらない(多分)

まずはどこにインストールされたかを調べる

$ which javac

私の環境ではこのように出た

/usr/bin/javac

これでホイホイとこのパスを通すと

後々わけがわからなくなる

la(ls -al)上記パスを確認する

$ la /usr/bin/javac 
lrwxrwxrwx 1 root 23 Jan 5 20:21 /usr/bin/javac -> /etc/alternatives/javac*

どうやら先があるようだ

再びla

$ la /etc/alternatives/javac
lrwxrwxrwx 1 root 43 Jan 5 20:21 /etc/alternatives/javac -> /usr/lib/jvm/java-8-openjdk-amd64/bin/javac*

いい感じのパスが見えてきた

一応念の為確認

$ la /usr/lib/jvm/java-8-openjdk-amd64/bin/javac 
-rwxr-xr-x 1 root 6488 Nov 1 23:17 /usr/lib/jvm/java-8-openjdk-amd64/bin/javac*

うむ、見つけた

あとはこいつをJAVA_HOMEにぶち込んでやる

.zshrcは割愛

 

IDEがほしい

やっぱりIDEがないと開発は捗らない(私の場合は)

一番オススメはIntelliJ IDEA

Win/Mac/Linux全てに対応しており、恐るべき補完能力を持っている

一度その補完の強さに慣れてしまうと、他のIDEを使うことができない

ということでDL

DLページの右側にある「Community版」を入れる(無料)

落としてきたらtar.gzなので解凍

$ tar -zxvf ideaIC-2017.3.2.tar.gz

さて、解凍したブツをどこへ放り投げるか

ホームディレクトリ直下でもよいのだろうが

今回は/usr/localに入れる

AndroidStudioのチュートリアル

解凍後にそこへ突っ込め、と書いてあったので真似をしてみる

$ sudo mv ./idea-IC-173.4127.27 /usr/local/

続いてエイリアスの設定

別にしなくてもよいのだろうが

ターミナルから立ち上げやすくなるので

私はいつもしている

設定するのは以下

alias intellij='/usr/local/idea-IC-173.4127.27/bin/idea.sh &' 

最後につけている&がミソ

こいつがあると、実行中でもそのターミナルでもコマンドが打てる

では実行

$ intellij

あとはよしなしにカスタマイズしていく

 突っ込むべきところが少ないので

とりあえずスクショを貼っておく

 

Themeの設定

f:id:bigbuddha:20180105231157p:plain

 

ショートカットの有無

作るようであれば正直さっきのエイリアスは無意味かも・・・

f:id:bigbuddha:20180105231238p:plain

 

Toolの設定

AndroidはAndroidStudioを使うので不要

VCSはGitとGithubのみ(それ以外使わない)

Pluginを作るつもりはないので除外

f:id:bigbuddha:20180105231344p:plain

 

Pluginをどうするか

Vimは心惹かれるがそこまでVimerではないのでパス

Scala?知らんな

f:id:bigbuddha:20180105231725p:plain

 

無事インストールが完了すると以下の画面が現れる

f:id:bigbuddha:20180105231844p:plain

 

試しに一つProjectを作ってみる

上の「Project SDK」がさっき通したパスになっているか確認

他にもあるので、間違えないように

f:id:bigbuddha:20180105231924p:plain

f:id:bigbuddha:20180105232124p:plain

変えるのを忘れていたが、Package名はちゃんと自分のにしよう

f:id:bigbuddha:20180105232135p:plain

無事完了

f:id:bigbuddha:20180105232256p:plain

 

なんとなくHello World

f:id:bigbuddha:20180105232533p:plain

 

以上

 

もしもっと良い方法があったり、疑問などがあれば

ぜひ連絡ください

aptでUpdateが出来ないときの対処法 on Debian(NO_PUBKEY編)

何かしらソフトウェアを追加するときって

/etc/apt/sources.listとかそこら辺に

リポジトリを追加するわけですが

たまにこんな感じで怒られます


W: GPG error: http://ftp.ne.jp/Linux/packages/kali/kali kali-rolling InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ED444FF07D8D0BF6

公開鍵が認証されてないぜっていう話

意外と詰まったんでメモ

 

 

詰まったとは言ったものの、やることは一つ

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ED444FF07D8D0BF6 

ED44(ryはエラー文のPUBKEYの部分

Debianやのに何故にUbuntuと思うが、まぁ無視

結果↓

Executing: /tmp/apt-key-gpghome.jTwMIcjd5a/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys ED444FF07D8D0BF6
gpg: key ED444FF07D8D0BF6: 126 signatures not checked due to missing keys
gpg: key ED444FF07D8D0BF6: public key "Kali Linux Repository <devel@kali.org>" imported
gpg: Total number processed: 1
gpg:               imported: 1

これでapt updateすると

無事Updateされる

 

初対面の人にURLを知らせるのに苦労するよねっていう話

この記事は以下のカレンダーの24日目の記事です

qiita.com

背景

飛び入りだったり初回だったりのイベント参加などで

自分のブログやGithubのURLを渡すのに苦労しますよね

なんとかならないかな~と思ったら予想外にクソなものができたので

ご紹介しようと思います

 

ShareQR

命名スキルなんて皆無です

その名の通りその場でQRコードを生成します

共有から選べるようにしてあるので

わざわざコピペする必要はありません(ここだけまともに考えた)

ライブラリは以下を利用しました

github.com

スクリーンショット

インストールすると、共有するアプリに登場する

(注:アイコン未作成時)

f:id:bigbuddha:20171223225244j:plain

 

選択をしてやるとそのURLのQRコードを生成する

画面の通り、コピペで生成することもできるので

ただの文字列をQRコードにすることもできる

クリスマスの告白などに(ry

f:id:bigbuddha:20171223225234j:plain

 

画面サイズの小さい方を1辺とした正方形のQRコードを生成する

これでタブレット端末であろうと関係ない

画面を回転させるとQRコードのサイズも変わるというスグレモノ

f:id:bigbuddha:20171223225240j:plain

 

ソースコード及び配布

ソースコードはMITライセンスです

github.com

 

DeployGateで配布しているのでぜひご活用ください

dply.me

一応暇ができたら色々手直しをするつもりはありますので

リアクションをいただけたらと思います

Flutterをいじってみよう

この記事は以下のカレンダーの19日目の記事です

qiita.com

 

 去年は受験があったんで今回が初アドカレです

温かい目で見守ってください

 

ちょっと前にGoogle DevFest Kyoto 2017に参加しまして

その時にこのFlutterというものに出会いました

いつかDevFestでやったハンズオンのまとめを書きたいな~と思っていたら

ちょうどアドカレの季節だったんで勢いで記事にしました

今回は触りだけやってみます

公式サイトは以下

Easy and fast SDK for beautiful apps - Flutter

わからなくなったら公式を読みましょう

 

最近プログラミング界隈に入ってきたって言う人にはちょっと濃いかも

 

Flutter(+Dart)ってなんぞや?

FlutterというものはGoogleさんが作成しましたFrameworkです

Dartと呼ばれる言語(これもGoogle製)を用いて

AndroidiOSの両方のアプリを一つのコードで作成します

Dartについて気になる方はぜひGoogle大先生に聞いてください

Javaやってる方にとってはあまり苦なく書けると思いますし

多少OOPを触っている方ならコードを見ればすぐに理解できます

 

とりあえず環境構築

今回はAndroidStudio 3.0.1 on Win10な環境でやっていきます

事前にGit for Windowsを入れといてください

 

まずFlutterをGitHubからCloneしてきます

git clone -b alpha https://github.com/flutter/flutter

ブラランチ名から察せる通りまだAlpha版です

これからどう進化していくか楽しみですね

 

次にCloneしたやつのパスを通します

パスが通せたらコマンドプロンプトだかPowerShellだかで

flutter

と打つとなんかやってくれます

以下はPowerShellでやった結果

f:id:bigbuddha:20171218230450p:plain

f:id:bigbuddha:20171218230455p:plain

 

続いて以下のコマンドで開発環境が整っているか確認します

flutter doctor

f:id:bigbuddha:20171218230501p:plain

ちゃんとAndroidStudioが認識されてますね

IntelliJのほうでプラグインが入ってね~ぞと言われていますので

言われた通り導入します

しかし、今回我々が利用するのはAndroidStudioなので

AndroidStudioにプラグインをインストールします

皆さん御存知の通りAndroidStudioはGoogleIntelliJ魔改造して

世に送り出している代物ですので

当然IntelliJ用のプラグインがインストールできます

 

最初にDart用のPluginをインストールしまして

続いてFlutter用のPluginをインストールします

検索しても出てこねぇって人はしたの方にある

「Browse Repositories」ってところをクリックして検索すると出てきます

f:id:bigbuddha:20171218231329p:plain

 

これで無事開発環境が出来上がりました

一度AndroidStudioを再起動させて

ホーム画面を見るとこんな感じになってます

f:id:bigbuddha:20171218231818p:plain

なんとFlutter用の新規ボタンができるんですね~

公式サイトより

> Android Studio, version 3.0 or later.

とのことなんでversion 3からFlutterが公式対応してます

 

みんな大好きHelloWorld

ではプログラマの母であるHelloWorldアプリを作ってみましょう

「Start a new Flutter project」から

適当にWizardに答えていくと無事プロジェクトが作成されます

f:id:bigbuddha:20171218232145p:plain

この状態で「Run」してみましょう

カウンターアプリが立ち上がります

とりあえずはこのコードを読んで雰囲気を掴んでみましょう

レイアウトはこう書くんだな~とか

StatefulってのとStatelessってのがあるんだな~とか

他にも沢山の有益な情報が得られるでしょう

文字列の部分は恐れずにバンバン変えていただいて

どの命令がどんな役割をしているかを感じ取ってください

 

感じきったところでコードを超シンプルにします

以下のコードを

import 'package:flutter/material.dart';

void main() {
  runApp(
    new Center(
      child: new Text(
        'Hello, world!',
        textDirection: TextDirection.ltr,
      ),
    ),
  );
}

実行すると割とオサレなHelloWorldが(左上のメーターは無関係)

f:id:bigbuddha:20171219202410j:plain

無事HelloWorldができたので、なんか一個アプリを作ってみましょう

 

カウンターをRemakeする

新規プロジェクトで表示されるサンプルコード的な何かはカウンターでした

あれを一から順番に作っていきます

以下のページを参考にしています

Building Beautiful UIs with Flutter

A Tour of the Flutter Widget Framework - Flutter

公式はやっぱり最強

 

AppBarを作る

基本的にFlutterは自分でWidget(泥で言うViewぽいもの)を作って

それを画面にポンポンのせるって感じでやっていきます

とりあえず標準のものを使ってぽいものを作ってみる

以下main.dart


import 'package:flutter/material.dart';

void main() {
  runApp(
    new MaterialApp(
      title: "Counter",
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text("Counter"),
        ),
      ),
    ),
  );
}

 結果がこちら

f:id:bigbuddha:20171219204655j:plain

大体どうしていけばいいか想像がついてきますね

ScaffoldとAppBarをそれぞれ継承したクラスを作成します

 

MyAppBar.dart

import 'package:flutter/material.dart';
import 'package:hello_world/MyAppBar.dart';

class MyScaffold extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    // Material is a conceptual piece of paper on which the UI appears.
    return new Material(
      // Column is a vertical, linear layout.
      child: new Column(
        children: &lt;Widget&gt;[
          new MyAppBar(
            title: new Text(
              'Counter',
              style: Theme.of(context).primaryTextTheme.title,
            ),
          ),
          new Expanded(
            child: new Center(
              child: new Text('Hello, world!'),
            ),
          ),
        ],
      ),
    );
  }

}

 

MyScaffold.dart

import 'package:flutter/material.dart';
import 'package:hello_world/MyAppBar.dart';

class MyScaffold extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    // Material is a conceptual piece of paper on which the UI appears.
    return new Material(
      // Column is a vertical, linear layout.
      child: new Column(
        children: <widget>[
          new MyAppBar(
            title: new Text(
              'Counter',
              style: Theme.of(context).primaryTextTheme.title,
            ),
          ),
          new Expanded(
            child: new Center(
              child: new Text('Hello, world!'),
            ),
          ),
        ],
      ),
    );
  }

}

そしてmain.dartを以下のように書き換える

import 'package:flutter/material.dart';
import 'package:hello_world/MyScaffold.dart';

void main() {
  runApp(
      new MaterialApp(
          title: "Counter",
          home: new MyScaffold()
      ),
  );
}

 実行すると大体予想通りのものが出来上がる

f:id:bigbuddha:20171219211431j:plain

 

StatelessとStateful

MyAppBarクラスを見るとStatelessWidgetというクラスを継承しているのがわかる

WidgetにはStatelessWidgetとStatefulWidgetの2種類がある

単語の通り、StatelessWidgetはState(状態)の変更がない所謂静的なWidget

StatefulWidgetは動的なWidgetを作る時に継承する

Appbarは当然静的なわけだからStatelessWidgetを継承している

StatefulWidgetは例えば「チャットアプリのメッセージを表示するところ」などがあげられる

今回の場合、カウントしている数字の部分は変動するのでStatefulWidgetを継承したものを使う

 

本体部分

ここから一気に書き上げる

各コードの説明は特にしない

(読むだけでだいたい分かるから)

変数またはクラス名の前に_がついていたら

それはPrivateなものということになります

CounterScreen.dart

import 'package:flutter/material.dart';

class CounterScreen extends StatefulWidget {

  @override
  State&lt;StatefulWidget&gt; createState() =&gt; new _CounterState();
}

class _CounterState extends State&lt;CounterScreen&gt; {

  int _count = 0;

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Container(
      margin: const EdgeInsets.symmetric(horizontal: 8.0),
        child: new Center(
          child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: &lt;Widget&gt;[
            new IconButton(
                onPressed: _increment,
                icon: new Icon(Icons.exposure_plus_1)
            ),
            new Text('$_count'),
            new IconButton(
                onPressed: _decrement,
                icon: new Icon(Icons.exposure_neg_1)
            ),
          ],
        ),
      )
    );
  }

  void _increment() =&gt; setState( () { _count++;} );
  void _decrement() =&gt; setState( () { _count--;} );
}

 結果が以下

f:id:bigbuddha:20171219224235g:plain

 

以上で超雑なFlutterのお触り説明を終わります

しょうもない記事でしたが

もし意見などありましたらどんどんコメントください

(ここはこう書くべきだろとかいう訂正コメント待ってます)

 

マシュマロな「arrows SV F-03H」でSDカードを内部ストレージ化した話

事の発端

とある友人から「最近スマホの空き容量がなくて困っている」という相談を受けた

SDカードを買ってぶっ刺せば?と聞いたら

容量を食っているのはアプリの方だという

幸いAndroid Marshmallowだったので、SDカードを内部ストレージ化しちゃおう

という話になった

 

環境

友人が持っているスマホはタイトルの通り「arrows SV F-03H」

SDカードは以下のものを使用した

www.amazon.co.jp

問題発生

SDカードも無事手に入り、あとは刺してちょちょっとしたら解決、、、

と思っていたが現実はそうではなかった

どうやら製作元の富士通が色々細工をしているらしく

内部ストレージ化ができない模様

これでは困ったということで、なんとか方法を探してみると

以下のサイトを発見

inoccu.com機種は違えど、製作元は同じ富士通

もしかしたらと思い、上の記事に書いてあるとおりにやってみた

 

実際にやってみる

色々時間が無かったのと他人のスマホだったので、スクショの類は一切なし

まずADBで接続する

adb devices
adb shell

接続ができたらSDカードがしっかりと認識されているかを確認

sm list-disks 
disk:179,64

これでDISK-IDがわかる

今回の練習として、別端末の同手順で確認したら同じIDだった

恐らく初期値がそうなのであろう

では、内部ストレージ化をいたしましょう

>sm partition disk:179,64 private

 

これで、SDカード全てが内部ストレージとなる

もし、一部を内部ストレージ他を外部にするなら

>sm partition disk:179,64 mixed 40

こうする

これだと40%が外部、残り60%が内部となる

もし、内部ストレージとしての役を解き普通のSDカードにする場合は

>sm partition disk:179,64 public

これで晴れてSDカードとなる

内部ストレージ化しているSDカードは暗号化がされており

別端末(パソコン含む)では読み込むことができない

また、内部ストレージ化したSDカードにアプリをインストールし

何もせずにSDカードを抜くと当然アプリは起動しない

刺し直せば普通に起動するらしいが、そもそも内部ストレージ化したのだったら

抜かないのが一番

しかしアクシンデント

無事内部ストレージ化もでき、いざ移動してやろうとすると

「十分な空き容量がありません」

なんて言われる

ついさっきフォーマット(?)したわけなのだからそんなはずはない

10分ほど悩んだ挙句解決

そもそも、もとからあった内部ストレージがいっぱい過ぎた

最初からそうせいって感じだが、不要アプリをひたすらアンインストール

初期から入っているものがそのまんまなので、消せるものは全て消去or無効化

これで再度移動を試みると・・・

出来た

 

とりあえずということで、「B612」を移動させてみた

無事移動でき、起動もした

本人曰く、「前と何ら変わりない動作」だそうだ

SDカードにすることによって、実行速度が遅くなるのではないか

という心配があったのだが、それも解消

 

では、本命のデレステを移動させようとすると

なんとここでアクシデント

移動中にいきなり画面がもとに戻った

確認すると元の内部ストレージにあるので、再び移動

すると、何故かいきなり再起動をするスマホ

起動してすぐに

「システム」が反応しない

という旨の通知が

 

これは何やらまずい匂いがすると冷汗をかきながら確認

不思議なことに、ラブライブは元の内部ストレージに戻っていた

その後、テストプレイをしてもらったら楽曲データが吹っ飛んでいたらしいが

無事にプレイすることが出来た

ホッとしたのも束の間、「B612」が起動しない・・・

再起動後にアイコンが変わっており、見た瞬間に

「あ、これは死んだな」と察した

どうやらB612で撮った画像は残っていたらしいので一安心

 

今後どうするかは友人と相談する

もし、リベンジすることがあれば再び記事にしようと思う

あんまり深いところを弄るもんではないな(他人のならなおさら)

AndroidのThemeを無理矢理動的に変更したよっていう話

TwitterのアプリだとNight Modeっていう機能がついてる

暗いところでは目に優しくないから、色を落ち着かせようっていうもの

黒系が好きな私にとっては、是非とも自作アプリに組み込みたい

この場合、Themeを動的に切り替えるのが一番しっくり来るので実装してみると

つまずいてしまったのでメモ

 

こちらを参考にさせてもらった

stackoverflow.com

簡単にまとめると

Themeを変更した後にAvtivityを再描画させようぜ

と、いう話

 

1. styles.xmlを書き換える

今回は

「三種類のThemeをボタンをおすことによって切り替わる」

という感じで作っていく

てことで三種類のThemeを定義していく

res/valuse/styles.xml


    <resources>

    <!--First Theme-->
    <style name="FirstTheme" parent="Theme.AppCompat.Light.DarkActionBar"></style>

    <!--Second Theme-->
    <style name="SecondTheme" parent="Theme.AppCompat.DayNight.NoActionBar"></style>

    <!--Third Theme-->
    <style name="ThirdTheme" parent="Theme.AppCompat.DayNight.DarkActionBar"></style>

</resources>

色をわざわざ上書きするのも面倒くさいので、何も触らない

これならいちいち書く必要もないかもしれないが、名前がわかりやすくなるので

 

次がかなりの確率で忘れるのだが、しっかりAndroidManifest.xmlも変える

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="kyoto.test.freeprojects.oldbigbuddha.changetheme">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/FirstTheme">  ←ここ
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 最初これを書き換えなかったためにビルドが通らなかった

 

2. レイアウトをちゃちゃっと書く

テストで作っているはずなのに無駄にレイアウトに凝ってしまうあるあるがあるので

そこら辺は程々に(と言いつつ長い)

とりあえずボタンが3つあればいい

layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="24dp"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:text="@string/app_name"
        android:textSize="32sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="16dp"/>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <Button
            android:id="@+id/bt_first"
            android:text="First Theme"
            android:textAllCaps="false"
            android:textSize="24sp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginTop="16dp"
            android:layout_marginBottom="16dp"/>
        <Button
            android:id="@+id/bt_second"
            android:text="Second Theme"
            android:textAllCaps="false"
            android:textSize="24sp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginTop="16dp"
            android:layout_marginBottom="16dp"/>
        <Button
            android:id="@+id/bt_third"
            android:text="Third Theme"
            android:textAllCaps="false"
            android:textSize="24sp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginTop="16dp"
            android:layout_marginBottom="16dp"/>

    </LinearLayout>

    </LinearLayout>

特別なにかっていうものはない

今回の件とは関係ないが、

  1. IDはスネークケースで書く
  2. Padding・Marginは面倒臭がらずそれぞれ書く
  3. Left・Rightではなく、Start・Endで書く

というところを気をつけて書くと幸せになれるかもしれない

 

3. では、コードを書こう

今回重要になってくるのはsetTheme()

こいつにソースIDをぶち込んでやるとそのThemeを適用してくれる

ただ呼び出す場所が厄介で、setContentView()の前に書かないといけない

それでは動的に変更できないではないか

そんな気がするが、Activityを再描画させれば大丈夫

そのコードがこちら

finish();
startActivity( new Intent( this, MainActivity.class ));

最初このコードを見た時に動くのかと心配したが、普通に動いた

 

一回finish()を呼んでしまってるわけだから

シェアプリで一回選択したThemeを保存する

R.style.~~の形で取ってきているから、実態はint型のデータ

よって以下の形になる

mEditor = getSharedPreferences("themeData", MODE_PRIVATE).edit;
mEditor.putInt("theme", R.style.~~);
mEditor.commit();  // 注意

最初、mEditor.apply()と書いてうまくいかなかった

これはapply()が非同期で書き込んでいることが原因である

 

下にコードを載せるので見てほしいが

すぐ下にfinish()が書いてある

なので書き込んでしまう前に破棄されている模様

ちゃんとcommit()にする

 

あと紹介してないのは基本的なところだけなので

コードを貼って終了とする

MainActivity.java


package kyoto.test.freeprojects.oldbigbuddha.changetheme;

import android.app.AlertDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button mBtFirst, mBtSecond, mBtThird;

    private SharedPreferences mPreferences;
    private SharedPreferences.Editor mEditor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPreferences = getSharedPreferences("themeData", MODE_PRIVATE);
        setTheme( mPreferences.getInt("theme", R.style.FirstTheme) );
        setContentView(R.layout.activity_main);

        mBtFirst  = (Button)findViewById(R.id.bt_first);
        mBtSecond = (Button)findViewById(R.id.bt_second);
        mBtThird  = (Button)findViewById(R.id.bt_third);

        mBtFirst.setOnClickListener(this);
        mBtSecond.setOnClickListener(this);
        mBtThird.setOnClickListener(this);

        mEditor = mPreferences.edit();
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.bt_first: {
                mEditor.putInt("theme", R.style.FirstTheme);
                break;
            }
            case R.id.bt_second: {
                mEditor.putInt("theme", R.style.SecondTheme);
                break;
            }
            case R.id.bt_third: {
                mEditor.putInt("theme", R.style.ThirdTheme);
                break;
            }
        }
        mEditor.commit();
        finish();
        startActivity( new Intent( this, MainActivity.class ));
    }
}

Demo

f:id:bigbuddha:20170809193530g:plain

 

SecondとThirdの見分けが少々難しい

上にバーがあるかないかで判断して欲しい

以下にGithubリポジトリを貼っておく

github.com

Debian9(Stretch)を入れた後すぐにやったこと

今日(2017/08/05)、OSCに行ってきた

そこで「Debian Updates」という発表があり

そこで最後に、プレゼントとしてDebianのInstallDiscを頂いた

最近Debianに移行したのだが、無線系のドライバが上手く入ってなかったり

その他色々ミスがあったので、今回を気に入れ直した

最近様々なデストリビューションを入れて遊んでたときに

最初にやることが大体決まってきたのでメモ

Debianは既に起動している状態を前提とする

デスクトップ環境はGNONE、なるべく最小環境でInstallした

言語設定は英語にしてある

 

1.とりあえずZsh/Git/Vimを入れる

私の入れ方が悪いのか、Install時に設定したアカウントで最初からsudoが使えない

これは困るので、visudoで設定したいのだが

それを設定するために上記の3つを入れる

$ su -
# apt install vim zsh git
# chsh -s /bin/zsh

これがないと始まらない

まずは自分のリポからお手製のDotfilesを引っ張ってくる

ついでにログインシェルをzshにしておく

# exit
$ git clone ~自分のリポURL~
$ ln -s ./dotfiles/.zshrc .zshrc
$ ln -s ./dotfiles/.vimrc .vimrc
$ chsh -s /bin/zsh
$ exit

シンボリックリンクを使って引っ張ってくる

ターミナルを起動したあとに更新を忘れずに

$ source .zshrc

これで最低限の環境は揃った

やっぱり慣れた環境が一番落ち着く

f:id:bigbuddha:20170805212056p:plain

アカウント名はDeveloperで登録してある(今更感)

 

2.sudoを使えるようにする

なんかググると色々出てきて戸惑ったが

visudoでやった結果がしっかり使えるようになった

$ su -
# visudo

Vimが起動したのでちょちょっと以下のように編集する

f:id:bigbuddha:20170805213136p:plain

developer(自分のアカウント名)の部分を書き足す

これでsudoが使えるようになる

# apt update

これでパスワードを入れて動いたら成功

これでわざわざrootに入らずに色々入れることができる

 

3.日本語入力環境を整える

ただ開発するだけなら英数字記号を入れるだけでいいかもしれないが

ブログを書いたりSNSをしたりもするのでやはり日本語入力は外せない

私はfcitx-mozcをよく使うので今回も入れる

# sudo apt install fcitx-mozc

これで入る

検索欄でimと入れるとInput Methodというのが出てくるので

fcitxを選択

その後、Fcitx-Configurationを起動して、Mozcを追加する

f:id:bigbuddha:20170805214538p:plain

Mozcを一番上にすると起動時から日本語入力になって何かと不便

続いてMozc Setupを起動して自分好みにセットアップ

f:id:bigbuddha:20170805214741p:plain

ここまで来たら一度ログアウトをして、再ログイン

日本語入力ができたら成功

f:id:bigbuddha:20170805214911p:plain

ここまで来たらあとは煮るなり焼くなり好きにする

Tweek Toolを弄ると更に自分の環境が出来上がる

 

私はAndroid開発が主でなので

この後OpenJDKを入れてAndroidStudioを入れる

これはまた別途書後と思うので、今回はここまで

しばらく快適なDebianライフを過ごせそうだ