2017-11-30

「やりたいことがない」って実はすごいことなのかもしれない

世の中、ほとんどの人が「好きなことを見つけろ」とか、「好きなことを仕事にする」のがいいとかいってて、やりたいことがない人に対して風当たりが強い。し、そんなこと言われると、夢を持っている人の方が夢を持たない人よりすごいのかもしれないと思ってしまう。


でも普通に、やりたいことがないことって実はすごいことなんだと思う。

2017-11-28

Progateのおかげでエンジニアになれた僕が、ほかのどんなプログラミングサービスよりも初心者に「Progate」をおすすめする理由

こんにちは、ProgateのおかげでIT業界就職し、エンジニアしていますDAIです。




みなさん、Progateというサービス知っていますか。僕はIT企業に入ってもなお、同僚の友達にProgateを進めています。


実際、世の中、プログラミングを学べるサービスってたくさんありますよね。いくつあるかご存知ですか?僕が知っているプログラミングが学べるサービスを今列挙してみると、少なくとも僕の知っている範囲では、10種類以上あります。(気になったらいろいろ調べてみて下さい)

  • Code Academy (海外のエディタ形式のプログラミングサービス)
  • Khan Academy (海外のプログラミングサービス)
  • Udemy (日本でも展開している、動画学習サービス)
  • Coursela (海外のコンピューターサイエンス授業を配信しているサービス)
  • Udacity (海外のコンピューターサイエンス授業を配信しているサービス)
  • ドットインストール(日本で展開している動画学習サービス)
  • Tech Camp (日本で展開しているブートキャンプサービス) 
  • Code Camp (プログラミング家庭教師サービス)
  • PyQ (日本で展開している、動画+オンライン家庭教師サービス)
  • Progate (日本で展開している、エディタ形式のプログラミングサービス)

その中でも、なぜ私が、初心者こそProgateを使うべきなのかについて、Progateを使って勉強を始めて、現役でエンジニアをなった体験談をもとに話してみたいと思います


2017-11-27

【今だったら絶対にやってた】就活弱者の僕が今になって思う、大学2-3年生の時にやっておくべき3つのこと

こんにちは。Daiです。就活でやるべきことをちゃんとやらず、準備しないで就活を始めてしまって、就活で落ちるどころか、人事にぶちぎれられたこともあるくらいオワコン就活生でした。



(就活自体は2年前にして、そこそこ幸せな人生を歩んでいます。)


最近、就活生にいろいろ就活前にすべきことを相談されることが多く、「そうか、今ちょうど2年前に戻って、いまから就活しろと言われたら、就活前に必ずやってたことってなんだろう。」と思ったんです。


今回は、自分の就活の失敗経験を振り返って、就職前にやるべきことを3つ思い出してみました。


2017-11-26

Rで機械学習:K-meansでアヤメの種類を分類する

「非階層クラスター分析」とは

 非階層クラスター分析とは、異なる性質のものが混ざり合った集団から、互いに似た性質のものを集め、クラスターを作る1つの方法です。階層クラスター分析とは異なり、階層構造を持たず、あらかじめいくつのクラスターに分けるかを決定し、決めた数のクラスターにサンプルを分割する方法です。具体的には下記のようなイメージです

何を読み取るのかが重要--統計言語「R」でクラスター分析 - (page 3) - ZDNet Japan https://japan.zdnet.com/article/35052079/3/

Rで機械学習:ランダムフォレストを使って、新規ユーザーの属性データから、1カ月後のアクティブユーザー数を予測する

前回、Rで機械学習:サポートベクターマシン(SVN)を使って、新規ユーザーの属性データから、1カ月後のアクティブユーザー数を予測するで、サポートベクターマシンを使い、


  • 新規登録ユーザー500人の属性データから、未知データをあてはめて、1カ月後アクティブかどうか予測する


というお題をやってみました。
今回は、同じことを教師あり学習の代表格、ランダムフォレストでやってみたいと思います。

ランダムフォレスト(英: random forest, randomized trees)は、2001年に Leo Breiman によって提案された[1]機械学習のアルゴリズムであり、分類、回帰、クラスタリングに用いられる。決定木を弱学習器とする集団学習アルゴリズムであり、この名称は、ランダムサンプリングされたトレーニングデータによって学習した多数の決定木を使用することによる。対象によっては、同じく集団学習を用いるブースティングよりも有効とされる。

手を動かしながら学ぶ ビジネスに活かすデータマイニング
尾崎 隆
技術評論社
売り上げランキング: 141,877

Rで機械学習:サポートベクターマシン(SVN)を使って、新規ユーザーの属性データから、1カ月後のアクティブユーザー数を予測する

ついに機械学習に入ります。今回はサポートベクターマシン(SVN)。この本マジでわかりやすい。


手を動かしながら学ぶ ビジネスに活かすデータマイニング
尾崎 隆
技術評論社
売り上げランキング: 141,877

Rで回帰木分析 飲食点の売り上げを気温、花火大会の回数、CMの実施回数から分析する

Rで回帰木について実際に手を動かしてお勉強しますと。飲食点の売り上げを気温、花火大会の回数、CMの実施回数から分析します。


手を動かしながら学ぶ ビジネスに活かすデータマイニング
尾崎 隆
技術評論社
売り上げランキング: 141,877


R-決定木 どのキャンペーンページが効果的だったか分析する

決定木とは

さて、この本で決定木を勉強します。


手を動かしながら学ぶ ビジネスに活かすデータマイニング
尾崎 隆
技術評論社
売り上げランキング: 141,877

  • 決定木とは、できるだけ外れているものをよけるように条件分岐して順番を決めていくアルゴリズム
  • 説明変数はカテゴリ型でも数値型でもどちらでも大丈夫。

R-ロジスティック回帰分析 通販サイトにおける商品購入率をキャンペーン商品の価格で説明してみよう

本日もせっせと勉強します


TJO氏の本でね。今日はロジスティック回帰分析を手を動かしながら勉強します。


手を動かしながら学ぶ ビジネスに活かすデータマイニング
尾崎 隆
技術評論社
売り上げランキング: 131,451

2017-11-25

【Python】SEO対策向けの共起語取得ツールを作ってみた Selenium + Janome

SeleniumとJanomeで無理やり共起語取得ツールを作ってみた



自社の記事を検索上位に挙げるために必要な、検索最適化(SEO)。この検索最適化の要素の一つに、「共起語」の発生数というものがあるらしいです。


簡単に言うと、「Python 機械学習」と検索したときに、その関連する言葉が記事にたくさん入っていることが、検索上位の要因となっているという話です。


そこまでSEOに詳しくないので、詳細はこちらの記事にお任せします。

共起(きょうき)は、ある単語がある文章中に出たとき、その文章中に別の限られた単語が頻繁に出現すること。日本語の例では「崩御する」という単語に「天皇が」という言葉が多く用いられることや、単に他動詞には「を」が、「行く」には目的地を示す「に」が頻出することが挙げられる。(共起語の意味とは何?SEO効果があるのか? | アフィリエイト初心者でも稼げるネットビジネスブログ

順位を上げたいページ(ページA)に、そのページで狙っているキーワード(キーワードA)の共起語(キーワードB)を加える。
キーワードBをアンカーテキストにして、キーワードBについて書いてあるページ(ページB)にリンクを張る。
この手法を実行した途端に、ありとあらゆるSEOを施策していたのに3ページ目より上に上げられなかったページAがキーワードAの検索で2位に来たそうです。「共起語SEOをもう一度解説してみる」 

ということで、この共起語を見つけたいのですが、実際検索上位でどのような言葉がいくつ入っているのかがわかれば、逆算して「この単語とこの単語をいくつ出現させれば、検索上位を取れるのか」ということがわかります。そうすると、共起語取得ツールがあれば企業のWeb集客としても、非常に便利そうです。ということで、作ってみました。


Python Janomeでlist index out of rangeというエラーが出たときの対処法

Python Janomeでlist index out of rangeというエラーが出たときの対処法。

Traceback (most recent call last):
  File "coappear.py", line 70, in <module>
    top_words = list(a.analyze(filterdText))[:20]
  File "/usr/local/lib/python3.5/dist-packages/janome/analyzer.py", line 105, in analyze
    tokens = tfilter.filter(tokens)
  File "/usr/local/lib/python3.5/dist-packages/janome/tokenfilter.py", line 29, in filter
    return self.apply(tokens)
  File "/usr/local/lib/python3.5/dist-packages/janome/tokenfilter.py", line 179, in apply
    for token in tokens:
  File "/usr/local/lib/python3.5/dist-packages/janome/tokenfilter.py", line 99, in apply
    for token in tokens:
  File "/usr/local/lib/python3.5/dist-packages/janome/tokenizer.py", line 201, in __tokenize_stream
    tokens, pos = self.__tokenize_partial(text[processed:], wakati, baseform_unk)
  File "/usr/local/lib/python3.5/dist-packages/janome/tokenizer.py", line 253, in __tokenize_partial
    lattice.add(Node(dummy_dict_entry, NodeType.UNKNOWN))
  File "/usr/local/lib/python3.5/dist-packages/janome/lattice.py", line 144, in add
    self.enodes[self.p + node_len].append(node)
IndexError: list index out of range```

list index out of range


というエラーは、リスト(配列)に対して存在しないインデックを指定している」という意味。


原因は複数あるけど、janomeにほかの言語が入り込んでしまうことが原因らしく、以下のコードにフィルターしたいテキストを引数に入れると、きれいになおしてくれるらしい。

def filterText(text):
   """
   :param text: str
   :rtype : str
   """
   # アルファベットと半角英数と記号と改行とタブを排除
   text = re.sub(r'[a-zA-Z0-9¥"¥.¥,¥@]+', '', text)
   text = re.sub(r'[!"“#$%&()\*\+\-\.,\/:;<=>?@\[\\\]^_`{|}~]', '', text)
   text = re.sub(r'[\n|\r|\t]', '', text)
   # 日本語以外の文字を排除(韓国語とか中国語とかヘブライ語とか)
   jp_chartype_tokenizer = nltk.RegexpTokenizer(u'([ぁ-んー]+|[ァ-ンー]+|[\u4e00-\u9FFF]+|[ぁ-んァ-ンー\u4e00-\u9FFF]+)')
   text = "".join(jp_chartype_tokenizer.tokenize(text))
   return text



参考)

「日本語以外の文字と記号を排除し日本語の平文コーパスを作成する呪文」 https://qiita.com/haminiku/items/5907cb81325083cb36c7


2017-11-23

需要が高く単価の高い「趣味で稼げるスキル」とは何か? ココナラをデータマイニングして、「売れるスキル」を見つけてみた

ココナラという、スキル売買サイト



従来の「どの企業に入るか」で自分の価値が決まっていた時代とは逆に、個人のスキルと信頼度で価値が決まってくる社会になってきました。


さて、実はこのスキルと信頼の二つのうち、スキルを売り買いできるサイトがあるのは、ご存知でしょうか。


ココナラというサービスです。

ココナラは、
知識・スキル・経験を売り買いできる
フリーマーケットです。(ココナラ公式)


このサービスでは、実際に自分の得意なスキルを販売することができます。クラウドソーシングとまったく逆の発想で、非常に面白いですね。例えば、このサイトの趣味・娯楽ページでは、こんなものが売られています。


  • 耳コピして、ギターのタブ譜を売るサービス(1000円)
  • ドラムの譜面の作成サービス(2000円)
  • Webページのスクレイピング(2000円)




このように、今までは価値がつけられなかったスキルが、インターネットの力で価値化され、売買されているという面白い仕組みのサイトです。iOS、アンドロイドともにダウンロードできるようになっています。

1分以内に完了!無料会員登録はこちら 


タイトル、引用範囲、URLを取得するブックマークレット作りました。

ページを共有する際に、
  • タイトル
  • 引用
  • URL
をコピーしてシェアしたかったのですが、文字数が決められているツイッターだと、少し困ることがありました。引用する場合は、文字列が多くなるので、だいたいはタイトルを消さなければなりません。


タイトル、引用範囲、URLを取得するブックマークレット作りました。



そこで、

  • もし引用範囲が存在すれば
    • 引用範囲 + URLのみを表示
  • もし引用範囲が存在しなければ
    • タイトルとURLのみ表示
を行います。その結果がこちら





需要あるかどうかわかりませんが、ブックマークレットにすると結構便利だと思うので、置いておきます。ブックマークレットの使い方はググってください

javascript:if(window.getSelection().toString()){prompt('選択範囲が存在',"「" + window.getSelection()+'」 '+location.href);}else{prompt('Copy here!',document.title+' '+location.href);};

numpyで文字列と数値が入ったcsvを読み込む際の詰まりどころと解決方法

numpyで文字列と数値が入ったCSVを読み込みたかったが苦戦したのでメモ。

もともと、文字列と数値が入ったoutput.csvに対して、以下の方法で読み取ろうとしていた。

np.py

from pylab import * 
import numpy as np

%matplotlib inline #Jupiter Notebookでグラフ表示させるおまじない

data = np.loadtxt('output.csv', delimiter=',')

そうするとこういうエラーが吐かれた

---------------------------------------------------------------------------ValueError                                Traceback (most recent call last)
<ipython-input-39-5d33cf5a6e2a> in <module>()----> 1 data = np.loadtxt('output.csv', delimiter=',')
/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in loadtxt(fname, dtype, comments, delimiter, converters, skiprows, usecols, unpack, ndmin)   1022
   1023             # Convert each value according to its column and store-> 1024             items = [conv(val) for (conv, val) in zip(converters, vals)]   1025             # Then pack it according to the dtype's nesting   1026             items = pack_items(items, packing)
/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in <listcomp>(.0)   1022
   1023             # Convert each value according to its column and store-> 1024             items = [conv(val) for (conv, val) in zip(converters, vals)]   1025             # Then pack it according to the dtype's nesting   1026             items = pack_items(items, packing)
/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in floatconv(x)    723         if b'0x' in x:    724             return float.fromhex(asstr(x))--> 725         return float(x)    726
    727     typ = dtype.type
ValueError: could not convert string to float:

ValueError: could not convert string to float:


このエラーはどういうことだろうといろいろ調べてみて、こうしたらうまく読み込めた

np.py

data = np.genfromtxt("output.csv", dtype = None, delimiter = ",") #これで文字列を取得できる

原因


dtypeが問題らしい。dtypeについて調べてみたところ、メモリ効率化のためにデータを指定して読みだすらしい。

NumPyは基本的には、大量のデータ操作を高速に実行できるように内部ではCで実装されています。Python自体はそれほど高速な言語ではないため、行列演算の操作やデータの扱いはCから行われます。
つまり、正しくNumPy配列のデータ型を指定することでPythonからでもメモリ効率と実行効率の良いコードを実装することができます。
NumPyにおける要素のデータ型dtypeの種類と指定方法 - DeepAge
https://deepage.net/features/numpy-dtype.html


で、これは仮説だけど、numpyはデータを取得するときに、デフォルトでfloatで取得してしまうらしい。string型もfloatで取得してしまい、エラーが起こってしまっているのだと思われる。なので、

 dtype = Non

を指定してあげることで、解決できた。

2017-11-22

プログラミング初心者にメンターが必要な理由

よく、プログラミング初心者に対して、「ググればわかる」と乱雑に教える人がいます。個人的には半分あっていて、半分間違っているなおと思います。なので思ったことを少しまとめてみます。


2017-11-21

Rで重回帰分析 多重共線性が存在しうるデータをRで重回帰分析するときの注意点

重回帰分析の際に起こる、各独立変数間の多重共線性について実験してみます。
データセットはここから取得します。ビールの売上高を予測するという課題です。


手を動かしながら学ぶ ビジネスに活かすデータマイニング
技術評論社 (2014-08-22)
売り上げランキング: 98,606

DM_sampledata.zipを開いて、ch4_3_2.txtというファイルを開きます。適当なディレクトリに保存して、Rで読み込みます。

Rで重回帰分析 オゾン濃度と気象データの関係を重回帰分析して予測する

この本のコードを写経しています。

手を動かしながら学ぶ ビジネスに活かすデータマイニング
技術評論社 (2014-08-22)
売り上げランキン



Rのデフォルトで存在するデータセットを使って、重回帰分析をしてみたいと思います。

【Python】Amazonのセール商品をAmazon Product Advertising APIで抽出し、自動記事作成をやってみた

こんにちは、DAIです。



つい最近、ほけきよさん(@hokekiyoo)が、AmazonのAPIを使って、自動記事作成で3日で1万円儲けたみたいな話をしたので、僕もやってました。やり方については企業秘密にしていたので、僕が公開しちゃいますよと。


とりあえず、やりたいこととしては、

  • Amazonのセール商品をAPIから取得
  • 自分のアフィリエイトコードを入れたURLを作成
  • bootstrapで、いい感じにそのデータをもとに自動で記事を作成

です。うまくいくと、アフィリエイトコード付きで、こんな感じになります。




2017-11-19

Jenkins上でPython3の定期実行ジョブを作った時のメモ

# やりたいこと

- Jenkins上でpython3のスクリプトを、定期実行します。
- JenkinsはCI(継続的インテグレーション)ツールとして利用されますが、同時に定期実行の機能を持ち合わせています
- かつ、サーバー上で実行を行ってくれるので、パソコンを起動しなくても定期実行を行ってくれるようになります。

# 背景知識

- そもそもJenkinsとは何か?


Javaで書かれたオープンソース継続的インテグレーションツール
(英:Continuous[継続した] Integration[結合])である。(Jenkinsとはなんぞや?)

- 継続的インテグレーション(CI)とは?


継続的インテグレーションとは、ソフトウェア開発において、ビルドやテストを頻繁に繰り返し行なうことにより問題を早期に発見し、開発の効率化・省力化や納期の短縮を図る手法。 特に、専用のツールを用いてこのプロセスを自動化あるいは半自動化し、効率的に実施する方式。(Jenkinsとはなんぞや?)


- 継続的インテグレーションのメリットとは


毎日、最新版のアプリケーションをサーバーにデプロイすることで、最新のアプリケーションに対するテストを行えます。テストのカバレッジを毎日収集することで、テストの進捗状況を細かく確認することができます。静的解析を行うことで、手動では見つけにくいバグや品質低下を発見することができます。これらを毎日人力で行うことは非常に手間です。Jenkinsはそれらを自動化する手助けをしてくれます。(Jenkinsで実現するJava EEアプリケーションの自動ビルドと自動デプロイ)


- Jenkinsは定期実行するために有効なツール?


で、Jenkinsで今回やりたいのは継続的インテグレーションではなく、定期実行プログラムなのです。Jenkinsが強いのは、Cronをサーバー上で設定できるので、非常に便利です。
Jenkinsは継続的デリバリーとか継続的インテグレーションの文脈で語られることが多いので、ソースコードのビルドだったりテストの実行だったりをエンジニアの代わりに実行してくれるツールだと思われていることが多いです。(当たり前のことを長々と何言ってんだって感じですが)しかしJenkinsの機能を、そういったような開発管理ツールではなく汎用的なバッチツール、要は「すごいcron」として使用できることも分かったのでちょっと試してみました。(Jenkinsをすごいcronとして使う)

# 前提


 - すでにJenkinsがのっかっているサーバーが存在することを仮定
- 実行したい処理を書いたスクリプトも前提として存在する

# 手順


- Jenkinsに新規アカウントを作成し、ログインする
- ShiningPanda Pluginのインストールを行う


ShiningPandaは、JobごとにPythonの環境を構築してくれる、virtualenvを作成してくれます。これを利用することで、ほかのPython環境との依存性を低め、切り分けることができるようになります。

今回は、Jenkins ShiningPanda Plugin(輝くパンダ?)プラグインを利用して、ジョブ固有のPython環境を作る方法を紹介します。 ShiningPanda Pluginではvirtualenvを利用して、複数(ジョブ毎)のPython環境を切り替えます。Jenkins ShiningPanda Pluginによるジョブ固有のPython環境(virtualenv)

Amazon LinuxなどRedhat系Linuxでは、Pythonのシステム依存度が非常に高く、下手にアップデートなどを行うと悲劇となることがよく知られています。 デフォルトのモジュール空間へのライブラリ追加も極力避けたいところです。 特にJenkinsでPythonのシステムをテストする場合や、Pythonのスクリプトを実行したい場合は、ジョブ毎にモジュール空間を分けることがベストプラクティスです。Jenkins ShiningPanda Pluginによるジョブ固有のPython環境(virtualenv)

- Jenkins > 設定でpython3の設定を行う

Pythonの実行プログラムは、Python3系のことを行わなければならないが、もともと対応しているバージョンが2.0にしか対応していない。すでにPython2の実行ファイルが存在する場合、新規にPython3を設定します。





- 新規ジョブの作成を選ぶ

- ジョブ名を設定する

- フリースタイル・プロジェクトのビルドを選択する

- Jenkins / その他 / 「作成したプロジェクト名」を選択する

- 設定を選ぶ

- 詳細設定を記入する

ここには、ビルドでVirtualenv Builderを選択し、Python環境を構築します。もろもろのライブラリなどをここでインストールさせます。


- ビルド実行を選択

- ビルドに成功すればOK

- ビルドトリガを設定し、CRONを書きます。

この辺を設定すればわかる。[Jenkins] ビルドトリガ(定期的に実行)設定についてのまとめ

これで定期実行された。

2017-11-18

【Python】SeleniumでゴリゴリFacebook認証する

FacebookにSeleniumで無理やりログイン




Facebook認証を行っているWebアプリでWebスクレイピングを行おうとした時のメモ。


Facebookにログインしないと、データがとれないので、なんとかFacebookアプリにログインする方法を考えた。


普通はAPIになんらかのPOSTリクエストをして認証するのが大半だが、Selenium一発芸しか使えないので、無理やりブラウザ操作でFacebookにログインしてみた。

ソースコード

#1 Facebookにログインするメソッド


Facebookのメールアドレスとパスワードを引数をとって、Facebookにログインする。

def facebookLogin(email, password):

#1-1 Facebookログインが求められる、Webページにアクセスする

引数にFacebookアプリログイン画面のURLを入れる

browser.get("ログインしたいFacebookアプリのURL")

#1-2 フォームにE-mailとパスワードを入れる


.find_element_by_css_selectorで、引数に入力したいフォームのIDを指定する。
send_keysの引数には、もともと入れていたemailアドレスが入力される。同様にパスワードも。

    #1-2 値の入力

    browser.find_element_by_css_selector("#email").send_keys(email)
    browser.find_element_by_css_selector("#pass").send_keys(password)

#1-3 パスワードの確認画面を閉じる

パスワードを入力すると、確認画面が送信ボタンの上に出てしまうので、関係ないほかのの部分をクリックすることによって消す。


#1-3 どこでもいいので、クリックしないと送信ボタンが押せないため、適当に押している
    browser.find_element_by_xpath('//*[@id="email_container"]/div/label').click()
    time.sleep(2)

#2 ログインメソッドを実行


#1で作成したメソッドを利用して、ログインする

facebookLogin(email, password)


全体のコード



facebookLogin.py


import os
from selenium import webdriver
import pandas
import time

browser = webdriver.Chrome(executable_path='/mnt/c/workspace/pydev/chromedriver.exe')

email = "FACEBOOKのメールアドレス"
password = "FACEBOOKのパスワード"

#1

def facebookLogin(email, password):

    #1-1 最初にPairsのFacebook認証を済ませる

    time.sleep(2)
    browser.get("ログインしたいFacebookアプリのURL")

    #1-2 値の入力

    browser.find_element_by_css_selector("#email").send_keys(email)
    browser.find_element_by_css_selector("#pass").send_keys(password)

    #1-3 どこでもいいので、クリックしないと送信ボタンが押せないため、適当に押している
    browser.find_element_by_xpath('//*[@id="email_container"]/div/label').click()
    time.sleep(2)

    browser.find_element_by_xpath('//*[@id="u_0_0"]').click()
    time.sleep(4)

#2 

if __name__ == '__main__':

    facebookLogin(email, password)




2017-11-17

技術ブロガーで既にブログを持っている人のQiitaの使い道をまとめてみた

Qiita初めて一週間で週間トップ10入りしました


こんにちは、DAIです(@never_be_a_pm)


ここ一週間くらいで、Qiitaをはじめました。自慢しますが、投稿を初めて1週間になりましたが、Qiitaの週間TOPユーザーにTOP10入りしました。



ちなみに投稿した記事は、過去の記事の焼き増しです。特にバズったのはこの記事でした。はてなではQiitaに投稿したものが804ブックマークです。Qiitaページ自体のアクセス数は3日で1万ほどでした。

【Python】スクレイピング→データ収集→整形→分析までの流れを初心者向けにまとめておく ~Pythonに関するはてな記事を10年分スクレイピングし、Pythonトレンド分析を実際にやってみた~ - Qiita

やりたいこと * はてなブックマークで、Python記事を検索しトレンドを分析 * はてなブックマークにSeleniumでログイン * ブックマーク数をスクレイピング * 時系列比較を行う * バ...


今まで自分が所有するブログがあるので、Qiitaに投稿するメリットをあまり感じていなかったのですが、実際にやってみて、メリデメを整理したいと思い、考えてみましたがQiitaに技術ブログを持っている人が投稿するメリットを感じたので、まとめてみます。


2017-11-16

利用するソフトの言語設定を英語にしておくべきたった一つの理由

なかなか理解されないんですけど、僕は社内ツールも、社外ツールもなんでも、だいたい英語で設定しています。で、これをやっていると、「英語の勉強熱心なんだね」と言われることが多いのですが、まったくそんなことありません。


事実、僕の脳みその処理スピードよりも、Googleの翻訳が優れているので、僕は英語でググってもだいたい日本語に自動翻訳して読んでいます(英語で読めますが、理解するスピードはまだ日本語のほうが2.3倍くらい早いので、英語できない人が、時間が命の仕事で英語の勉強のために英語に設定するなんてありえない話だと思います。というか、英語を勉強するために言語設定を英語にしたところで大して英語力なんてつかないので、そんな非効率なこともしたいと思いません。普通に話したり、仕事で実践的に使えばいいだけなので)


Python dict(辞書型)オブジェクトでshuffleする方法

# やりたいこと

- list型のオブジェクトは、中の値の順番を変えるShuffleメソッドを持っている
- しかし、dict型の変数には、中の配列をシャッフルするShuffleメソッドを持っていない
- なので、dict型のメソッドでも、shuffleできるようにしたい
- 引数にdict型のオブジェクトを入れると、shuffleしてくれる関数を作成する

ちなみにlist型のオブジェクトはこんな感じ

# リスト型
li1 = [("a", 3), ("b", 2), ("c", 5)]

で、これをdict型に直すとこんな感じ

di1 = dict(li1)
# => {'b': 2, 'c': 5, 'a': 3}

# ソースコード



shuffleDict.py

#1 パッケージのインポート

import random

#2 適当な辞書型(dict型)オブジェクトの作成

family = {

  "sazae":"サザエ",
  "katsuo":"カツオ",
  "masuo":"マスオ",
  "tara":"タラ",
  "hune":"フネ",
  "wakame":"ワカメ",
  "namihei":"波平",
  "tama":"タマ"

};

#3 辞書型オブジェクトをシャッフルできるメソッド

def shuffleDict(d):

  keys = list(d.keys())
  random.shuffle(keys)
  [(key, d[key]) for key in keys]
  random.shuffle(keys)
  [(key, d[key]) for key in keys]
  random.shuffle(keys)
  keys = [(key, d[key]) for key in keys]
  #keys = d(keys)
  return dict(keys)

#4 元の辞書型オブジェクト
print(family)

#5 シャッフル後の辞書型オブジェクト
print(shuffleDict(family))

実行結果はこちら

{'tara': 'タラ', 'wakame': 'ワカメ', 'tama': 'タマ', 'katsuo': 'カツオ', 'masuo': 'マスオ', 'hune': 'フネ', 'namihei': '波平', 'sazae': 'サザエ'}
{'tara': 'タラ', 'masuo': 'マスオ', 'tama': 'タマ', 'katsuo': 'カツオ', 'wakame': 'ワカメ', 'hune': 'フネ', 'namihei': '波平', 'sazae': 'サザエ'}


Python MattermostからAPIをたたいて投稿する方法

# やりたいこと


- SlackのCloneアプリ、MattermostからPythonで投稿したい
- Pythonでスクリプトを実行した結果を、matterpostの特定のChannelからポスト

# 準備する情報


- mattermostのサーバーURL:例)mattermost.hogehoge.com
- mattermostで投稿したいChannelのID
- 自分のログインID
- 自分のパスワード

# 手順


- python-mattermost-driverをインストールする

$ sudo pip install mattermostdriver

https://github.com/Vaelor/python-mattermost-driver

# ソースコード


#1 最初にmattermostのAPIを扱えるLibraryのインポートをする

#2 投稿するtextを引数に、mattermost上にtextを投稿するメソッド

#2-1 ログイン情報をJSON形式で入れる。ここは自分の使う環境によって、URLやらログインIDやらを代入する。

#2-2 投稿するチャンネルを指定して、投稿する


mattermost.py

#1 mattermostのライブラリーをimport

from mattermostdriver import Driver
:
:
:
:
#2 投稿するtextを引数に、Mattermost上に投稿するメソッド

def postMattermost(text):

    foo = Driver({
      # Required options

    #2-1 ログイン情報 

    'url': '',
    'login_id': '',
    'password': '',
    'scheme': 'http',
    })
    foo.login()

    #2-2 特定のチャンネルに投稿

    foo.api['posts'].create_post(options={

      'channel_id':"",
      'message': text
      #'file_ids': [file_id]
      })

ちなみに、このライブラリのサンプルコードも載せておく

mattermost.py
from mattermostdriver import Driver

foo = Driver({
    # Required options
    'url': 'mattermost.server.com',
    'login_id': 'user.name',
    'password': 'verySecret',
    # Instead of login/password you can also use a personal access token
    'token': 'YourPersonalAccessToken',
    # Optional / defaults to
    'scheme': 'https',
    'port': 8065,
    'basepath': '/api/v4',
    # Use False if self signed/insecure certificate
    'verify': True,
    # The interval the websocket will ping the server to keep the connection alive
    'timeout': 30,
    'mfa_token': 'YourMFAToken'
})

# Most of the requests need you to be logged in, so calling login()
# should be the first thing you do after you created your Driver instance.
# login() returns the raw response
# If using a personal access token, you still need to run login().
# In this case, does not make a login request, but a `get_user('me')`
# and sets everything up in the client.
foo.login()

# You can make api calls by using api['yourendpointofchoice'].
# Since v4.0.0 you can now also call the endpoint directly.
# So, for example, wherever you see `Driver.api['users'].get_user('me')`,
# you can just do `Driver.users.get_user('me')`.
# The names of the endpoints and requests are almost identical to
# the names on the api.mattermost.com/v4 page.
# API calls always return the json the server send as a response.
foo.api['users'].get_user_by_username('another.name')

# If the api request needs additional parameters
# you can pass them to the function in the following way:
# - Path parameters are always simple parameters you pass to the function
foo.api['user'].get_user(user_id='me')

# - Query parameters are always passed by passing a `params` dict to the function
foo.api['teams'].get_teams(params={...})

# - Request Bodies are always passed by passing an `options` dict or array to the function
foo.api['channels'].create_channel(options={...})

# See the mattermost api documentation to see which parameters you need to pass.
foo.api['channels'].create_channel(options={
    'team_id': 'some_team_id',
    'name': 'awesome-channel',
    'display_name': 'awesome channel',
    'type': 'O'
})

# If you want to make a websocket connection to the mattermost server
# you can call the init_websocket method, passing an event_handler.
# Every Websocket event send by mattermost will be send to that event_handler.
# See the API documentation for which events are available.
foo.init_websocket(event_handler)

# To upload a file you will need to pass a `files` dictionary
channel_id = foo.api['channels'].get_channel_by_name_and_team_name('team', 'channel')['id']
file_id = foo.api['files'].upload_file(
            channel_id=channel_id
            files={'files': (filename, open(filename))})['file_infos'][0]['id']

# track the file id and pass it in `create_post` options, to attach the file
foo.api['posts'].create_post(options={
    'channel_id': channel_id,
    'message': 'This is the important file',
    'file_ids': [file_id]})
# If needed, you can make custom requests by calling `make_request`
foo.client.make_request('post', '/endpoint', options=None, params=None, data=None, files=None, basepath=None)
# If you want to call a webhook/execute it use the `call_webhook` method.
# This method does not exist on the mattermost api AFAIK, I added it for ease of use.
foo.api['hooks'].call_webhook('myHookId', options) # Options are optional




注目の投稿

 PythonのTweepyを利用して、Twitter APIを利用している。 その中で、ハマったポイントをメモしておく。 まず、Searchに関して。 Twitter検索は、クライアントアプリ側では、全期間の検索が可能になっている。 一方で、APIを利用する際は、過去1週間しか...