kazubits のすべての投稿

ARM版Windows 10のバイナリトランスレーション

ARM版のWindows 10が発表されましたね。興味深いのは、ARM版でも、x86版のソフトウェアが動くことです。どうやっているかというと、x86版のソフトをバイナリトランスレーションして、ARMの命令に変換して動かしているのです。

明らかになってきたArm版Windows 10の課題とそのメリット

QEMUでやっていることと同じなので、どれくらい速度が出るのか気になるところです。記事を読むと、Win32のシステムコールにトランスレートした後、呼び出すDLLはネイティブの物を使うようです。この辺が、全部トランスレートして動かすQEMUと違うところでしょうか。サポートするのも32ビットのバイナリのみで、64ビットのソフトは動かないようです。Officeの32ビットが動けばいいやという感じでしょうか。

Intelが自社のチップのスマホで、ARM版のバイナリをx86の命令にトランスレートして動作させていますが、それとは全く逆のことをやっていますね。

Snapdragon 835だと、Cherry TrailとCore i3の間くらいの速度だそうです。あまり速度は気にならないような使い方がメインなのでしょうか。

動作速度より長時間使えることの方が、大切なのかもしれません。

来年には、Snapdragon 845が出るそうですから、そちらの方がいいような気がします。

ともあれ、実際に出てきたときはそれほど高いものにならないといいなと思います。

Windows 10をFall Creators UpdateにアップデートしたときのVMware PlayerとVirtualBox

Windows 10をFall Creators Updateにアップデートしました。

VMware Workstation Player 12.5.5のネットワークがつながらなくなりました。アプリと機能ー>プログラムと機能 から修復を選んで修復。その後、VMware Workstation Playerの設定画面のネットワークアダプタの設定で、VirtualBoxのアダプタを外すことでネットワークにつながりました。

VirtualBoxは動かなくなったので、古いものはアンインストールしてVirtualBoxをダウンロードしてインストールしました。最初5.2.0をインストールしたのですが、画面の大きさが1024x768の固定になってしまったので5.1.30に変えました。5.2系はまだインストールするには早いようです。

Webフレームワークとして使われるDjango、Flask、Ruby on Rails、Sinatraの動向

このところWebフレームワークを調べていて、実際のところ何が一番使われているのか気になりました。

そこで、Stack Overflowでトレンドを調べてみました。調べたのは、Django、Flask、Ruby on Rails、Sinatraです。

次の図が、Stack Overflowにおける過去8年間の質問の割合いを示しています。青がRuby on Rails、橙色がDjango、緑がFlask、赤がSinatraです。

webframework

なんと、今年2017年にDjangoがRuby on Railsを抜いています。また、Flaskは増加しており着実にユーザーの数を増やしていることがうかがえます。また、Sinatraは拡大してみるとRuby on Railsと同様に減少傾向にあります。

Stack Overflowでの質問の数で、一概にユーザーの数がわかるわけではありませんが、初心者の数はRuby on Railsに比べてDjangoの方が増えているのではないかと思います。

Ruby on Railsが減少傾向にあることが気になります。近くの本屋さんでも、Ruby on Railsの本はあまりありません。とういことは、これからRuby on Railsを勉強しようという人がいないということであり、近い将来Ruby on Railsを使う人が減ってしまうことを意味します。

それに対して、Djangoは一定の数を保っていますし、Flaskは増加傾向にあります。近くの本屋さんでも、Pythonの入門書がたくさん置いてありますし、これから学ぶ人が増えていくのではないかと思います。

現状Ruby on Railsのプロジェクトは多いですし、スタートアップ企業では使われていくでしょう。しかし、これからのことを考えるとPythonが確実に広まっていくのかなと思います。

MySQLを同一サーバーで複数立ち上げた時の接続方法

MySQLのレプリケーションを勉強しています。同一サーバーで2つのMySQLを動かしたのですが、スレーブへの接続が難しかったので紹介します。

プログラムは、Oracleのバイナリを使い、Ubuntuのパッケージはアンインストールしました。MySQLのバージョンは5.7.18です。

インストールは、やさしく学べるMySQL運用・管理入門【5.7対応】を見て行いました。

インストール後、同じホストでMySQLをマスターとスレーブで2つ立ち上げました。

起動は簡単で、コンソールを2つ開いてそれぞれ別個に構成ファイルを指定して立ち上げます。

./mysqld --defaults-file=../etc/my.cnf &
./mysqld --defaults-file=../etc/my-slave.cnf &

もちろん、my.cnfとmy-slave.cnfのserver_idや、datadirは異なっています。スレーブ側のportは3307、Unixソケット名は/tmp/mysqlslave.sockです。

ここで、mysqlクライアントでマスターとスレーブの両方に接続しようとしましたが問題が起こりました。次のように2つ接続しましたが、結果は両方ともマスターにつながりました。

./mysql -uroot
./mysql -uroot -P3307

自分は、スレーブ上で作業していると思い込んでいて、マスターにマスターのスレーブになれと命令してしまいました。もちろんエラーになってそんなことできません。

調べてみると、接続方法としてLinux上ではTCP/IPではなく、Unixソケットが優先されるのだそうです。port番号だけでは無視されます。ホスト名にlocalhostを指定してもだめでした。

NGの例

./mysql -uroot -P3307
./mysql -uroot -hlocalhost -P3307

そこで、スレーブに接続するには次のようにIPアドレス127.0.0.1を使うかソケット名を使うと接続できました。--protocolオプションでTCPを指定しても接続できます。

OKの例

./mysql -uroot -h127.0.0.1 -P3307
./mysql -uroot --host=127.0.0.1 --port=3307
./mysql -uroot -P3307 --protocol=tcp
./mysql -uroot -S/tmp/mysqlslave.sock
./mysql -uroot --socket=/tmp/mysqlslave.sock

ホスト名は、localhostだとUnixソケットで、127.0.0.1とIPアドレスにするとTCP/IPが使われます。なんという仕様でしょう。

--protocolオプションでプロトコルを指定すればOKです。

ソケット名を-Sオプションで指定するともちろん接続できますが、ソケット名を一つ一つ覚えるのは大変です。

mysqladminも同じ仕様のようです。気をつけましょう。

『入門Python3』を読んで

入門Python3』を読みました。読みごたえがあって1か月ぐらいかかりました。

内容は、文字列やリスト、辞書といった基礎的なことから始まり、ウェブや並行処理、ネットワークの話まで広く解説がされています。

いろいろ勉強になりましたが、初心者の人には難しいと思います。どちらかというと、簡単なプログラミングの話はわかる人、ほかのプログラミング言語をやったことのある人向けのように思います。

丁寧に解説されていますので、内容がわからないといったことはありません。

各章に練習問題があり、その模範解答が章末にあるのがよいです。やはり問題を解かないとプログラミングの力はつかないですし。

自分の場合は、もう少し文字列やリスト、タプル、辞書の使い方を勉強したいなと思いました。いろいろな分野でPythonが使われていて面白かったですけど。

プログラミングは、Windows上のMSYS2で行いました。virtualenvを使って仮想環境を作りました。それには、MSYS版のPython3を使わないといけませんでした。ライブラリはほぼpipでインストールできましたが、ZeroMQだけはできませんでした。MinGW版のPython3にはmingw-w64-x86_64-python3-pyzmqというパッケージがあるのでこれを使いました。geventやfabricというパッケージのインストールにはとても時間がかかりました。最初フリーズしたのかと思いました。でも、使えるのですごいです。

これで、RubyとPythonの両方の入門書を読んでみました。ウェブで使う分にはどちらもあまり違いがわかりませんでした。最近の本屋さんに行くとPythonの入門書がとても多く、これからはPythonの時代のようにも思います。海外では、Pythonのようですので一時的な流行りでもなさそうですし。

ウェブサービスの作り方を勉強したいので、Flaskというフレームワークがいいかなと思っています。Djangoもやってみましたけど、大きすぎてもう少し簡単なフレームワークを使ってみたいなと思います。

Ruby on Railsチュートリアルをやってみて

Ruby on Railsチュートリアルを一通りやってみました。

Railsで何をやるのかはなんとなくわかったでしょうか。

でも、覚えることが多くて一回ではなかなか理解するところまではできなかったです。

テスト駆動開発というのを本格的に習った感じですが、変数名をtypoするとすぐに表示されたりして、変数の宣言が動的なRubyでは必須の開発方法だなと感じました。なにより、便利です。

Windows上で開発するのはバージョンの関係があって少し難しいなと思います。もちろん学習目的ならなんとかできましたけど。HerokuにデプロイするならLinux上の方がいいなと思いました。

VMwareやVirtualBoxを使ってとなります。VirtualBoxは、個人的な感想ですが、キーを押して文字が表示されるまでのタイムラグが気になります。ほんの少しなのですが、タイピングの気分が違ってくるのです。その点では、VMware Playerの方がいいのかなと思っています。

プログラム初心者には、Ruby on Railsは難しいなと思います。初心者の方は、プログラムを書いて動作することを覚える必要があります。一方、Railsは書かないでも動作するように設計されています。まずは書いてみて慣れてから、Railsの簡潔さに触れるのが正しい学習の順序ではないかと思います。

次は、もう少し軽量なSinatraというフレームワークを触ってみます。

Ruby on Railsチュートリアルに書いてないけど大切なこと

Ruby on Railsチュートリアルを一通りやってみて、とても難しいなと感じています。

原因は、覚えなくてはいけないことがあまりに多いこと。Convention over Configurationというコンセプトはいいのですが、構成ファイルより規約をということは、規約を覚えなければソースコードを読むこともできないということです。

チュートリアルでは、丁寧に説明されていますが、それでもわからないと感じたことがあるので調べてみました。

ここでは、わからないことのなかから大切だと思う2つを取り上げます。

ルーティング

RESTfulなインターフェースを一言でいうと、あるアドレスにアクセスするとあら不思議、入力したデータを保存したり変更、削除ができてしまうということです。普段インターネットを見ているには、表示することしかやっていないです。それを拡張したと思えばよいでしょう。

そのようなアドレスと処理するメソッドを結びつけるのがルーティングです。どこにアクセスしたら何をするかを表しています。チュートリアルで勉強してみて、一番大切ではないかと思っています。

Railsがどのようなルーティングを設定しているかを表示するのがrails routesというコマンドです。

rails routes

このコマンドで、次のような表が得られます。

                 Prefix Verb   URI Pattern                             Controller#Action        
    password_resets_new GET    /password_resets/new(.:format)          password_resets#new      
   password_resets_edit GET    /password_resets/edit(.:format)         password_resets#edit     
                   root GET    /                                       static_pages#home        
                   help GET    /help(.:format)                         static_pages#help        
                  about GET    /about(.:format)                        static_pages#about       
                contact GET    /contact(.:format)                      static_pages#contact     
                 signup GET    /signup(.:format)                       users#new                
                        POST   /signup(.:format)                       users#create             
                  login GET    /login(.:format)                        sessions#new             
                        POST   /login(.:format)                        sessions#create          
                 logout DELETE /logout(.:format)                       sessions#destroy         
                  users GET    /users(.:format)                        users#index              
                        POST   /users(.:format)                        users#create             
               new_user GET    /users/new(.:format)                    users#new                
              edit_user GET    /users/:id/edit(.:format)               users#edit               
                   user GET    /users/:id(.:format)                    users#show               
                        PATCH  /users/:id(.:format)                    users#update             
                        PUT    /users/:id(.:format)                    users#update             
                        DELETE /users/:id(.:format)                    users#destroy            
edit_account_activation GET    /account_activations/:id/edit(.:format) account_activations#edit 
        password_resets POST   /password_resets(.:format)              password_resets#create   
     new_password_reset GET    /password_resets/new(.:format)          password_resets#new      
    edit_password_reset GET    /password_resets/:id/edit(.:format)     password_resets#edit     
         password_reset PATCH  /password_resets/:id(.:format)          password_resets#update   
                        PUT    /password_resets/:id(.:format)          password_resets#update   
             microposts POST   /microposts(.:format)                   microposts#create        
              micropost DELETE /microposts/:id(.:format)               microposts#destroy       

どこにアクセスしたら(URI Pattern)、何を呼び出すか(Controller#Action)がわかります。

例えば、/usersにアクセスしたらusers#indexを呼び出します。つまり、users_controller.rbにあるUsersControllerというクラスのindexアクションメソッドを呼び出します。

実はそれだけでなく、プログラムの中でどのようなメソッドや変数が使えるかもここから読み取れます。

Prefixと書いてあるものに、_urlや_pathをつけるとアドレスを表すことができます。上の例では、password_resets_newに_urlをつけて、password_reset_new_urlでhttp://www.example.com/password_resets/newという絶対アドレスになります。_pathをつけて、password_reset_new_pathだと、ホスト名を除いた/password_resets/newという相対アドレスになります。

また、edit_userのところのように:idというアドレスがつくものは、そこに数字が入ることを意味します。たとえば、/users/1というアドレスにアクセスしたら、プログラム上では、params[:id]=1として扱うことができます。

:idに数字が入るということは、アドレスにどのユーザーにアクセスしたいのか指定しなければなりません。そこで、プログラム上でedit_user_pathだけでは不十分で、edit_user_path(@user)というようにユーザーを指定して使うことになります。

VerbのGETやPOSTは、methodの種類です。同じアドレスにアクセスしてもmethodを指定することで違うことができると思えばいいでしょう。

Webアプリケーションは、あるアドレスにアクセスすることですべての動作が始まりますので、ルーティングはとても大切です。この表の読み方だけでも十分理解できると、後の理解の助けになると思います。

変数やアクションメソッドのスコープ

Ruby on Railsチュートリアルをやっていると、いろいろなファイルが出てきて、結局どのファイルでどんな変数やメソッドが使えるのか理解に苦しみました。

簡単にまとめると、ビュー内ではヘルパーすべてが使えます。コントローラー内のメソッドは使えません。

コントローラー内では、application_controller.rbでモジュールをincludeすることでそのコントローラーに関連する以外のヘルパーが使えるようになります。

モデルで定義したクラスは、コントローラー内で使えます。

もう少し詳しく説明します。

まず、app/viewsフォルダの中では、app/helpersの中で定義されたメソッドがすべて使えます。

app/controllers内ではshowやdestroyなどのRESTfulなアクションメソッドを書いて、app/helpers内のヘルパーにそれを補助するメソッドを書くのがいいです。

また、app/controllers内だけで使って他で使わないものは、そのファイルの中でprivate宣言の後に書くといいです。

次に、app/cotrollers内ではapp/controllers/sessions_controller.rbとapp/helpers/sessions_helper.rbのように関連するヘルパーのメソッドは使えます。しかし、関連しないusers_controller.rbからsessions_helper.rbはそのままでは使えません。そのため、app/controllers/application_controller.rb内でinclude SessionsHelperと指定することでcontroller内でsessionに関するメソッドが使えるようになります。

このとき、ファイル名はsessions_helper.rbですが、その中で定義されたモジュール名はSessionsHelperと表記方法が変わっていることに注意してください。

その他には、app/controllers内で@userのようにインスタンス変数を設定すると、それがapp/views内で使えます。app/viewsは通常のRubyのファイルではなく、controllerから呼び出されて使われるものというイメージです。

まとめ

Ruby on Railsチュートリアルをやってみて、あまり説明されていない2つを調べました。ルーティングと変数のスコープを把握しているとプログラム全体の構成がわかりやすくなります。

Railsは、規約が多いのでそれを覚えるだけで大変ですね。でも、重要度にいろいろとあると思うので、大切なものから理解していきたいものです。

Ruby on Railsチュートリアルでクッキーの削除を確認

Ruby on Railsチュートリアルの8.3演習2のクッキーの削除を確認しました。

最初、どうやって確認したらよいのかわかりませんでした。

同じように困った人がいて、次のような疑問が出ています。

railsログアウト時のCookiesの状態

まず、Chromeの設定、詳細設定、コンテンツの設定、Cookieというところで、クッキーの値を変化をログアウト前後で見てみたのですが、変化はありませんでした。

結局、Chromeのデベロッパーツールを開き、ApplicationのCookiesというところでクッキーの値を調べると、ログアウト前後で値が変わっていました。

チュートリアルでは、session.delete(:user_id)で:user_idの項目だけ削除しています。そのため、クッキー自体がなくなるわけではなく、その暗号化された値が変わるのを確認することで、削除されたことがわかります。

Chromeの設定画面では、その変化を表示できないようです。

なお、クッキー自体はChromeを閉じると消えてしまいます。

Ruby on Railsチュートリアルでbcryptのエラー

Ruby on Railsチュートリアルでbcryptのエラーが出ました。環境はWindows上のMSYS2+Ruby 2.4です。

C:/Ruby24-x64/lib/ruby/gems/2.4.0/gems/bcrypt-3.1.11-x64-mingw32/lib/bcrypt.rb:16:in `require': cannot load such file -- bcrypt_ext (LoadError)

こちらのようにしたら動きました。最後の'bcrypt-ruby'を設定する方法です。

gem 'bcrypt' で起動時Error&ページアクセス時にもError

bcrypt 3.1.11でWindowsの修正が入ったという情報がありますが、なぜか動ないんですよね。