2020年7月11日土曜日

プログラミングを学ぶ前にすること

 仲間内で「最初に学ぶのに最適な言語は何だろう」という話になった。
 正直、最適解はなく、「自分がやりたいことが実装できる言語」がそれぞれにとっての最適となると思う。
 しかし、見つけたところでスムーズに学んでいけるかというと、誰しもがすいすい進んでいけるわけではなく個人差がある。そこで「プログラミングを学ぶ前に何を知るべきか」まとめてみたいと思う。

  1. 四則演算

    最悪、小学生くらいまでの数学で問題ない。
    2点間の距離を求めよとか連立方程式とかは専門的なことをするまでいらない。
    逆に言えば専門的なことをするならとても勉強が必要。

  2. アルファベット

    a~z、A~Zまでのアルファベットを覚える。
    すごく基本的なことだが、いまだにlとI、0とOを間違える人がいる。
    私もたまに間違える。

  3. 英語

    基本的にプログラムは英語で記述する。
    それが意味のある文字として理解しているか、していないかで、やはり覚えに差が生まれてくる。
    マニュアルは英語であることもある。

  4. 日本語

    プログラムしていく上で人に質問したり相談したりすることがあるが、うまく自分のやりたい事が伝えられるか、受け取れるか非常に重要に感じる。
    マニュアルは日本語だがたまに言い回しが独特だったり難解だったりする。

  5. まずやってみる

    プログラミングは絵画や陶芸と違って、作業を行う上で、設備費はかかるが原材料費はかからない。どんどん手を動かそう。

  6. 分からないことを自分で調べる癖をつける

    初心者向けの本でも8割方、下手したら9割9分わからないと思う。
    プログラミングはわからないまま進めると結構うまくいかない。
    今は幸いネットがあるので、わからない言葉が出たらググる。または人に聞こう。

  7. 小さい目標を作る

    自分の望む完成品を作るのはとても大変なことである。
    小さい目標を作った方がよりモチベーションが上がるし、細かく進みをチェックできる。

  8. 教師を付ける

    モノによっては間違えて覚えると大変なので教師をつけたほうがいい。
    この教師はリアルな人でもいいが、キレイなコードでもいい。

どんな言語を学ぶにしても、上記のことは必ず生きてくる。
 基本的に自分の前に来る新人はプログラミングの勉強はしてきているはずだが、わりと個人差が大きい感じなので、こういった基本から教えれるようになりたい。

2019年10月8日火曜日

Oculus Questを使って美少女になって自撮りするアプリ開発中



しばらくLTもやってないしOSCにも何も出展していないので、そろそろ自分でネタを作ることにした。
クライアント側はUnityで組んだけど、スクリーンショットを保存しても取り出すのが大変だし、
Googleフォトとかとの連携が大変そうなので、自前でHeroku上にAPIサーバーを立てて、
そこにアップロードすることにした。
セキュリティガバガバだからまだサイトのアドレスは載せれない。
Final IKとか使ったらもっと楽なんだろうなあ。
モデルはVRoidで作ったけどシェーダーとか見直す点はあるかも。

これからの課題は
・進行のリセット機能
・表情の変更
・サイトのセキュリティ
・VR空間のリッチな部屋にする
・誰が撮影しても似たような写真になる問題

ちなみに、もともと
「VR空間でしかできないことしたいな・・・そうだ!美少女にしかできないタピオカチャレンジをしよう」
という突然何かが降りてきて実装を開始したのだが、タピオカチャレンジについて
「胸の上にタピオカミルクティーを乗せて写真を撮る」
という情報しかなかったから、
すごい角度を付けて写真を撮ってると思ってた。自撮りへの情熱すごいな。
3Dモデルは無関係

実際はそんなことなかった。口でくわえるのもアリだった。
流石に「口でくわえる」はセンシングできないので、
タピオカミルクティーを口元に近づけた時点で、口とくっつくようにしてあります。


2019年1月30日水曜日

Unity 2018.3にアップグレードするとtextmeshproが見つかりませんでしたみたいなエラーがたくさん出てVisual Studioでビルドできない

アップグレードの影響か、プロジェクトフォルダ\Packages以下のスクリプトが消えていた。
プロジェクトフォルダ\Library\PackageCacheからコピーするとビルドが通った。
これが正しい方法なのかはわからん。

2017年3月12日日曜日

Wikipediaのダンプファイルをインポートする(挫折)

・ここからダンプをダウンロード。
・ALZipだと大きいほうのファイルが解凍できなかった。7zipで解凍。
・解凍すると10GBのXMLファイルが!・・・
・なぜかサクラエディタでもバイナリエディタでも開けない・・・Baretailだと開けた。
・文字コードはUTF-8
・このページを参考にMediaWikiのインストールをする。
・だいたいあってるけどUbuntuの場合、以下を参考にいくつか追加インストール必要。
・あっというまに稼働するWikiができてびびる。
・importDump.phpを実行。めっちゃ時間かかってるみたいだけどこれ終わるのかよ
100 (3.47 pages/sec 3.47 revs/sec)
200 (3.92 pages/sec 3.92 revs/sec)
300 (3.26 pages/sec 3.26 revs/sec)
400 (3.57 pages/sec 3.57 revs/sec)
500 (3.89 pages/sec 3.89 revs/sec)
600 (3.95 pages/sec 3.95 revs/sec)
700 (4.14 pages/sec 4.14 revs/sec)
800 (4.06 pages/sec 4.06 revs/sec)
900 (4.06 pages/sec 4.06 revs/sec)
1000 (4.12 pages/sec 4.12 revs/sec)
・1051782(日本語版全記事数)÷4.12=255286秒=70時間(絶望)
・インポート中でもWiki内容は表示できる。
・CPUがボトルネックになっているっぽい。VMでやるべきではなかったか・・・
・誠に遺憾ながらだんだん遅くなっていく。
40700 (2.06 pages/sec 2.06 revs/sec)
40800 (2.06 pages/sec 2.06 revs/sec)
40900 (2.06 pages/sec 2.06 revs/sec)
41000 (2.06 pages/sec 2.06 revs/sec)
41100 (2.06 pages/sec 2.06 revs/sec)
41200 (2.06 pages/sec 2.06 revs/sec)
41300 (2.05 pages/sec 2.05 revs/sec)
41400 (2.06 pages/sec 2.06 revs/sec)
41500 (2.06 pages/sec 2.06 revs/sec)
41600 (2.06 pages/sec 2.06 revs/sec)
・50000件くらいであきらめた・・・でもランダム表示させるだけで楽しい

・何に使うかまだ考えてない

2016年8月21日日曜日

[Unity]AseetBundleで読み込んだ際に自作シェーダーが読み込まれない

いくつか他サイトでも紹介されてるけど、いきなり世界が紫色になってビビる。
開始後にシェーダーを再設定すればOK。AseetBundle使うとシェーダーの参照が壊れるとかなんとか。

        foreach (var uchar in UCharForReload)
        {
            Renderer[] mats = uchar.GetComponentsInChildren<Renderer>();
            foreach (var MaterialNow in mats)
            {
                foreach (var m in MaterialNow.materials)
                {
                    m.shader = Shader.Find(m.shader.name);
                }
            }
        }

で、これでOKかと思いきや、Android環境だとうまく動かんかった。
Always Include Shadersで設定すれば今くいくかも?また今度試してみよう
⇒設定したらOKでした

2016年7月31日日曜日

[Google VR][Unity]GazeInputModuleで注視しているボタンをクリックさせる

デフォルトだとタッチ操作が必要になる。環境によってはタッチ操作用の磁石がないので修正。
まずタイマー用の変数と、クリック動作させるかのパラメーターを追加。

    float clickTimer = 0f;
    float clickTimerMax = 1f;
    public float ClickTimer
    {
        get
        {
            return clickTimer;
        }

        set
        {
            clickTimer = value;
        }
    }
    public float ClickTimerMax
    {
        get
        {
            return clickTimerMax;
        }

        set
        {
            clickTimerMax = value;
        }
    }

    [SerializeField]
    bool GazeTimeClickMode;

あとはUpdateCurrentObjectを書き換えて、タイマーカウント終了時にExecuteEventsでクリックさせる。

    private void UpdateCurrentObject()
    {
        // Send enter events and update the highlight.
        var go = pointerData.pointerCurrentRaycast.gameObject;
        HandlePointerExitAndEnter(pointerData, go);
        // Update the current selection, or clear if it is no longer the current object.
        var selected = ExecuteEvents.GetEventHandler<ISelectHandler>(go);
        if (selected == eventSystem.currentSelectedGameObject)
        {
            ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, GetBaseEventData(),
                                  ExecuteEvents.updateSelectedHandler);
            if (GazeTimeClickMode && selected != null)
            {
                ClickTimer = ClickTimer - Time.fixedDeltaTime;
                if (ClickTimer <= 0f)
                {
                    pointerData.pointerPress =
                        ExecuteEvents.ExecuteHierarchy(go, pointerData, ExecuteEvents.pointerDownHandler)
                        ?? ExecuteEvents.GetEventHandler<IPointerClickHandler>(go);
                    ExecuteEvents.Execute(pointerData.pointerPress
                        , pointerData, ExecuteEvents.pointerClickHandler);
                    ClickTimer = ClickTimerMax;
                }
            }
        }
        else
        {
            ClickTimer = ClickTimerMax;
            eventSystem.SetSelectedGameObject(selected, pointerData);
        }
    }

調べるのが大変だった・・・

2015年6月21日日曜日

Wii Uに動画を表示させようと四苦八苦した件

Wii Uは自分で持ってるMP4動画とか画像とかをSDカードやらDVDやらDLNA使って読み込むことが
でき
ない。
私が思うにWiiU用アプリやらWebアプリやらがもっと作られるといいな~と想定されていたのだと思うがそうはならなかったようだ。
開発ライセンス必要だしね。
というわけで、Railsで単純な動画アップローダーを作った。
例によってソースのみ。
herokuにもデプロイしてあるんだけど個人用みたいな扱いにしたいからBasic認証掛けてある。アップロードしたかった方は申し訳ない。
Githubからソース落として自力でデプロイしてくれたまえ。
後学の為に苦労した点とかまとめます。
  1. BASIC認証
    これは思ったより簡単だった。ApplicationControllerにちょっと書き加えるだけ。
    class ApplicationController < ActionController::Base
      # Prevent CSRF attacks by raising an exception.
      # For APIs, you may want to use :null_session instead.
      protect_from_forgery with: :exception
      before_filter :basic
      private
      def basic
        upass = ENV["USER_PASS"]
        u = upass.split(":")[0]
        p = upass.split(":")[1]
    
        authenticate_or_request_with_http_basic do |user, pass|
          user == u && pass == p
        end
      end
    end
    環境変数はめんどいからコロン区切りにしてある。
  2. ファイル暗号化
    アップロードしたファイルは暗号化してDBへぶち込むようにしてある。
    Herokuの規約上、暗号化したほうが安全だと判断しました。
    これもmodelにちょっと書き足すだけ。
class Video < ActiveRecord::Base
  def encryptor
    secret = ENV["ENC_KEY"]
    ::ActiveSupport::MessageEncryptor.new(secret)
  end

  def video_data=(val)
    encryptor = self.encryptor
    write_attribute("video_data",encryptor.encrypt_and_sign(val))
  end

  def video_data
    encryptor = self.encryptor
    encryptor.decrypt_and_verify(read_attribute("video_data"))
  end
end
3 . DBへのぶち込み方
最初はテーブルにbinary列を追加してそこにぶち込もうとしたが、全件検索した際にメモリいっぱいになって落ちることが判明。
各列遅延評価してると思ってたけど、そうではないらしい。
結局テーブル分割したから保存部分がめんどくさくなった。
     @user = User.new(user_params)
     @user.filename = file.original_filename
     video = Video.create
     video.video_data = file.read
     video.save
     @user.video_id = video.id
     @user.icon_content_type = file.content_type
     @user.save
4. 動画再生
最初はsend_dataでRailsからデータ送ってたんだけど、それだとvideoタグでの再生がうまくいかんかった。なんでや。GifとかJpegならうまくいったのに…
結局、publicフォルダ以下に直接出力し、後で消すと言う方法をとった。
Dyno死ぬときにpublicフォルダ以下内容も死ぬけど一応トップに戻る際にも消してる。
 def show
    #ファイル出力
    @user = User.find(params[:id])
    File.binwrite(Rails.public_path.join(@user.icon_path), Video.find(@user.video_id).video_data)
  end
MP4への変換とかはHandbrakeなりなんなりでローカルでエンコードしていたから問題なかった。
あと、WebM形式も試したけどうまくいかんかった。
Wii Uで再生可能な動画形式は以下。こうして仕様を公開してくれているのは助かる。
これでそことなく動画をアップロードして再生できるようになったがまだ課題が山積み。
課題はGithubのissueを参照してください(宣伝)

ちなみに今回の投稿はKobitoで書いてからはっつけました。
Windows版Kobito優秀。