みの屋.

プログラムを書いてる時に躓いたことやコードの進捗などをメモでまとめていく予定です.(ついでに日常のつぶやきもちらほらと……)

【Rails】jqueryが適用されてなかったお話

久々にRailsでツールを作っているのですが、そこでなぜかjqueryが動かないという問題発生.

結果、jqueryの導入がうまくできていないことが判明したのですが、それに気づいたきっかけと導入までにかなり躓くことが多かったのでメモー.

その時使用していた環境

ちなみに、知らない間にjqueryの導入方法が変わってしまっていたのが地味に衝撃(&混乱の原因)でした.
(ちょっと触らなくなったうちにツールはどんどん変化してしまうものですね…)

では、実際に私がjqueryがなぜ動作していないか気づいたきっかけからです.

jqueryが動いていないのに気づいたきっかけ

実はこの時、実装で画面に表示されているフォームを動的にjqueryを使って増やそうとしていたのですが、なぜかボタンを押してもフォームが増えない.

Railsのサーバーコンソールにもそんなエラー書かれてない.

????

となっていました.
そこで最後にChromeブラウザについている
開発/管理」→ 「デベロッパーツール
からページ内部のエラーを確認したところ、以下のようなエラー発見.

Uncaught ReferenceError: $ is not defined

このエラーは… jqueryがきちんと導入できていない時に主に起こるエラーです.

つまり、jquery使おうとしてるのにjqueryが存在してない(or導入できてない)ことが動かなかった原因でした

そりゃないものは動かないですよね……

jqueryの導入

では、早速jqueryを導入するためにgemでいつも通りgemでインストールしようとしたのですが、ここでも一つ罠がありました.

Rails5までは assets/javascript/ というフォルダがあってgemインストール後にそこにあるファイルに設定を書き込んでいくはずなのですが、
まずassetsファイルの下にjavascriptというフォルダがない!

少し調べてみるとこちらのサイト様よりRails6からjqueryはWebpackで管理するようになったとのことでした.

qiita.com

jqueryの導入方法

そこで早速先ほどのサイト様を参考にさせていただいて以下のようにjqueryを導入していきます.
(ここからは上記の参考サイト様とほとんど同じ方法なので、どちらを見ても同じ感じになると思います.)

まずyarnで以下をインストール.

$ yarn add jquery

gemでインストールする必要はなくなったみたいです.

次に app/javascript/packs/application.jsに以下を記述します

require("jquery")

次は config/webpack/environment.jsに以下を記述します.

const webpack = require('webpack')

environment.plugins.prepend('Provide',
  new webpack.ProvidePlugin({
    $: 'jquery/src/jquery',
    jQuery: 'jquery/src/jquery'
  })
)

ここまで記述したらjqueryを使うための設定は完了です. そのままRailsサーバを再起動するとjqueryが動くようになっていると思います.

私の場合ここまでたどり着くのにかなりな時間使ってしまったので、もし同じ人がいれば参考になると嬉しいです. 「Rails」だけで検索するといろんなバージョンのサイトが出てきてしまうのでやっぱり使っているバージョンも合わせて検索しないと穴にハマりやすいので気をつけたいです……

時折使うのに忘れてしまいがちなコマンド備忘録 Part.2 【Ubuntu編】

前回はMacを使う際の忘れがちなコマンド(Mac関係ないものも少し含む)をメモしたので,今回はUbuntuを使う際のちょっとしたコマンドやショートカットキー等をメモメモ.
Ubuntuは研究のために最近使い始めたばかりなので意外と基本的なもの&偏ったものばかりです……

因みに,今回メモした項目は以下になります.

  • Ubuntuでの外部ストレージデバイスのパス
  • Ubuntuのパスワード変更方法(コマンド編)
  • ターミナルでCPU使用率を確認

コマンドメモ

Ubuntuでの外部ストレージデバイスのパス
/media/ユーザ名/デバイス名

Macはまた別のパス名なので,うっかりMacのパス名で調べて無いってならないように注意しなければ……

Ubuntuのパスワード変更方法(コマンド編)
sudo passwd ユーザ名

パスワードを入力する際には入力しても何も表示はされないので入力ミスに注意!!

UbuntuターミナルでCPU使用率を確認
> top

……たったこれだけです.topコマンド一つで以下のようなリストがターミナルに表示されます.
(終了したいときはqを押してください)

f:id:Minoya:20180819225633p:plain

時折使うのに忘れてしまいがちなコマンド備忘録 Part.1 【Mac編】

時折必要なのにいつも覚えていなくてググっている…
なんてことが最近割と増えてしまったので,ごちゃ混ぜだけどここに備忘録代わりにメモメモ.
最近はJetson(Ubuntu)も触り始めたのでまだまだ備忘録は増える予定……
とりあえず今回はMac関連(?)で!!

因みに,ここにあるメモの一覧↓

  • 外部ストレージデバイスディレクトリパス
  • 現在使っているShellの確認
  • ssh キーの作成
  • ローカルからサーバにファイルを送る

コマンドメモ

外部ストレージデバイスディレクトリパス
/Volumes/デバイス名

これはMacだけっぽい.Ubuntuとかはこのパスが使用できないらしいからまた今度メモする.

現在使っているShellの確認
echo $SHELL
sshキーの作成
(~/.ssh内で)
ssh-keygen

この後2つのファイルが生成されるので,サーバ等に渡すのは公開鍵の(.pub)の方.
configの方も以下のように追加編集する.

Host ホスト名(`ssh ホスト名`で繋がるようになる(名前は自由設定))  
     HostName           サーバーのアドレス  
     IdentityFile       ~/.ssh/秘密鍵名  
     User               サーバのユーザ名
ローカルからサーバにファイルを送る
rsync -av 送るファイルパス 送り先のIPアドレス:送ったファイルの保存先名

オプションの-avは,
-aアーカイブモード(これを指定することでなるべくコピー元のファイルと同一条件でコピーする)
-v:詳細の出力

とりあえずファイルをそのままコピーしたかったら-aをつけておけば大丈夫そう.

今日までのハイライト

結局,学校が始まってから全然ブログが書けていなかったため一旦忘れないように現在までの報告などなど……

今までの進捗(研究の)

………実は…(ほとんど)なんの成果も出せませんでしたぁぁぁぁぁ!!!!!!
ほんとこの2ヶ月何してたんだ私……

 

今,私の卒研はとある企業さんとの共同研究なのですが,まず私の知識が圧倒的に足りない…!!

教えてくださるエンジニアさんは県内屈指の機械学習の知識を持っている方なのですが,私たち学生のために初歩の初歩から機械学習を丁寧に理解できるよう教えてくれていてとても親切な方です.本当感謝です.

そして当の私はというと,2ヶ月で理解できた項目は,

  • パーセプトロンの理解,実装
  • 3層のニューラルネットの仕組みの理解,
  • 活性化関数(シグモイド,ReLU,ステップ関数等)それぞれの特徴と,活性化関数は必ず非線形出なければならないこと.
  • ニューラルネットの多次元配列で実装する仕組みの理解
  • 出力層の活性化関数(恒等関数,ソフトマックス関数)の特徴
  • シグモイドとソフトマックス関数の違い
  • 損失関数(2乘和誤差,交差エントロピー誤差)について

くらいです.
実際に書き出してみると意外と多いように見えましたが,まだまだ初歩の初歩なのでよくよく考えると全然進めてない…
ディープラーニングを使って共同研究に取り組める日はもう少し先になりそうです……

就活の進捗

やっと…やっと就職先が確定しました…!!

3月末からずっと就活で動いていて,今月の頭にやっと就職先が決定しました!!
最終面接で,第一希望の会社の社長さん面接だったため,その時に色々とお話しを聞くことができました.
実は,内定の方は後々の通知ではなく,その面接内でいただくことができたため,面接が終わったあともしばらくこれは夢なんじゃなかろうかとふわふわしていました笑
(あとは届いた内定書を今日中に出しに行かねば…)

そんなこんなでやっと就活が終わったので,これからはゆっくり卒研に取り組んでいけそうです…!!

これからの予定

まず機械学習の基礎の勉強ですが,もう少しペースアップさせて行かないといけないのですが,如何せん機械学習に必須な微分がダメダメなので,ひとまずは微分の復習になりそうです……
微分の復習をしつつ誤差逆伝播の理解を頑張って行く予定です.

研究とか基礎勉強の進捗もちょこちょこブログに書いて忘れないようにする習慣つけていきたいなぁ…

春休みじゃーー

ブログを最後に更新してから早2ヶ月.
最近全く更新とかできてないまま春休みに突入………………

実は一応今進行形でGANのサンプルプログラム動かしたり,と来年の卒業研究に向けてちょっと勉強してたりするんですが
本当これといって自分で作ったものとかも無くてサンプルコード動かしてるだけだからあまりブログの題材にならないのでは……と更新を躊躇いました.

ただ,一つだけ題材になりそうなことがあり,ちょっと前にGANを使った機械学習用サンプルデータのカサ増し実験で面白いデータが取れたのですが……これが某コンテスト用のデータであるため掲載すること叶わず…………

でも生成画像が思ったよりは面白いものが出来たので実はめちゃくちゃブログに書きたい…!!!!!
いっそブログじゃなくても良いから生成できた画像を見せたい…………!!!!!!!

(どうやらコンテスト用以外の目的でサンプルの画像データを使うことが禁止されているためそのデータをもとに生成した二次データもグレーかもしれないとのことです………)

一応来年度から卒研のテーマとしてもGANは取り扱う予定なのでそこでの進捗とかを書いていけたらなーって思ってます.

あと就活もそろそろ力入れていかなきゃ………

【Mac】pythonでMeCabが使えるように頑張ったお話

最近は授業のテーマとして自然言語機械学習をしているのですが,そんな自然言語を扱うに当たって基本であるpythonMeCabをインストールする作業でめちゃくちゃ時間を取られてしまいました……

因みに出たエラーの種類はこんな感じです.

今回出たエラー
  • ./configure --enable-utf8-only でerrorを吐く.(Makefileが作成されていない) ←実はgccの問題だった.
  • mecabが文字化けする(utf8を認識しない.)

…ということで今回はpythonMeCabを使えるようにするまでに出てきたエラーの対処法をメモしていきます.(また環境構築するかもしれないし…!!)

今回のインストール環境
  • Mac Sierra 10.12.6
  • Python3(anaconda3-2.5.0)

では早速MeCabのインストールを進めていきたいと思います. 基本的な流れは以下のサイトを参考にしてます.

qiita.com

本当はmecabbrewでインストールしてpipでmecab-python3を入れたかったのですが,
setup.pyが見つからず,またpipのエラーがどうしても直らなかったため,今回はgitから直接cloneする方法をとりました.

MeCabのインストール

ということで,まずはgitからmecabファイルをダウンロードしてきます clone先はどのディレクトリでも大丈夫ですが,後々混乱しないような場所をお勧めします.

$ git clone git@github.com:taku910/mecab.git

cloneができたらmecabというファイルが出来ているので,早速

$ cd medab/mecab

のコマンドでディレクトリを移動します.

ここで唐突ですが,もし今後pythonMeCabを使用する予定があるならmakeする前に以下のファイルを変更する必要があります.(そうで無い方は読み飛ばしてください)

まず,移動した現在のディレクトリ内にpythonというファイルがあるはずなので,その中にあるsetpu.pyというファイルの以下の部分を書き換えます

# 変更前
def cmd2(str):
    return string.split (cmd1(str))

# 変更後
def cmd2(str):
    return cmd1(str).split()

これで,pythonでもMeCabを使えるようにする準備が整いました.
後はMeCabのmakeが上手くいけばpythonでも使えるようになるはずです.

では次は実際にダウンロードしてきたMeCabをmakeしていきます.

MeCabをmakeしていく

mecab/mecab/内にディレクトリを移動したら,そこで以下のコマンドを順に実行し,mecabをmakeしていきます.

$ ./configure --with-charset=utf8
$ make
$ make check
$ sudo make install

……今回私は真っ先にこの段階でつまづきました.
(ここまでで何もエラーを吐かれなかった場合はしばらく読み飛ばしてください.)

なんと…最初のコマンドである./configure --with-charset=utf8を実行しても肝心のMakefileが生成されない…!!!(寧ろ途中でエラー起こして止まってる!)

完全に予想外の事態でしたが,コマンド実行時に生成されていたconfig.logにどこでエラーが起きているのかが書いてあり,よく読むとgccの問題であることがわかりました.

そうとわかれば早速gccをgcc5に切り替えていきます.
(gcc5で実行できているサイト様があったためgcc5であれば大丈夫だと考えました.)

gccのバージョンを切り替える方法についてはまた別の記事に書いてあるため,必要な場合は以下のリンクから参照してください↓

Macのgccを変更してみた. - みの屋.

gccの問題も解決し,sudo make install まで完了したらmecabのインストールは完了です!!!

実質エラーさえ吐かなければ4つのコマンドでインストールが完了するなんて簡単……!!!!!!

では次に実際にMeCabがちゃんと動くかどうかをテストしていきます.

MeCabの実行(文字化けした場合の対処)

先ほどインストールは無事完了したので,次はmecabの動作確認をしていきます. ここで入力した文字が形態素解析されていれば成功です…!!!

$ mecab -d /usr/local/lib/mecab/dic/ipadic
今日はいい天気
?   ̾??,????,*,*,*,*,?,???????,???????
?   ????,????,*,*,*,*,*
日 ̾??,??ͭ̾??,?ȿ?,*,*,*,*
はいい   ̾??,????,*,*,*,*,*
天気  ̾??,????,*,*,*,*,*
EOS

…………え?文字化け…………????
一番最初にutf8で指定した…よね………?

……実は私はここでも結構つまづきました.様々なサイト様ではここで記事が成功で終わっている場合が多く,文字化けしている例があまりなくて困りました.

結果的には,文字化けの原因は使用している辞書の文字コードが合っていない場合に起こることが多いことがわかったため,ひとまずmecabで使用している辞書の文字コードを調べてきます.
ちなみに,辞書はmecab/mecab-ipadic/の中に入っています.
(makeコマンドをした階層から一つ戻ったmecab-ipadicというファイル内のことです)

とりあえず文字コードを辞書内の適当なファイルで確認してみると………

$ nkf -g Noun.csv 
EUC-JP

やっぱり文字コードUTF-8じゃない…………!!!
これじゃあ文字化けするのも当然です.

こうなると全ての*.csv,*.defファイルの文字コードUTF-8である確率は低いので,以下のコマンドを入力して一括でファイルの文字コードを強制的に変換します.
(一つ一つ調べると時間かかっちゃうので……)

$ sudo nkf -w --overwrite *.csv
$ sudo nkf -w --overwrite *.def

*.csv,*.defファイルの変換が終わったら,次にdicrcというファイルの中にEUC-JPと記述があるのでこれもUTF-8へ変更します.

# 変更前
config-charset = EUC-JP

# 変更後
config-charset = UTF-8

………これらを全てUTF-8に変更できたことを確認したら,もう一度mecabを起動してみます.
すると………

$ mecab                #辞書の指定をしなくてもちゃんとipadicを読み込んでくれていました.
今日はいい天気
今日  名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
いい  形容詞,自立,*,*,形容詞・イイ,基本形,いい,イイ,イイ
天気  名詞,一般,*,*,*,*,天気,テンキ,テンキ
EOS

やっと文字化けが直ったぁぁぁぁぁぁぁぁぁぁぁ……!!!!!!!!!!!!

(もし,ここで文字化けが直っていなかった場合は一度mecabを消去,再インストールしてmakeする前に文字コードの設定をしてみてください.)

また,今回一番の本題であるpythonから実行も無事上手くいきました!!!!!!

# pythonコード:Mecab.py(入力文を分かち書きしてみるだけのプログラムです)
import MeCab                                                                    
mecab = MeCab.Tagger()                                                          
mecab.parse("")                                                                 
node = mecab.parseToNode("今日はいい天気ですね")                                
while node:                                                                     
    print(node.surface)                                                         
    node = node.next
# 実行結果
$ python Mecab.py

今日
は
いい
天気
です
ね

……やっとひと段落…!!!.
今回は何故かいろんなエラーでインストールまでに結構手間がかかってしまいましたが,なんとか無事インストールできてホッとしました.何がともあれ良かった良かった.
でもやっぱり環境構築って詰まるとほんと抜け出すまでが大変じゃ………………

Macのgccを変更してみた.

最近Mac自然言語処理に必要なMeCabをインストールする機会があったのですが,環境構築の段階でgccのエラーを発症.
gcc5を入れることになったので,その手順を忘れないためにメモメモ……

インストール環境

今回はmacの環境を作るのにちょうどいい機会だったので,
パッケージ管理システムであるMacPortsを入れるところから始めます!!

Macportのダウンロード

では,早速下記のサイトで
右上のDownloadもしくは,左側の”Available Downloadsmacのバージョンにあったもの”をダウンロードしてきます.

www.macports.org

ダウンロードしてきたものをクリックするとインストーラーが起動するので,だいたい次へをクリックでおk.

すると,インストーラーが自動で下記の設定をシェルに書き込んでくれるらしいです
(自分の場合は全く書き込まれてなかったので手動で~/.zshrcに全部書き込みました)

# MacPorts Installer addition on 2014-09-25_at_18:39:26: adding an appropriate PATH variable for use with MacPorts.
export PATH="/opt/local/bin:/opt/local/sbin:$PATH"
export MANPATH="/opt/local/man:$MANPATH"
# Finished adapting your PATH environment variable for use with MacPorts.

書く場所は必ずしも~/.zshrcではなく,~/.bashrc~/.profile等,自分のシェルの設定があるファイルで大丈夫です.

また,書き込んだだけでは設定が反映されないので,source ~/.zshrcなどして設定を反映させてください.
反映したら実際に動くか確認してみます.

$ port version
Version: 2.4.2

大丈夫そうですね.これでMacportを入れる作業は終了…!!!!
次はやっと本題のgcc5をインストールしていきます.

gcc5をインストールしてみる

先ほどMacportをインストールしたと思うのですが,念のため一度macport自身のアップデートをしておきます.

sudo port selfupdate
# macportは/opt/local以下を編集しているらしいので実行時にsudoをつけないとエラー吐かれることがあります.

次に現在の自分のgccバージョンとmacportでインストール可能なバージョンを見ていきます.

まずは現在の自分のgccバージョンから.

$ gcc -v

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/7.2.0/libexec/gcc/x86_64-apple-darwin16.1.0/7.2.0/lto-wrapper
Target: x86_64-apple-darwin16.1.0
Configured with: ../configure --build=x86_64-apple-darwin16.1.0 --prefix=/usr/local/Cellar/gcc/7.2.0 --libdir=/usr/local/Cellar/gcc/7.2.0/lib/gcc/7 --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-7 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl --with-system-zlib --enable-checking=release --with-pkgversion='Homebrew GCC 7.2.0' --with-bugurl=https://github.com/Homebrew/homebrew-core/issues --disable-nls --with-native-system-header-dir=/usr/include --with-sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk
Thread model: posix
gcc version 7.2.0 (Homebrew GCC 7.2.0) 

今のgccのバージョンは以前homebrewでインストールしたもののようです.

では次にmacportでインストール可能なバージョンの一覧を調べます.

$ port search gcc

apple-gcc40 @5494 (lang)
    Apple's version of gcc 4.0
                  省略
gcc5 @5.5.0 (lang)
    The GNU compiler collection

gcc6 @6.4.0 (lang)
    The GNU compiler collection
                   省略

gcc5がありました!!インストール可能です!
なので早速gcc5をインストールしていきます.

$ sudo port install gcc5

これでgcc5のインストールは完了です!!(簡単!!)
ただ,このままではまだgcc5に設定はされていないので,gcc5に切り替えていきます.

まずmacportで管理されているgccの一覧を取得し,

$ port select --list gcc
Available versions for gcc:
    mp-gcc5
    none (active)

この中から使うgccを選択して以下のコマンドで切り替えます.

$  sudo port select --set gcc mp-gcc5
Selecting 'mp-gcc5' for 'gcc' succeeded. 'mp-gcc5' is now active.

この操作を行ったらシェルの方にも反映させる必要があるので,

$ source ~/.zshrc

これでgcc5への切り替えが完了しました!!!
もう一度gccのバージョンを確認してみます.

$ gcc -v

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/opt/local/libexec/gcc/x86_64-apple-darwin16/5.5.0/lto-wrapper
Target: x86_64-apple-darwin16
Configured with: /opt/local/var/macports/build/_opt_bblocal_var_buildworker_ports_build_ports_lang_gcc5/gcc5/work/gcc-5.5.0/configure --prefix=/opt/local --build=x86_64-apple-darwin16 --enable-languages=c,c++,objc,obj-c++,lto,fortran,java --libdir=/opt/local/lib/gcc5 --includedir=/opt/local/include/gcc5 --infodir=/opt/local/share/info --mandir=/opt/local/share/man --datarootdir=/opt/local/share/gcc-5 --with-libiconv-prefix=/opt/local --with-local-prefix=/opt/local --with-system-zlib --disable-nls --program-suffix=-mp-5 --with-gxx-include-dir=/opt/local/include/gcc5/c++/ --with-gmp=/opt/local --with-mpfr=/opt/local --with-mpc=/opt/local --with-isl=/opt/local --enable-stage1-checking --disable-multilib --enable-lto --enable-libstdcxx-time --with-build-config=bootstrap-debug --with-as=/opt/local/bin/as --with-ld=/opt/local/bin/ld --with-ar=/opt/local/bin/ar --with-bugurl=https://trac.macports.org/newticket --disable-tls --with-pkgversion='MacPorts gcc5 5.5.0_0'
Thread model: posix
gcc version 5.5.0 (MacPorts gcc5 5.5.0_0)

ちゃんとgcc5へと切り替わっていますね!!

………実は上で紹介したバージョンを切り替える方法以外にも,gccという名前に直接リンクする方法もあるのですが,リンクを失敗したりするとあとあと厄介なので私はこちらの方をお勧めしたいです…!!(切り替えも楽だしね!!←)
ただ,gcc5のような新しい名前でリンクを通すというサイトも見かけたのですが,それはそれで切り替えも要らず使い勝手良さげだったので自分の好みに合わせて使い分けてください!!