「技術」カテゴリーアーカイブ

量子コンピュータってすげぇっていう話

お酒を飲みながらこの本を読んだのですが、改めて、量子コンピュータってすげぇなって思いました。

この本はKindle Unlimitedを利用していれば読み放題で読むことができます。

こちらでも量子コンピュータにも触れましたが、この本を読むと、さらに量子コンピュータについて理解することができます。

量子コンピュータの概念としては、こちらの記事で間違いないようです。

しかし、0と1を重ね合わした状態というのは、正確には、0でもあり、1でもある状態、ということみたいです。

これは、通常のコンピュータでは値は0か1というふうに定まっているけど、量子になると0と1が共存している状態。この値は確率で決められるため、参照するタイミングによって、0でもあり、1でもある状態を指します。

これを応用した量子コンピュータでは並列処理が得意になる。

(いや、この概念を理解するには量子とは何かについて理解しないとダメかもしれない。)

なぜ暗号の解読が困難か?

暗号化には素因数分解の計算が応用されているためらしい。

素因数分解を計算するには、いろいろな値で割って割りきれるかどうか、の計算を行わなくちゃいけない。

小さい数字なら簡単に解を求めることができますがこれが1万桁ぐらいになると、スーパーコンピュータでも数年以上もかかると言われています。

しかし、量子コンピュータなら、並列処理が得意なので、こういった計算も数時間で解くことができる(らしい)。

現在の暗号化技術にも、素因数分解の仕組みが利用されているため、量子コンピュータでは数時間で暗号を解読できる、と言われているためだそうです。

うん、まだまだわからないところはたくさんあるな。

量子→並列処理のところと暗号の仕組みだね。

自分ももっと勉強します。

しかし、そう考えると、物理は面白い。

【プログラミング】美人時計のようなもの(Android編)

Tech commitの挑戦状課題で「美人時計のようなもの」があったので、Androidアプリで作成しました。

http://taki-lab.site/meshitero/app_debug.apk

https://github.com/takishita2nd/meshitero_timer_android

コード解説

まずはマニフェストファイルから

  
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.meshitero">

    <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/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

<uses-permission android:name=”android.permission.INTERNET” />

この一行を書き足します。

これが無いと、AndroidアプリはWebアクセスできません。

package com.example.meshitero;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class DownloadTask extends AsyncTask<String, Void, Bitmap> {
    private Listener listener = null;

    @Override
    protected Bitmap doInBackground(String... param) {
        return downloadImage(param[0]);
    }

    @Override
    protected void onProgressUpdate(Void... progress) {

    }

    @Override
    protected void onPostExecute(Bitmap bmp) {
        if (listener != null) {
            listener.onSuccess(bmp);
        }
    }

    private Bitmap downloadImage(String address) {
        Bitmap bmp = null;

        HttpURLConnection urlConnection = null;

        try {
            URL url = new URL( address );

            // HttpURLConnection インスタンス生成
            urlConnection = (HttpURLConnection) url.openConnection();

            // タイムアウト設定
            urlConnection.setReadTimeout(10000);
            urlConnection.setConnectTimeout(20000);

            // リクエストメソッド
            urlConnection.setRequestMethod("GET");

            // リダイレクトを自動で許可しない設定
            urlConnection.setInstanceFollowRedirects(false);

            // ヘッダーの設定(複数設定可能)
            urlConnection.setRequestProperty("Accept-Language", "jp");

            // 接続
            urlConnection.connect();

            int resp = urlConnection.getResponseCode();

            switch (resp){
                case HttpURLConnection.HTTP_OK:
                    try(InputStream is = urlConnection.getInputStream()){
                        bmp = BitmapFactory.decodeStream(is);
                        is.close();
                    } catch(IOException e){
                        e.printStackTrace();
                    }
                    break;
                case HttpURLConnection.HTTP_UNAUTHORIZED:
                    break;
                default:
                    break;
            }
        } catch (Exception e) {
            Log.d("debug", "downloadImage error");
            e.printStackTrace();
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }

        return bmp;
    }

    void setListener(Listener listener) {
        this.listener = listener;
    }

    interface Listener {
        void onSuccess(Bitmap bmp);
    }
}

AndroidでWebアクセスするには、本体スレッドでは動かすことはできないので、非同期タスクをつかって、こちらで動かす必要があります。

AsyncTaskインターフェースを実装したクラスを新規に作成して、こちらに実際に画像をダウンロードする処理を作成します。

doInBackground()では、実際に行うタスク処理を書きます。ここでは実際に画像ファイルをダウンロードする処理を記載します。

onProgressUpdate()では、タスク状態が変わったときに実行される処理を書きます。ここでは特に何もしていません。

onPostExecute()では、タスク処理終了後に実行する処理を書きます。ここでは、setListener()にて設定したコールバック処理を実行させています。

package com.example.meshitero;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {
    private DownloadTask task = null;
    private ImageView imageView = null;
    private Timer timer = null;
    private String url = "https://taki-lab.site/meshitero/img/time_%02d_%02d.jpg";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = findViewById(R.id.imageView);
        timer = new Timer();
        timer.schedule(new MyTimerTask(), 0, 60000);
    }

    @Override
    protected void onDestroy() {
        task.setListener(null);
        super.onDestroy();
    }

    private DownloadTask.Listener createListener() {
        return new DownloadTask.Listener() {
            @Override
            public void onSuccess(Bitmap bmp) {
                imageView.setImageBitmap(bmp);
            }
        };
    }

    private String getTimer() {
        Calendar cTime = Calendar.getInstance();
        int min = cTime.get(Calendar.MINUTE);
        if(min < 30) {
            min = 0;
        } else {
            min = 30;
        }
        Log.d("debug",String.format(url, cTime.get(Calendar.HOUR_OF_DAY), min));
        return String.format(url, cTime.get(Calendar.HOUR_OF_DAY), min);
    }

    class MyTimerTask extends TimerTask {

        @Override
        public void run() {
            task = new DownloadTask();
            task.setListener(createListener());
            task.execute(getTimer());
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@android:color/background_light" />
</androidx.constraintlayout.widget.ConstraintLayout>

MainlyActivityでは、内部クラスにTimerTask を実装したMyTimerTaskクラスを作成しています。

タイマー処理はこれがないとダメらしい。

run()に、実際にタイマー処理で実行される処理を書きます。ここでは、DownloadTask()を実行させています。

onCreate()では、timerクラスを使って MyTimerTask をスケジューリングしています。第二引数は初回実行までの時間、第三引数には、実行間隔を指定します。

setListener()にcreateListener()メソッドを渡すことで、 MyTimerTaskのタスク処理が実行されたあと、 createListener()が実行されるように設定しています。

ここでは、ImageViewに読み込んだ画像を設定しています。

時間取得はCalendarクラスを使用します。こちらの方が推奨された処理らしいです。

【プログラミング】美人時計のようなもの(Web編)

Tech commitの挑戦状課題で「美人時計のようなもの」があったので、まずはJavascriptで作成しました。

飯テロ時計

http://taki-lab.site/meshitero/meshitero.html

https://github.com/takishita2nd/meshitero_timer

30分おきに画像が変わり、時間を教えてくれます。

コード解説

まずは、html本体。

<!doctype html>
<html>
    <header>
        <meta charset="utf-8">
        <title>飯テロ時計</title>
        <script src="jquery-3.4.1.min.js"></script>
    </header>
    <body>
        <img id="image" width="640" height="480" src="" />
        <script src="meshitero.js" ></script>
    </body>
</html>

ライブラリはjQueryを使用。これを使うと、IDやclass指定した要素の取得が簡単になります。

本体は画像を表示するimgタグのみ。

そのあとにjs本体を読み込ませます。

jsは最後に書かないと、きちんと動いてくれないっぽい。

続いて、js本体。

function getImageName() {
    var date = new Date();
    var hour = ("00" + date.getHours()).slice(-2);
    var min = "00";
    if(date.getMinutes() >= 30) {
        min = "30"
    }
    var imageFormat = "time_{0}_{1}.jpg";
    return imageFormat.replace("{0}", hour).replace("{1}", min);
}

function imageUpdate(force = false) {
    var date = new Date();
    if(force = false &&
       (date.getMinutes() % 30) != 0) {
        return;
    }
    var imageName = getImageName();
    var image = $("#image")[0].src = "img/" + imageName;
}

document.onload = imageUpdate(true);
setInterval(imageUpdate, 60000);

まず、用意する画像のファイル名は「time_hh_mm.jpg」で統一します。

ファイル名フォーマットとして”time_{0}_{1}.jpg”というのを用意し、あとは実際の時間に合わせて{0}と{1}の部分をリプレースして、ファイル名を作成します。

画像の置き換えはimgタグの要素srcの値を書き換えるだけです。

で、setInterval()で一定時間後周期的にヶ同読み込みが行われるのですが、初回ロード時にも画像を読んで貰わないと行けないので、onload(html読み込み終了時)に強制的に読み込みを実行します。

imageUpdate(force = false) {}とは、引数を指定しなければforceの値は初期値falseが適用されます。

imgタグを書き換えるだけでいいので、思ったほど簡単なコードになりました。

【自作PC】3Dベンチマークの比較

3D ゲームをするつもりはないのですが、ついでなので、1年前に購入したノートPCと自作PCの3Dベンチマークを測定してみました。

ベンチマークソフトは3DMARKを使おうと思いましたが、何故か動かなかったので、ファイナルファンタジー14のベンチマークソフトを使用しました。

まずは、ノートPCの測定結果はこちら。

動作困難!

わかってた。

測定中も動作カックカクで、とてもゲームができる状態ではないと思いました。

続いて自作PCの測定結果。

やや快適!

動作はやや滑らか、でも時々違和感がある程度で、これくらいならまだ許容できる範囲。

そもそもスペックを比較すると、ビデオRAMのサイズが全然違ってて、ノートPCの方は128MBに対して自作PCの方は2GB。

全然違う。

Intel内蔵のグラフィックチップとRYZENに内蔵しているグラフィックチップにはかなり違いがありますね。

Intelの方は、本当に必要最低限の機能しかないって感じ。

ADMのCPUは、基本的にはグラフィックチップは搭載していないのですが、一部のCPUにはかなり高性能(?)なグラフィックが搭載されているようです。

但し、グラフィックチップを搭載しているAMDのCPUはごく一部なので、本来はグラフィックボードを使用しなければいけません。

Intelを選ぶか、AMDを選ぶかは、その辺りも考慮しなければいけませんね。

全く考えないでパーツ買ってた。

みんなは必ず、意識するように。

【自作PC】ついでにケースも交換、スタイリッシュに?

前回の様子はこちら

なぜケースを交換するに至ったかというと、

フロントパネルのUSB端子が一個壊れてた。

まぁ、オークションで仕入れた中古だから仕方ないね。

ケースを交換するに当たって、もう一つ、DVDドライブも新しいものにしました。

音楽CDを取り込もうとしたら、CDを認識してくれなかったため。

これも中古PCに付いてきた物だから仕方ない。

なので、Amazonで購入しました。

なんか、中身が見えるってかっこよくない?

配線汚いけど。

あと、本体上部にファンを二つ取り付けられるので、古いPCケースからファンを頂きました。

ついでに言うと、前面と、本体下部にも取り付けられるようです。

そんなに冷却能力はいらない。

3個で十分過ぎるので、いま、PCの周りはファンの風で少し寒いです。

現在のPC構成とコストはこちら。

パーツ型番価格
CPURyzen 5 3400G20680
マザーボードPRIME A320M-A7544
メモリHX426C16FW2K2/16 6980
電源KRPW-L5-400W/80+3278
ケースCC-9011086-WW5099
SSDGH-SSDR2SA1202178
M.2SSDSCKKW480H6X15980
DVDドライブIHAS324-17/A2020
OSWindows 10 Pro3259
電源ユニットネジ200
電源延長ケーブル×2300
二股電源ケーブル300
合計57818

みんなも自作PCやろう。

Felicaが通信できる仕組み

bBearさんによる写真ACからの写真

QRコード決済なんていらない、なんでもっとおサイフケータイが使えるところが増えないのか?というのを多く見かけたので、おサイフケータイに採用されているFelicaという仕組みについてまとめました。

通信できる仕組み

まず、FelicaなどのICカードの中には、電源は入っていません。

電源が無いのに、どうやって通信できるのか?

例えば、理科の実験で、コイルの中に磁石を入れると、コイルの中に電流が流れる、というのをやったことはありませんでしょうか?

http://www.wakariyasui.sakura.ne.jp/p/elec/dennji/renntu.html

この仕組みを利用して、ICカードの中に電流を流しています。

具体的には、ICカードの中にコイルと通信モジュールなどのICチップが内蔵されていて、

ICカードリーダーには、通信モジュールと微弱な磁界が発生しています。

http://rfid.toppan-f.co.jp/card/felica/about.html

そうすることによって、ICカードリーダーにICカードを近づけると、ICカードの中に電気が流れ、その電気を使ってICチップを動かし、通信が発生する、と言う仕組みです。

Felicaに対応している決済方法

Felicaに対応している決済方法はSuicaなどの交通系の他に、nanaco楽天EdyWAONがあります。

Felica決済が普及しない理由

Felica決済を行うには、専用のICカードリーダーが必要です。

家電量販店にカードリーダーが売られていますが、これでは決済できません。

なぜなら、各決済方法毎に、独自の暗号化技術が使用されているためです。

これはお金を扱うので、勝手に書き換えたりしたら大変なことになりますよね。

なので、専用のIcかーどりーだーを必要になるのですが、導入にはそれだけの大きなコストが発生することになります。

なので、導入できる場所は限られています。

交通系は駅や駅施設、nanacoなどはセブンイレブンなど、WAONはイオン系といった、比較的大型チェーンに限られており、個人の小規模店舗では導入が難しい、といえます。

QRコード決済のメリット

その反面、QRコード決済は導入コストが安くて済む、というメリットがあります。

バーコードリーダーが無くても、店舗のレジの前にQRコードを出しておけば、スマホのアプリでQRコードをスキャンして金額を入力するだけで決済できます。

従って、店舗側のコストが大幅に少なくすることができるのです。

利用する側にもメリットがあります。

Felicaが無いスマホであっても、専用アプリが使用できて、カメラさえあれば、スキャン用のQRコードを表示できますし、店舗にある決済用のQRコードをスキャンして、決済することもできるのです。

個人的には、現金を数えるのがめんどくさいので、数字だけで管理できるキャッシュレス決済がもっと広がれば良いと思うんですけどね。

自動販売機とかQRコード決済にできないかな・・・

【自作PC】Ryzen5を購入した!

前回までの状況はこちら

スペックアップを目的に、自作PC用にRyzen5を購入しました。約20000円。

まず、グラボでは無くCPU強化に至ったわけ。

元々使用していたノートPCでは、グラボは積んでおらず、オンボードのグラフィックスチップを使用しています。

それでDMMゲームズとか普通に動いているので、同じ原理で、必要なのはグラボでは無く、CPU強化だと判断しました。

そして、このCPUを選んだ理由は、Ryzenシリーズにはグラフィックスチップ内蔵のものと、内蔵していないものがあるらしい。

もし、グラフィックスチップを内蔵していない物を選択した場合、CPUのパワーは上だが、グラフィックスがまともに動かない可能性があります。

こういうタイプはグラボと一緒に使用します。どちらかと言えば3Dゲームをゴリゴリ動かすPCの場合はこちらの方が向いていますが、グラボを所有していないため、結果敵にこちらの方がコストが高くなります。

その反面、グラフィックスチップ内蔵の物は、CPUのパワーは落ち、価格も高くなりますが、グラボが無くても、十分なグラフィックス能力を持ちます。

交換前のA6プロセッサには、R5のグラフィックスチップセットが載っていますが、今回購入したRyzen5にはRadeon VEGAが搭載されています。

Radeon VEGAはR5よりも上位のグラフィックスチップなので、グラフィックス面でもパワーアップしていると言うことです。

また、Ryzen5とRyzen3、どちらを選択するかという点ですが、この二つは1万ぐらい価格に差がありますが、今までの経験上、ここでコストをケチると、後々後悔すると言うのがありますので、上位のRyzen5を選択しました。

これを

取り外し、

装着。

CPUクーラーも巨大な物に変わっていました。CPUに付属していたものです。ネジでマザーボードにがっちり固定するタイプです。

BIOSでもしっかり認識しています。

ベンチマークPCMARK10の測定結果です。

Ryzen5 (2Gen)

こちらは交換前のベンチマーク結果。

A6

こちらは、ノートPCの測定結果です。

Intel Core-i7 (7Gen)

今まで使用していたノートPCよりもパワーアップしました。

これでメインPC確定ですね!

パーツ型番価格
CPU Ryzen 5 3400G20680
マザーボードPRIME A320M-A7544
メモリHX426C16FW2K2/16 6980
電源KRPW-L5-400W/80+3278
ケースヤフオクで落札2790
SSDGH-SSDR2SA1202178
M.2SSDSCKKW480H6X15980
OSWindows 10 Pro3259
電源ユニットネジ200
電源延長ケーブル×2300
二股電源ケーブル300
SSDケース934
合計54423

そして、こだわるほどお金が飛んでいく。

でも、ノートPCの半分以下の価格でこのスペックだから、みんなも自作PCやってみると良いよ!

【自作PC】思い切ってスペックアップ

前回までの経過はこちら。

ここからメインPCとして使えるようにスペックアップしていきたいと思います。

まず、簡単にパワーアップ出来るところから。

インテル製M.2のSSD 480GBです。約6000円。

マザーボードを見ると、M.2のスロットを発見したので、思い切って買ってきました。

こちらのドライブにWindowsシステムをインストールしたいと思います。

キングストンのメモリ8GB×2枚です。約7000円。

メモリをこれに差し替えればメモリサイズを一気に16GBに増やすことができます。

簡単にスペックアップを図るなら、やっぱりメモリかと思います。

それに、このメモリで動作に問題無ければ、同じ物をもう1セット購入して、32GBにパワーアップすることもできます。

早速取り付け。

M.2を固定するネジはマザーボードの箱の中に入ってました。どうやって固定するのかと一瞬焦りました。

メモリはゲーミングPC見たいなデザインでかっこいいです。

BIOSでデバイスを認識していることを確認して、Windowsをセットアップして、ベンチマークで測定。

測定ソフトはPCMARK10です。

前回は、

だったので、メモリを増設することによって、ベンチマークスコアがアップしたことが確認できました。

メモリは大事。

実際に動かしてみたところ、相変わらずのサクサク動作で、WordやExcelも快適に動いています。

この記事も自作PCで書いています。

繰り返しますが、このPCのCPU、2000円です。

ただ、今使用しているA6-9500 BOXは最近リリースされたものなので、そこそこ最適化が行われているのかもしれません。

しかし、DMM GAMESのゲームを動かしてみたところ、カクカク。

とてもゲームができるものではありませんでした。

さて、メインPCとして使えるようにするにはどこをパワーアップさせましょうか。

CPU?グラフィックボード?

そして、このPCの使い道も考えなくては(オイ

現在のPCの構成

パーツ型番価格
CPUA6-9500 BOX2198
マザーボードPRIME A320M-A7544
メモリHX426C16FW2K2/16 6980
電源KRPW-L5-400W/80+3278
ケースヤフオクで落札2790
SSDGH-SSDR2SA1202178
M.2SSDSCKKW480H6X15980
OSWindows 10 Pro3259
電源ユニットネジ200
電源延長ケーブル×2300
二股電源ケーブル300
SSDケース934
合計35941

この値段でPC持てるって、絶対みんな自作PCやった方が良いよ。

【自作PC】足りない物を追加する。

前回の内容はこちら

前回はWindowsを入れてベンチマークのスコアを見てみました。

しかし、いろいろ足りない物があります。

本体の中の配線はごちゃごちゃしてるし、

電源モジュールは固定されていないし、

SSDドライブは宙ぶらりんの状態です。

このままではPCIにパーツを取り付けようにも、ケーブルが物理的に干渉してしまいます。

こんな状態

これを解決するために、ツクモで買ってきました。

延長ケーブル達。

SSDを固定するケース。

電源ユニットを固定するネジ。

なんでネジついていないんだろう?(ボソ

とりあえず、電源をネジでケースに取り付けます。

たぶん、電源ユニットの上下は関係ないと思う。

どっちを上にしてもネジ穴がきちんと重なるようになっているっぽい。

そして、電源の延長ケーブルをつなぎ、SSDのケースも取り付け。

だいぶスッキリしました。

少なくとも、電源ケーブルが長くなったので、PCIボードを取り付けてもケーブルが邪魔になることが無いだけの、十分な長さがあります。

配線をスッキリさせるのは大事。

変に干渉して不具合が起きることを防止できます。

ここまでの費用はこんな感じ。

FOMAとiモードのサービス終了へ

この二つのサービスはいろいろと思い出があるもので。

まず、iモードですが、オイラがケータイを契約したときに、ちょうど良いタイミングでiモード対応ケータイを「新型」と聞いて購入しました。

メーカーはパナソニックだったと思います。

以後、ケータイは主にパナソニックを使用していたと思います。

当時のディスプレイ画面も白黒の液晶で、少ない文字と小さな画像を表示する程度の機能しかありませんでしたが。

画像ロード中に途中で止まって、中途半端に表示されていた思い出があります。

当時はそれが画期的で、iモードに熱中する余り、パケ死したこともありました。(当時は定額プランが無かったのです)

とは言っても、当時は2Gの技術で行われていました。

FOMA(3G)で、劇的に早くなったのを覚えています。

FOMAは交換機の開発にも関わってきたので、当然思い入れもあります。

今思えば、良く今まで動いていてくれていたな、俺のプログラム、と言う思いです。

その後のHSDPA(下りの通信速度が3Gの約4倍になるサービス)の開発も関わってきました。

あの当時の働き方をしていたら、メーカーは大バッシング受けるだろうな・・・(ボソ

今は来年5Gサービス開始に向けて最終調整を行っていると思います。

ホワイトな仕事できていますでしょうか。

いや、開発業はトラブルが発生したら休み無く解決に動かなくちゃいけないから。

開発業の運命みたいなもの。

まぁ、これで一つの時代が終わると言うことで。

5Gが楽しみです。

はやく札幌で使えないかな。