あさた研メモ

主に私が気づいたこととか困った時のメモとか書き留めとく用。

javascriptのJSONパースで嵌った

この記事は未解決です。

書いたコード

family.json

{
    "list":[
        {
            "id": 1,
            "name": "波平",
            "parent": null,
            "marrige": 2,
            "children": [3,4,5]
        },

        {
            "id": 2,
            "name": "フネ",
            "parent": null,
            "marrige": 1,
            "children": [3,4,5]
        },

        {
            "id": 3,
            "name": "サザエ",
            "parent": [1,2],
            "marrige": "6",
            "children": [7]
        },

        {
            "id": 4,
            "name": "カツオ",
            "parent": [1,2],
            "marrige": null,
            "children": []
        },

        {
            "id": 5,
            "name": "ワカメ",
            "parent": [1,2],
            "marrige": null,
            "children": []
        },

        {
            "id": 6,
            "name": "マスオ",
            "parent": null,
            "marrige": 3,
            "children": []
        },

        {
            "id": 7,
            "name": "タラオ",
            "parent": [3,6],
            "marrige": null,
            "children": []
        }
    ]
}

sazae.js

$(function(){
  $.getJSON("json/family.json", function(){
    console.log("success!");
  });
});

Chromeで確認

F12とか押してConsoleを確認。すると…

XMLHttpRequest cannot load file:///Users/test/Project/json/family.json.Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.

なんじゃこりゃ。

原因

Chromeではセキュリティ上の観点から、ローカルファイルにリクエストを送ることができないみたい?

ajax使わないようにしても、Chromeでは動かず、Firefoxなどでは動く。

わけがわからないのでだれか原因と対策を教えてください…。

追記

Chromeではajaxでローカルファイルにアクセスするのはセキュリティ上無理ということですが、
jQueryだろうとなんだろうと駄目なので、おとなしく他ブラウザ使ったほうが良さそうです。 試しにXMLHttpRequestでやってみましたが駄目でした。

対策としては、おとなしくどっかのサーバに上げるとかが良さそうです。

Xamarin無料化を実感してみた

個人的な話

ぼくはそれなりにWindowsが好きなので、もっといっぱい活用したいといつも思っていました。
つい先日、夏の大型アプデでbashが実装されると聞いたときは本当に嬉しかった。
さらに、Xamarinが無料ときた。
Xamarinなんて使ったことないけど、せっかく無料になったんだし入れてみることにしました。

Xamarinのインストール

ここが公式サイト。
公式サイトからさっとダウンロード・インストールです。
ちなみにぼくはなぜか、セキュリティソフトにダウンロード先が危険なWebページとか言われた。

結構時間かかります。
なんせSDKとか入れるし。
f:id:asataken:20160405093813p:plain

使ってみる

ぼくはMacを持っていないので、AndroidAppにします。
Visual Studioを開いて…
NewProject -> C# -> Android -> BlankApp
んで作成。 ここで気づく。ぼくC#わからない。
まぁいいや。

ソースを見る限り、どうもボタンクリックするとカウントが増えるだけのAppのよう。
そのままビルドボタン押してみました。

ビルドにめちゃくちゃ時間かかります。
ぼくのPCのスペックの問題もあるけど。
5分位放置してたらメニューにAppが追加されているのでそれをタッチして読み込みました。
f:id:asataken:20160405093816p:plain

f:id:asataken:20160405093819p:plain

なるほど。

感想

実はほかにも色々試そうとは思っていましたが、なんせビルドが遅いので諦めました。
AndroidStudioとかそういう系使ったことないので、AndroidAppのビルドってこんな時間かかるんだなあって感じでした。

VisualStudio使い慣れている人にとっては特に嬉しいのではないでしょうか。
補完もバッチリだし、UIもなんかカッコいいし。

どうも調べてみると、UI作成も頑張ってコードを書く感じになるようです。
UIを直感的にいじることはできないので、ぼくみたいなApp制作未経験の人にとってはちょっと難しいかも?

iOSAppも作れるので、Mac持ってる人はWinで作ってMacでビルド、みたいなことができるようです。
XamarinStudioで作れよって思うかもしれませんが、まぁVisualStudioのほうがいいって人も多いですしね。
あと、同じコードでAndroidiOSのほかにWindowsPhoneのAppも作れるので、オトクな感じもします。

モバイルアプリを作りたい人にとって、Xamarinが無料になったのはとても大きな一歩なのではないでしょか。
なかなか良い感じだな、とぼくは思いました。

ではでは。

追記

指摘を受けて調べたら、デザイナーありました!!!!
f:id:asataken:20160405101746p:plain

ソリューションエクスプローラを右クリック -> 追加 -> 新しい項目
から、Android Layoutを選択して、
ソリューションエクスプローラのResources -> Layoutに入ってる○○.axmlってやつを開くと、デザイナー開くみたいです。
ご指摘ありがとうございました。

0-1ナップザック問題解いた

この記事は PMOB Advent Calendar 2015 の 15 日目の記事です.

この前授業の課題で0-1ナップザック問題をソルバで解いてねって感じの問題が出たのでサッと書きました。

pythonpulpとかいうglpk使って解けるモジュール?(よくわからない)あったので、それを使ったらあっさりでした。
以下コード

#! /usr/bin/python
# encoding: utf-8

import pulp

# コンストラクタ
prob = pulp.LpProblem('knapsack', pulp.LpMaximize)

# 詰める荷物の数
print('num of obj: ', end='')
n = int(input())

a = [pulp.LpVariable('baggage{0}'.format(
    i), cat=pulp.LpBinary) for i in range(n)]
v = []
s = []
for i in range(n):
    print('[{0}]'.format(i))
    # 荷物の価値
    print('value: ', end='')
    v.append(int(input()))
    # 荷物のサイズ
    print('size: ', end='')
    s.append(int(input()))

# ナップザックの容量
print('knapsack capasity: ', end='')
b = int(input())

# 目的関数
prob += pulp.lpDot(v, a)
# 制約条件
prob += pulp.lpDot(s, a) <= b

# 問題も表示しておく
print()
print(prob)
prob.solve()

# 結果
print("Result:")
for i in range(n):
    print(a[i].getName(), int(a[i].value()))

lpDotとかいうリストの内積求めてくれる奴がめっちゃ便利でした。
ていうかソルバ神か

トイレカウントbotを作った話

この記事は PMOB Advent Calendar 2015 の 6 日目の記事です.

最近こんなのを作りました。
github: https://github.com/asatake/toilet_count
Twitter: https://twitter.com/toiletcount

すごくしょうもないTwitterBotです。
これに関してちょっと話そうかと。

なぜこんなアホなもの作ったのか

しょっちゅうトイレ行くしトイレ行きたいってツイートする友人がある日
「トイレってカウントして欲しい」
的なこと言ってたので、まあいい勉強になるだろうと思い、つくりました。

構想

以前にupdate_nameを作ってたので、それを応用すれば作れるでしょ、みたいな甘い考えではじめました。

累計カウント数と一日の回数をそれぞれ覚えておきたいなあと思い、
んじゃなんか外部ファイルに記憶しておこうと考えました。

最初CSVにしようとしたら、しゃみそん君にいやそれ遅いでしょ、と言われたので、
dbファイルにSQLで〜みたいな雰囲気をやることにしました。

苦労したこと

そもそもちゃんとDBやったことない!

ということでささっとググッて何回もエラー出しました。

本当は「toilet」もカウントしたかった

botのアカウントIDが@toiletcountで、それと被る!
@toiletcountはカウントしないで、toiletはカウントする、みたいな正規表現書けなかった。

デプロイが一番きつい

Herokuだと時間制限があるから、じゃあ借りてるサーバに置いとこうと思ったらこれが大変でした。
既にupdate_nameを動かしてあるので、それと一緒に動かすためにシェルスクリプト書いて、
それをsystemdのserviceで管理する、という方法を取ったのですが…
なんかいっぱいエラーでちゃった…。
python3系で書いてるのですが、指定してるのになぜかpython2で実行しようとしたり、
dbファイルがなぜかreadonlyになってたり…。
もうやけくそで、強引に解決しましたので、今は多分ちゃんと動いてるはずです。

最後に

Twitterbot作るの、やっぱり楽しいです。
コーディングはとても苦手なので、いっぱい叩かれそうですが…。
みなさんもぜひ、自分のオリジナルのTwitterBotを作ってみましょう!

flaskで作ったサイトをherokuにデプロイした

環境構築

今回はpython3.4を使用しました
使用OSはAntergos(Arch Linuxとほぼ同じ)

pythonz+direnv

あらかじめこの辺入れときます

build-essential
zlib1g-dev
libbz2-dev
libssl-dev
libreadline-dev
libncurses5-dev
libsqlite3-dev
libgdbm-dev
libdb-dev
libexpat-dev
libpcap-dev
liblzma-dev
libpcre3-dev
curl
python-pip

pythonzをインストールします

次のコマンドをシェルで打っときます

$ curl -kL https://raw.github.com/saghul/pythonz/master/pythonz-install | bash
$ echo [[ -s $HOME/.pythonz/etc/bashrc ]] && source $HOME/.pythonz/etc/bashrc' >> $HOME/.bashrc
$ exec $SHELL

zsh使ってる人は出力先を.zshrcにしましょう(その前のbashrcは直さない)

virtualenvをインストールします

direnvに必要です

$ sudo pip install virtualenv

direnvをインストールします

$ curl -L -o direnv https://github.com/zimbatm/direnv/releases/download/v2.5.0/direnv.linux-amd64
$ sudo install direnv /usr/local/bin
$ echo 'type direnv > /dev/null 2>&1 && eval ") "$(direnv hook bash)" ' >> $HOME/.bashrc
$ exec $SHELL

zsh使ってる人はbashって書いてあるところをzshに直しましょう

pythonzでpythonインストール

$ pythonz install 3.4.3

これでpythonのインストールもオッケーです

プロジェクト作成

プロジェクトを作りたいディレクトリに移動して、mkdirでフォルダを作ります
ここでは仮に「flasktest」というフォルダを作ったことにします

direnvに必要な.envrcを作ります

$ echo 'layout python $(pythonz locate 3.4.3)' > flasktest/.envrc
$ direnv allow flasktest

この後、$ cd flasktest でディレクトリに入ると、開発環境の初期化が行われます
終わったら、一応pythonインタプリタを実行して、バージョンを確認してみてください

そうしたら、ディレクトリ移動をしないで、ライブラリをインストールします

$ pwd
/home/flasktest
$ pip install Flask

開発

あとは頑張って開発です
pycharm使うと便利です
pycharmとかを使う場合は使うインタプリタを開発環境のものにしてください
場所は

$ pythonz locate 3.4.3

でわかります

私の作った奴はこちらです
asatale/flasktest

Herokuにデプロイ

まずはherokuの登録

公式サイトからユーザ作っときます
次にheroku-toolbeltというのを入れます
apt-getとかyaourtで簡単に入ります

必要なものを入れます

$ pip install gunicorn

Procfileやその他諸々必要な書類作成

$ echo 'web: gunicorn flasktest:app --log-file=-' > Procfile
$ pip freeze > requirements.txt
$ echo 'python-3.4.3' > runtime.txt

.gitgnore作ります

direnv
*.pyc

gitで管理します

$ git init
$ git add .gitignore
$ git add .
$ git commit -m 'first commit'

Herokuにデプロイします

$ heroku login
$ heroku create
$ git push heroku master

確認します

$ heroku ps:scale web=1
$ heroku ps

これでcrushとか書いてなければオッケー

$ heroku open

これでページを確認できます

なにか問題がありそうなら、

$ heroku local

とやるとローカル環境でページを確認できます

感想

思ってたより簡単だった。
flaskは軽量なのでサッとテストできていい感じ。
herokuの設定に手こずったけどなんとか動いてるっぽい。
asataken

参考文献