Elixirハンズオン

ドリコム社さんが開催してくださった【サーバーサイド講義&実技】Elixirハンズオンに参加してきました。そこでの感想やElixirの感想などを書こうと思います。

Elixirとは

Elixirは拡張性と保守性の高いアプリケーションを構築するためにデザインされた、動的で関数型のプログラミング言語です。

https://elixir-lang.jp/

ElixirはErlang VM上で動く言語で、フォールトトレランスやホットスワップが可能なErlangをRuby風の言語で利用しようと設計されたものらしいです。
サーバーサイド言語ではPHPしか扱ったことしかなかった私は、Elixirを使ってみたいなぁと思ってたわけですが、Ruby風の記述がどうも苦手で(つまり{}を使わない言語系)、手こずっている間に色々しないといけないことに追われて後回しになっていたのですが、幸いドリコム社さんのElixir ハンズオンに参加させてもらえることになり参加しました。

やったこと

Elixirはmixというパッケージ管理システムを使ってます。
アプリを新規作成するときは
$ mix new test_app
とやります。
こうすることで

test_app
├── README.md
├── config
│   └── config.exs
├── lib
│   └── test_app.ex
├── mix.exs
└── test
    ├── test_app_test.exs
    └── test_helper.exs

と言うような構成になります。
設定ファイルがmix.exs で実際にコードを書くのが lib/test_app.ex らしいです。
mix.exsには依存ライブラリなどの記述をします。

今回のハンズオンでは大量のJSONデータを処理するコードをやりました。
JSONの取扱はPoisonというライブラリを使うらしいのでmix.exsに

  defp deps do
    [
      {:poison, "~> 4.0"},
      # {:dep_from_hexpm, "~> 0.3.0"},
      # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
    ]
  end

と記述します。
依存関係をダウンロードするために
test_app $mix deps.get
としてlib/test_app.exのdefmodule test_appの中に

def main do
  json_text = File.stream!("d.json")
  json_data = Enum.map(data, fn d -> Poison.decode!(d) end)
  result = Enum.filter(json_data, fn d -> d["age"] <= 20 end)
  Enum.count(result)
end

と書きtest_app/d.jsonを

{"age":39,"name":"aaa"}
{"age":47,"name":"bbb"}
{"age":46,"name":"ccc"}
{"age":13,"name":"ddd"}
{"age":45,"name":"eee"}
{"age":18,"name":"fff"}
{"age":22,"name":"ggg"}
{"age":15,"name":"hhh"}
{"age":24,"name":"iii"}
...

と置きます。
その後、ターミナルにて
test_app $ iex -S mix
iex(1)>test_app.main
と打つと、20歳以下の人数が出てきます。

さて、Elixirにはパイプ演算子というのがあるらしく、前の関数の返数を第一引数として渡したい時に使えるらしいです。上のコードは以下のように書き直せます。

def main do
  "d.json"
  |> File.stream!
  |> Enum.map(fn d -> Poison.decode!(d) end)
  |> Enum.filter(fn d -> d["age"] <= 20 end)
  |> Enum.count
end

まあ、このように色々教えてもらってEnumじゃなくてStreamやFlow使うと良いよなど教えてもらいました。

感想

Elixir本を読んだときは、「他言語とは違うぞ〜」ということが非常に多く書かれてましたが、ドリコム社さんのおかげでスムーズに理解できました。もちろんElixirの一角だと思いますが、少しずつやっていこうと思います。
ただ、関数っぽい部分とそうでない部分とが妙に突っ掛かると言うか…まあ慣れかな…

あと今回の件で、map=>filterを行いましたが、filter一個でも行けるんじゃないかなと思って少し疑問…具体的には

  def is_adult (json_text) do
    data = Poison.decode!(json_text)
    data["age"] <= 20
  end

  def main do
    "data.json"
    |> File.stream!
    |> Enum.filter(fn d -> is_adult(d) end)
    |> Enum.count
  end

て書いても動くのでどうかな〜と、よく分かってない。
まあ、これからボチボチやっていきます。

OS自作のネタ集

この文章はセキュリティキャンプ2019 Y-I OS開発ゼミ用に書かれたものです。
セキュリティキャンプが終了次第公開する予定です。主にOS自作のネタを提供するのが目的な文章ですので、参加者の皆様が強い目標をお持ちなら、ぜひそれを実現させてください。(全員そうだったらこの文章は無駄になるわけですが…それはそれで)
そうでなくとも、セキュリティキャンプに応募する際に何らかの目標を持って応募はされているとは思いますが、+αという感じや、より目標が具体的になるように役立ててもらえると幸いです。

RustでOS自作

これは自分がセキュリティキャンプ2017に参加したときの目標です。

Rustは安全性、速度、並行性の3つのゴールにフォーカスしたシステムプログラミング言語です。 ガーベジコレクタなしにこれらのゴールを実現していて、他の言語への埋め込み、要求された空間や時間内での動作、 デバイスドライバやオペレーティングシステムのような低レベルなコードなど他の言語が苦手とする多数のユースケースを得意とします。

https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/

とあるように、Rustは低レイヤを得意とする言語で安全性に重きを置いています。おかげで最初は「エェ…そんくらい許してくれや…」というエラーがガツガツ出ます。しかしながら、これらを丁寧に潰していけばほぼ100%期待通りに動いてくれます。セキュリティキャンプ2017では割り込みのバグを潰すのに時間がかかったわけですが(参照:セキュリティキャンプ2017参加記)、Rustが原因であることは少なかったです。
RustでのOS自作で参考になりそうなサイトは以下の通りです。

NimでOS自作

Nim (旧称Nimrod) とは命令型、マルチパラダイム、コンパイル言語という特徴を持つプログラミング言語であり、アンドレアス・ランプフにより設計・開発された。Nimは「効率的で表現豊かで優雅」であるように設計されている。

https://ja.wikipedia.org/wiki/Nim

NimはRustより少し早めに出てきた言語で、Python風に優美にコードがかける…らしいです。よく言語比較サイトでRustと喧嘩してます。
NimはCのコードを吐けるのでこれを利用してOSを自作することも可能のようです。ただRustに対してネットでの情報が少なく難航するかもしれません。でも折角のセキュリティキャンプなので挑戦してみるのも良いかと思います。(自分も気になります。)
NimでのOS自作で参考になりそうなサイトは以下の通りです。

ZigでOS自作

Zig is a general-purpose programming language designed for robustnessoptimality, and maintainability.

https://ziglang.org/

かなり新しい言語のようですが、低レイヤも扱えるようです。が、日本語の情報がほとんどありません。どうしたもんでしょう…Nim同様挑戦してみるのも良いかと思います。

はりぼてOSを64bit対応してセキュアにしてみる

言わずとしれた30日OS自作本のはりぼてOSですが、今や時代遅れのOSと言われるようになりました…悲しい。
昨今のOSは64bit対応でページングを採用していますので、32bitOSでセグメンテーションなはりぼてOSとは大違いです。
しかしながらはりぼてOSはGUIもしっかりしてますし初心者向けにわかりやすくできているので、これを参考にしてUEFIブートなどに対応するのも良いかなと思います。
また30日OS自作本では、LDTなどを使ってメモリ保護などを行っていますが、全然セキュアではないのです。例えば

void HariMain(void){
    api_boxfilwin(0, 8, 36, 141, 43, 3);
    api_putstrwin(10000, 28, 28, 0, 12, "hello, world");
    api_end();
}

というアプリでも作ろうもんならたちまちOSがぶっ壊れてしまいます。第一引数のwinをOS側で検証してませんから、適当な値を打ち込めばすぐやられます。これらを改善するにはどうしたらいいか考えるのもセキュリティらしいネタかもしれません。

別アーキテクチャでのOS自作

(もしx86環境という条件付きのキャンプでしたら以下のネタは利用できません)
世の中にはx86-64なCPUだけではなく、様々なISAがあります。
身近なものでは、スマートフォンでよく採用されているARMアーキテクチャや話題沸騰中のRISC-Vなど様々なものがあります。
QEMUでも実装されているCPUも多くありますので、実機では動かせなくともエミュレータで動くOSも作れます。
他のISAと比較することでx86-64がどのような性質を持って、セキュリティ的にどうかがわかるかもしれません。(自分はRISC-Vをいじって少しわかった…気がする…多分)
https://github.com/PG-MANA/RuscV RustでRISC-Vベアメタルをやったときのコードですが役に立つかもしれません。

終わりに

少ない量でしたが、何か役に立てたなら幸いです。これをみて全く別のことを思いついてもらっても構いません。
OS自作の分野は日本語の情報が(他に比べて)少ないですが、テーマは色々あると思うので、有意義なテーマを見つけて、頑張ってみてください。

受験勉強の進捗

この記事は テオクレ受験生のAdvent Calendar 9日目の記事です。

(実はこの記事は書きためていたものを、運良くカレンダー見つけて便乗して載せてますので、文章は最新のものではありません。)

WARNING: この文書は怪文書ではなく悔文書または壊文書です。またかなり真面目な内容を一部含みます。
なおこの記事を見て、「うっかり読んだせいで勉強する気になってしまった」「書いてあることを試してしまい、テオクレ受験生でなくなった」などについての責任は負いませんのでご注意ください。

届かないセンター8割。

何故かできない物理、何故かできる化学。
回答欄に当てはまらずに頭抱えてたらTHE ENDな数学。
解説読んでもわかんねぇ現代文。
文法ダメダメな英語。
周りがフィーリングで行けるというのに行けない地理。
現状7割が精一杯です。

進路希望調査では国公立大学落ちた場合の欄に「樹海へHAVE GONE旅行」と答えてしまった。なお教師からは「某国家での強制労働」を進められましたので現在検討中です。

というわけで現在は合格したら卒業旅行できるというご褒美を自分で立ててやる気を保っております。
嘆いても仕方ないというわけで今やっている対策を書いときます。

物理

わかんないところは徹底的に基礎から解く、幸い授業はおろそかにしてないので理解は早いが応用が効かないのでそこもやる。
公式が存在する問題が多く、公式を組み合わせて解く。

化学

センター過去問といてわからないところは周辺分野を確認、図表を見ると目に焼き付くので良い。

数学

ひたすら解いてる。練習あるのみ。抜けた公式は叩き直す。本来は公式の導出を頭で行うが間に合わないので解きまくって覚える。あとわからんやつは時間を区切って飛ばす度胸をつける。

現文

文法的にアプローチをする。特に接続詞に目をつける。「だが」「言うまでもなく」「つまり」のあとは筆者の主張が詰まってるのでそこを解析する。古典との時間の兼ね合い。
絞り込んで、2つの選択肢で悩んだときは、選択肢の傾向(?)を端的に読み取り(明るい感じとか暗い感じとか)、内容に即しているか考える。

古典

文法を覚える。傾向からして接続詞・敬語を覚えると選択肢がある程度絞れる。選択肢が読解のキーとなることもあるので選択肢を読む。

英語

アクセント、発音は解いて外したら繰り返し発音する。文法も解きながら間違えた文法と関連を覚える。長文は先に選択肢に目を通し、目星をつけて特定の文を読む。

地理

一問一答を利用しているが最近効果が見えてきた。グラフを見て頂点になっている理由や減少の理由を覚える。エネルギー利用などが多い。

知っておくと役に立つかもしれない知識(と自戒)

留年をすれば現役生のまま、センターまでの日付を365日伸ばせる。

これはクラスメイト発案ですが、私は成績悪くないので留年できません。
現在、問題となっている「浪人生フィルター」に対して有効な対策と思われる。
試したい方はどうぞ。

受験生全員で協力してセンター0点取れば二次試験一発勝負となる。

一人でも抜け駆けすると失敗します。あと東工大は対応できません。
受験は団体戦(exploit)。

ニトロセルロースはニトロ化合物でなく硝酸エステルである。

硝酸とアルコール(ヒドロキシ基)が縮合重合したら硝酸エステルである(と思う)。

地理の緊急輸入制限は「BLAME!」のセーフガードではない。

私はサナカン。セーフガードの代理構成体。我々セーフガードは、排除する。お前たち、受験勉強のやる気を持たないテオクレ受験生たちを。(映画良かった)

大学入試共通テストは暗記じゃうまく行かない

プレテストの傾向的には、なぜそうなるのか、公式の導出方法、証明方法、長文で誰がどんな発言をしたのか、をしっかり理解できようになっている必要があると思われる。

現代文は文法を駆使して読め

読んでもわかんないもんはわかんない。文法を利用して主張を取り出し、選択肢と比較する。

定期考査勉強はしろ

まずいまずい言いながら何故か一向にやる気が出ず、勉強しだしたかと思えば、センター試験の勉強するくらいやる気が出ない自分、3年間完全無欠(点)は守り抜けるのか…?
追記: 高校三年間、無欠点を貫きました。おまけに評定もAだった。

数学は詰まったら先行け

もう少し悩んだら取れそうな6点よりもその先の40点。(未だに時間を忘れてのめり込んで悲惨な目に合う)

駿台ベネッセ模試を校外(駿台)で受けると、もれなく偏差値50で学年一位になれる

眠いときは寝ろ、睡眠時間を削るな

寝ずにやってもただのお絵かき(字体崩壊)になるぞ…

最後に

ここまで、読んでくださった皆さんには大変申し訳無いが、この文章にはオチというものが存在しない。
みなさんが期待するような文章がかけるように大学で精進していきたいところである。
さてどうこうしているうちにセンター試験まで60日となりそうだ。(きっとこの文章を読んでいるときはもっと近づいているだろう)
文章を書くということはかなり頭に入ることであり、書いているうちにも勉強になった。

大学入学共通テストのプレテストを受けてきた

風邪が治らずグズグズ言い続けて1週間、入試のストレスがキツイなぁ…。

と言いながら数年後に始まる大学入学共通テストとかいうセンター試験の次世代版のプレテストを受けてきました。

受けた科目は英語と数学と理科(物理・化学)だけですが、ちょいと感想を書いておきます。

まず全体的な感想ですが、「思考力・応用力を問う」とだけあって、センター試験より頭を使う問題が非常に多かったです。
すべての教科において、ただ問題を出すのではなく実際の生活や身の回りのものに結びつけようとしてるのがわかりました。

そのため文章量が多く何を聞きたいかを理解するまでに少し時間がかかったこところもあり、よくできているなぁと思いながら解いてました。

英語は発音・アクセント・文法問題がなく、全て長文問題でした。
またセンター試験とは違って、正しい内容のうち、「fact(not a opinion)」や「opinion(not a fact)」と制限されていたことろもあり、ただ書いてあるからだけでなく英文の前後を見てそれが誰かの意見なのか、事実に基づく発言なのかを見極める必要があり、そのために問題文をじっくり読む必要もありました。また「全て選べ」は、すべての選択肢を検討しなければならず、解けたという安心が得られない、なかなか恐怖の問題でした。

リスニングも資格試験に近いような聞き方で、イラストが多く利用されていた印象を受けました。

数学に関しては、ただ与えられた数式を解くのではなく、実生活での問題(今回は階段の規格についてがありました)や公式の証明などが出題され、苦戦しました。(もともとセンター試験でも計算ミスで足を引っ張っている数学…)

物理化学に関しても聞いている内容は現在とほぼ変わらないが、身の回りのものに結びつけたり(物理では電磁誘導でエレキギターが出た)、普段聞かれない聞き方をされたり、現行のものとはかなり違う印象を受けました。

まだ自己採点をしてませんが(感触としては数学を除いて8割程度は行ったかな…?)、格段に難しいというわけでなく、解いてて若干楽しいというような感じでした。
センター試験よりも柔軟でフレンドリーな問題というのがふさわしいと思います。
これから調整されてもう少し軟化すると思いますが、このような特徴が残ってくれると嬉しいです。

…こんなこと書いてますが、自分が受けるのはセンター試験なので、単語帳や過去問を必死に説かなければ…

それではまた。

追記:
自己採点しましたが、得点率はセンターと大体同じでした。(英語とリスニングと化学は8割以上、それ以外は…ウン…精神がすり減る…)

Pydio Cellsのインストール

暑い

というわけでPydio Cellsを入れます。
Nextcloudの使い勝手にどうもなれず、Pydio使いたいなぁって思ってたんですがPHP版のPydioのエラーがわけがわからないし、他に良いサービスないかなぁと思ってたところでした。
Pydio CellsはGolangで書かれてる今時のイケイケサービスらしいのですが、PHP-FPMみたいにポンとおいて動いてくれないのでちょいと面倒です。
サーバを汚すのも嫌なのでDocker上で立てました。

しかぁし…ドキュメントが貧弱なので適当にちょいちょいといじったら動かないしエラーは不親切だし、わけわかめと言いながら一週間立てるのに苦労しました。

ということでまとめておきます。

追記: PHPが要らなくなったので対応

前提条件

Docker 17.09+
Docker Compose 1.17.0+
Nginx 1.14.0+

Docker

まずdocker-compose.yml書きます。


version:            '3.5'

networks:
  external_network:
  internal_network:
    internal:       true

services:
  db:
    image:          mariadb:latest
    restart:        always
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - MYSQL_DATABASE=cells
      - MYSQL_USER=pydio
      - MYSQL_PASSWORD=${PYDIO_PASSWORD}
    command:        [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci]
    expose:
      - "3306"
    volumes:
      - ./db:/var/lib/mysql
    networks:
      - internal_network

  cells:
    image:          pydio/cells:latest
    restart:        always
    ports:
      - "1334:8080"
    environment:
      - CELLS_BIND=${HOST_NAME}:8080
      - CELLS_EXTERNAL=${HOST_NAME}
    volumes:
      - ./static:/root/.config/pydio/cells/static/pydio #staticはマウントしなくてもいいかも
      - ./data:/root/.config/pydio/cells/data
    networks:
      - external_network
      - internal_network
    depends_on:
      - db

volumesの設定い加減ですが、いい感じに書き直してください。
ミソとなるのはCELLS_BINDのホストとCELLS_EXTERNALのホストが同じ、ポートは別ということです。

次に.envを


DB_ROOT_PASSWORD=hogehogepasswd
PYDIO_PASSWORD=foobarpasswd
HOST_NAME=example.com

なんて感じで書いときます。まあ直接docker-compose.ymlに書いてもいいですが、git管理のしやすいから、こうするらしいです。

あとサブフォルダ形式(example.com/cloud/)は今の所できないみたいです。cloud.example.comみたいにサブドメインにしましょう。あとTLSも必須のような気がします。

これでdocker-compose upすれば、Port 1334をリッスンしてくれます。(なんでや!阪神関係ないやろ!)

Nginx

次にnginxの設定です。


server {
#...
#(listenやserver_name、sslの設定を書く)
#...
        location / {
                proxy_pass https://127.0.0.1:1334;
                proxy_set_header Host $host;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
        client_max_body_size    4G;#お好みで
}

ここでキモなのは、
proxy_passにおいて、docker-compose.ymlのportsに指定したIP(または127.0.0.1)を書くことです。
localhostなどと書いてるとIPv6でアクセスしてしまい、インストールは成功するのですが、その後Bad Gatewayで死にます。
あとWebscocket用に


proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

を忘れないことです。

これでnginxを再起動すると、インストール画面が出ます。
データベースの設定ではlocalhostをdbに書き換え、パスワードなどを入力します。

うまく行けばインストール終了後ログイン画面が出るはずです。

あとWebdavにはhttps://example.com/dav/でアクセスできるはずなのですが、できなかったり、同じフォルダが数個表示されたり不安定です。
あとでコミュニティで聞いてみます。

ではでは。

Google Home アプリを申請してリリースした

桜が一気に開花した今頃、桜の木の下を自転車で通り抜けるときの風は暖かいというより暑いですね。

んなことは置いといて、先日面白いものを買いました。

前から気になってたんですが、半額セールを逃してケチ性分のせいで買えないでいたところ、ヨドバシで「5,000円以上の買い物で半額セール」をやっていたので買いました。

すぐさま開封して、設定して、PCから音をキャストしたり、音楽を流したりして、興奮状態だったんですが、やっぱり自分で色々設定したいと思うのが、この世の常。
先日、俺の話を聞け!!LT大会 #8においてDialogFlowの使い方を軽く知ったので、もっと詳しく調べてみることに。
DialogFlowは無料で使えるのですぐにログインして、早速作成。ここらへんの方法は調べたら山ほど出てくるので、飛ばします。

んで、調べたらわかりますが、状況に応じて違う文章を返すなど少し高度なことをしようとするとDialogFlowだけでは、能力不足になります。(それでも文法解析などしてくれて非常にありがたい。)
というわけで、WebHookでバックエンドサーバに投げる必要があります。
調べてるとたいていNode.jsを使ってまして、色々ゴニョゴニョしてるようですが、買った勢いでNode.js環境整備は熱が冷めます。
手っ取り早くかける言語はPHPしか思いつかなかったのでPHPで実装することにしました。

というわけで今回の構成は

PHP-FPM <-(呼び出し・JSON返却)-> Nginx <-(WebHook)-> DialogFlow <-(接続)-> Actions on Google <-(「OK,Google アプリに繋いで」)-> Google Home

なんか見てる限りではJSONで{“speech”:”hoge”}と返しとけば、喋ってくれそうだと思い、すぐさまテストしたんですが、これまた喋らない。
しょうがないからドキュメント見てたらV1 APIとV2 APIがある。V2はbeta版で有効にしてるとV1 APIは使えなくなるらしい。
設定を確認してみるとV2 APIがONになってて、「無意識にONにしてたんだろうな〜」とbetaに無意識に反応する自分の習性を笑いながら読み進めると、「fulfillmentText」を埋めときゃなんとかなることを発見。

おまけに、’payload’ => ‘google’ => ‘expectUserResponse’ をfalseに設定しておくとアプリを終了できることも発見。
これはエラー処理に便利そう。

また、やり取りするJSONにはContextsというのがあり、どのIntentsを動作させるか制御するのに使うみたいなんですが、’parameters’の中に{‘parameter-name’ : ‘body’ }のように好きなデータを
詰め込めるので、サーバーにデータを保存せず、そこから取り出すことでセッション周りも考えなくていい素晴らしい設計になってることも発見。

技術的な話はまあいいとして、たまたま思いついたアプリ(正確にはアプリの移植)を2,3日で完成させまして、テストして修正をしてを繰り返し、まともに動く気がしてようやく欲が満たされました。
しかし、テストアプリは一週間に一度Action on Googleから「Test App」を押さないと使えなくなると判明。
これはめんどくさい。回避するには、隣の「Submit draft for review」を押せと。つまり公開しろという意味らしい。
高揚感に浸ってた自分は、Google Homeアプリをリリースしてみた(申請編) – Qittaなどのページを参考にさせていただきながら、プライバシーポリシーページなどを作成。
気をつけたのは

  • アプリ起動後にユーザが次に何をすべきか、終了方法をすべて音声で案内すること。
  • プライバシーポリシーのページは、個人情報を引き出すつもりはないことを明記すること。
  • 「もう一度」ということで再度読み上げる機能をつけること

こんな感じですかな。
土曜の夜に提出して、月曜になるのを待ってたんですが、日曜のうちに「こんなん相手にされないのではないか。」「実装が信用ならないと言われるんじゃないか。」と不安になるばかり。
そして月曜、早速メールが来てました。
題名は「〇〇 was not approved」でした。どんなどぎついお叱りが書かれてるのかと恐る恐る開けると、なんとも丁寧な文章で「カテゴリ変えたほうがいいんじゃないかな。」とありました。
優しいお言葉に背中を押されて、「あと一回は再挑戦してみようかな」とカテゴリを変えて送信すると、4時間後…

通ってました。
ネットを見る限りは4,5回はやり直しを食らってたので、正直何かの間違いじゃないかと何回もカレンダーの「4/2」を見直しました…4/1じゃない…エイプリルフールネタではない…だと…

で、何作ったのさ

MN2問題集 | Google アシスタント

これです。
もともとアマチュア無線技士3級問題集があったので、「この問題を読み上げて、数字で回答できたら手軽に練習できていいんじゃないの」と思いまして作りました。

もう一個、レビューしてもらいやすいようにと、県庁所在地当てクイズをつけたので、そちらの方も暇なときに遊んでみてください。

問題は思いついたら追加します。

以上、稚拙な文章ですが読んでいただきありがとうございます。

…ところでMN2問題集の「MN2」ってなんだよと思われたかもしれませんが、由来は「MaNa Application Software MoNdaisyu」からの「MNAS MN」からの「MN MN」からの「MN2」なんですが、なにせHSP実装のMN2初版は中学時代の黒産物でして、「MNが二個あるやん。略して短くしたろ。」みたいな軽い気持ちでつけたものです。略し方がガバガバで全くわけがわかんない。今回、別の名前を考えたんですが、アプリのアイコンから察せるようにセンス皆無なので、良い案が出ず、なんのアプリなのかひと目でわかるように「問題集」を付け足して「MN2問題集」となったわけです。「問題集が重複しとるやんけ。」と思ったあなた、そのとおりです。おまけに「エムエヌツー」という発音のしづらさ。自分は「OK Google、問題集」でショートカットを作成してます。

bootanimation.zip覚書

/system/media/bootanimation.zip

まず、無圧縮。
よってdesc.txtがあるフォルダで、

zip -0qry -i \*.txt \*.png \*.wav @ ../bootanimation.zip *.txt part*

とでもしてzipを作る。
次に、rw-r–r– root:rootにしとかないと読んでくれない。


chown root:root /system/media/bootanimation.zip
chmod 644 /system/media/bootanimation.zip

こうしとけば良い。

次に、サウンド。サウンドは各part内にaudio.wavを置いとくと、そのパートに差し掛かったとき再生してくれるが、タイムラグがある。

その他、bootanimation.zipの書き方 :bootanimation format

そいで、最近のAndroidでは/data/local/bootanimation.zipを読まない。
というよりAOSPでどっからか消えたらしい。でもアップデートのたびに焼き直すのは面倒。
んで、Cyanogenmod系列(LineageOSなど)は/system/addon.d/以下にバックアップスクリプト書くことで、消えないようにできるらしい(まだ未確認)
適当にupdate.zip書き換えて、(addonsu-arm.zipあたり)、install用zip作るか、いっそ自力でファイルを作成しても良いが、
/system/addon.d/81-bootanimation.shに


#!/sbin/sh
# Bootanimation設定

. /tmp/backuptool.functions

list_files() {
cat << EOF
media/bootanimation.zip
EOF
}

case "$1" in
  backup)
    list_files | while read FILE DUMMY; do
      backup_file $S/"$FILE"
    done
  ;;
  restore)
    list_files | while read FILE REPLACEMENT; do
      R=""
      [ -n "$REPLACEMENT" ] && R="$S/$REPLACEMENT"
      restore_file $S/"$FILE" "$R"
    done
  ;;
  pre-backup)
    # Stub
  ;;
  post-backup)
    # Stub
  ;;
  pre-restore)
    # Stub
  ;;
  post-restore)
    chown root:root /system/media/bootanimation.zip
    chmod 644 /system/media/bootanimation.zip
  ;;
esac

と書くらしい。post-restoreのところはいらないかも。

Galaxy Nexusで色々実験してると楽しい。

Dynadotでドメインを買った

いい加減覚えやすいドメイン取ろうと思いまして、取ったわけですよ。
第一、MNASなんてなんて読んだらいいかわかんない。(実は命名者本人も読み方がわからない)
すらっと読めるかつそこそこ短いドメインがほしいなと。
そんで、取ったわけですがその際Dynadotを使いました。
というのもWhois代理公開が無料だったり更新料が安定してたり海外の使いたかったりあのWikiLeaksがここで取ってたりしてるからDynadot選びました。

Domain Name Registration : Website Builder : Web Hosting : SSL Certificates : Dynadot.com

左上のSign Inからログイン画面だして、「Create an account」をクリック
色々ゴニョゴニョ英語で書いて、提出したらあっちの営業時間内にメールで「電話番号認証してね。」ってくるんで電話番号(日本国内なら+81から始まる)入れて、表示された番号をかかってくる電話で打ち込んで認証完了。

次にドメインを買うために
Domain Search
で自分のほしいドメインネームを検索し、カートに入れます。
カートから決済に進むとき購入予定ドメインの下の「Domain Privacy」をonにしとかないとWhoisで個人情報がでます(Domain Privacyは無料です。)
次に支払いですが、クレジット(デビット)カードかPaypalを選ぶのが無難です。
あと支払い単位はUSDにしておくのがレートで一番安そうです。
入金確認は手動のようなので太平洋時間で昼間になるまで待ちましょう。
購入が完了するとDomains=>Manage Domainsでネームサーバーや無料簡易ホスティングやDNSレコードの記述ができます。Auto renewもあるので設定したければどうぞ。
海外だから色々心配したけど、特に問題なく進んだのでよかった。

SSL証明書のCSRについて

FujiSSLの証明書を買った

あらたなドメインを取ることとなったので、また買うとき(ドメイン取得料とSSL証明書購入料セット感覚)、

どうせ真っ白にされるしCSRのState or Province Nameに自分の住所書いて出したら、ドメイン所有権確認後、見事にセキュリティチェックに引っかかって、見事干されました。
申請したのは金曜夕方なので月曜まで干される。
土日にしようと思ってたができないので恐縮だがキャンセルして、再び取得
Whoisに合わせてCSRを作って提出したら一分なしに公開鍵が届いた

[教訓]CSRの情報はDV証明書であってもWhoisに合わせよう