Photoruction工事中!

Photoructionの開発ブログです!

エンジニア未経験からの転職✨なぜ、フォトラクションを選んだのか✨

はじめまして、フォトラクションに4月から入社しましたトヨカズです!

同時期に入社したCREチーム所属の豊田(トヨヒロ)さんがいるので、以降トヨカズで進めていきます!

経歴としては、施工管理(監督業)を3年、SES営業兼キャリアアドバイザーを1年半経験したのち未経験エンジニアとして、フォトラクションに入社しました。

そんなひよっこエンジニアですが、気づいたら入社してから2ヶ月が経ちついに記事を書く番が回ってきたので、今回は僕自身が「なぜ、フォトラクションを選んだのか」という点について記事を書いていこうと思います!選考を受けようとしている人or選考を受けている人or社内の雰囲気知りたい人は、参考までに見ていってください🙇‍♀️

「CREチームって何するの?」と気になった方は、こちらの記事をチェック↓↓↓

kojichu.photoruction.com

なぜ、フォトラクションへ入社したのか


フォトラクションを選んだ理由としては、3つあり自身の転職軸とマッチしていた事で入社をきめました。以下、3つとなります👇

  1. valueへの共感
  2. CTO中村さんがエンジニア一人一人のキャリアを考えていきたいと言ってた点
  3. ドメイン知識を活かすことができる点

1. valueへの共感

フォトラクションには、5つのvalueがあります。

  • 目的逆算
  • 敬意尊尚
  • 知財共有
  • 最速挙動
  • 職務洗練

この中で、特に「知財共有」と「最速挙動」への共感性が高かった点!

知財共有に関しては、未経験時代から友人の紹介でエンジニアコミュニティに属していたのですが、そこで各自timesで発信する文化があり、自分の発信に対して他の人がアドバイスをくれたり、その発信が誰かの気づきになったり、お互いがお互いの知識を補完し、成長促進をするような文化だったので、同じ価値観を持っているフォトラクションでは、入社後のギャップも少ないだろうと考えていました。

最速挙動については、性格的な話になりますが僕自身の性格が「とりあえず、やってみよう」精神であり、最速挙動を掲げているフォトラクションでは、失敗から学び迅速に次なる改善の一手を打つという事が組織全体で浸透してるのだろなと思い、何か行動を起こす時も背中を押してくれる文化が根付いていると考えていました。

2.CTO中村さんがエンジニア一人一人のキャリアを考えていきたいと言ってた点

これは転職活動中に感じた事なのですが、未経験エンジニアでも僕自身のコミュ力を買って、声をかけてくださる企業様はいくつかありました。ただ、どの企業も

エンジニア自身のキャリア<どれだけプロダクトへ貢献できるか(今後の貢献度)

という視点で評価しており、個人のキャリアへの関心が薄いなというのが正直な感想でした。(もちろん、そうでない企業様も沢山あり、採用視点で考えると当然ではあるのですが..💦)前職で、SES営業をしていた事もあり、お客様と接する中で、個人のキャリアへの関心がない企業はあまり良いイメージがなかったので、その中で、CTO中村さんは「プロダクトへの貢献はもちろんして欲しいが、一人一人のキャリアも考えながらプロダクト作りをしていきたい」とおっしゃっていたので、その点にかなり共感を得たのを今でも覚えています🙈

3.ドメイン知識を活かすことができる点

今回が3社目となるのですが、1社目で石油製造業の施工管理をしていた事が今回の転職では大きかったと思います。監督として、現場に出向いていたことで現場目線で物事を考える事ができ、ユーザー視点からこそ見えてくる気づきもあると思うので、こういった形で全く違う業界での経験が活きてくる事もあるのだなとしみじみ思いました。

入社してみて感じたギャップ


こちらでは、入社して感じたギャップについてお話しします!

  • 組織的なギャップ
  • 個人的なギャップ

組織的なギャップ

2ヶ月経って感じたギャップとしては、出会う人出会う人みんないい人!!!(そもそもギャップじゃない)これだけだと身も蓋もない話しになってしまうので、もう少しだけ詳細にお話しさせて頂きます🫡

※これから話す内容は、TS(Technology Service)部/CREチームに限った話ではなく、組織的にどんな雰囲気かも交えてお話します。

入社して感じたことは、valueの浸透度合いです!入社を決める要因となった知財共有や最速挙動は然り、それ以外の敬意尊尚目的逆算職務洗練についても社内のメンバーに根付いている印象です。(どこから目線🙄)特に、敬意尊尚については年代関係なく、どのメンバーに対しても耳を傾ける姿勢があり、意見のいいやすい環境となっています。他部署の人と話しをしていても、フランクに話しをしてくれる人が多く、雰囲気はかなり良いんじゃないかな〜と思います✨

ただ、弊社では働き方の一環といてフルリモを採用してる事もあり、出社した場合も他の人が出社しているわけではないので、会社のイベント事に積極的に参加したり、部活に参加することがないと他部署の人とのコミュニケーションは取りづらい印象です💦(←今後の伸び代だと思っています!)

1つのプロダクトを組織的に提供しているので、他部署との連携は必須であり、その連携をスムーズにするには日頃からのコミュニケーション、そして信頼関係が必要だと思うので、少しずつ僕自身も何かの力になれることはないかと模索しながら今からワクワクしています!

個人的なギャップ

エンジニア職に就いて、2ヶ月が経ちましたが、僕はいま課題に直面しています。今までの職種では、仮説思考や論理思考といった問題解決するために必要な能力をそこまで使う機会がなく、コミュニケーションを重視していれば仕事での成果を出す事ができてました。ただ、CREではユーザーからヒアリングしてきた内容をもとに仮説を立て、問題追求をしていかないといけないため、この仮説思考論理思考は必須の能力となります💦

またエンジニアにとっても必須の能力であることから、この思考法を身につけるのに色々模索してる段階です🤔 異業種からの転職だと、こういったこともあるので、参考までに!

まとめ


いかがだったでしょうか?

今回の記事は、僕が転職活動をしていて「社内の人ってどんな人たちが働いてるのだろう?」と疑問に思ったことをきっかけに執筆してみました!また、社内の雰囲気もお伝えすることで、入社後のギャップや不安を無くすことができるかなとも思ったので、ぜひこの記事を参考に転職活動を進めてみてください‼️

株式会社フォトラクションでは一緒に働く仲間を募集しています

モバイル自動化ツールを使用開始した所感

こんにちは。QAエンジニアの塩谷です。

当社ではWEBの自動テストは運用開始して1年ほど経過しておりますが、先日やっとモバイルの自動テストの導入を開始いたしました。

まだ自動テストシナリオの準備中であり、本格的な運用は実施できていませんが、導入してみた所感について記事にしたいと思います。

自動テスト導入の背景

まず当社で自動テストを導入している背景を改めてご説明いたします。

当社ではWEB・モバイル(iOSAndroid)でそれぞれサービス展開しており、

WEB:1〜2回/月

モバイル:5〜8回/月

程度のリリースを行なっています。

WEB、モバイルそれぞれのリリース前にテストを実施しており、基本的に同じ項目を実施しています。この定期的に同じテストを繰り返すという点が自動テストで効果を発揮すると考え自動テストを導入するに至りました。

モバイル自動テストのツールについて

モバイルの自動テストでは、複数のツールを比較検討し、MagicPodを導入させていただきました。当社の利用方法から自動テストの実現性及び費用対効果を検討し料金プランはスタンダードを使用しています。

なお料金プランによって、料金のほかにプロジェクト数や作成可能テストケース数などの機能的差分が発生します。利用方法から適切な料金プランを選択してください。

料金プランの詳細はMagicpod社のHP(https://magicpod.com/corporate/)をご覧ください。

モバイル自動テストツールを使い始めた所感

モバイル自動テストツールのMagicpodを使用し始めた所感について記載します。

料金プランによる機能上限に要注意!

当社では料金プランにスタンダードを選択しました。

料金プランの選択においてプロジェクト数・作成可能テストケース数は事前の想定で問題ないと考えていました。

特に懸念していたのが作成可能テストケース数が収まるかどうかという点になりますが、こちらは事前にどのテストケースを自動化するか抽出しておいたことにより想定の範囲に収まるということを把握できました。

実際にプロジェクト数・作成可能テストケース数は、問題ありませんでしたが、事前にあまり想定していなかった画像差分チェックステップ数がオーバーしてしまいました。

こちらはテスト実施結果などの成否チェックのために画像チェックに利用しますが、そちらのチェックをどれくらい実施するのか事前に想定していなかったため、スタンダードプランの上限に到達してしまいました。

感覚的にテストケース数の2倍が上限となっており問題ないと思い込んでしまったために発生した問題になります。

こちらはオプションで追加が可能なため、急遽社内稟議を行いオプション申し込みをしてなんとか希望する数を設定できるようになりました。

自動テストツール導入前に実現したいことをよく確認しよう!

今回、料金プランによる機能の上限において想定外の問題が発生してしまいましたが、

事前に自動テストで実現したいテスト数およびテスト結果の確認方法をしっかりと把握しておく必要があります。

当社ではすでに存在していたテストケースを自動化するため、テスト数の抽出は簡単に実施することができました。テスト結果の確認方法についてはどの自動化ツールを採用するかによって変わりますが、1ケースずつどのように確認すれば期待結果を得られるのかチェックしておく必要があります。

当社では偶々オプションを追加しても効果が得られる条件でしたが、自動化ツールを導入する際には、何をどれくらい自動化するのかをしっかりと準備して検討を行うことが大切だと改めて実感しました。

株式会社フォトラクションでは一緒に働く仲間を募集しています

スプレッドシートのセルを編集する度に、自動で該当のセル内に連番を振る方法

QAエンジニアの山本です。

この記事では、GAS(Google Apps Script)を使用して、スプレッドシートを編集する度に、自動で該当のセル内に連番を振る方法を紹介します。

※昨年も同様(https://kojichu.photoruction.com/entry/adcale20221203)の記事を書きましたが、もっと簡単に連番を振る方法を見つけたので、今回はその方法をご紹介します!

完成イメージ

まずは完成イメージからご覧下さい。

背景

私は新しいテストケースを作成する度に、100個以上の連番を振っています。より効率的にテストケースを作成するために、私は連番を振る作業を自動化しようと決意しました。

自動で連番を振る方法

  • GAS(Google Apps Script)を使用します。
  • ユーザーが対象のセルの値を変更した時に、トリガーの機能を使用してGASの関数を実行します。
  • 実行する関数は、現在のセルの値を取得し、改行ごとに文頭に連番を振り、該当のセルに出力します。

具体的な設定手順

手順1.連番を振りたいスプレッドシート上のシートを開く

手順2.連番を振りたいシート名にコピーする

※(例)完成イメージのGIF画像では「テスト実施シート」

手順3.連番を振りたい列を下記の要領で数値変換する

連番を振りたい列:数値

A列:1

B列:2

C列:3

(以下省略)

手順4.以下のコードの「テスト実施シート」を手順2で取得した値に、「4」を手順3で取得した値に置き換える

//「テスト実施シート」以外のシートorD列以外のセルor空文字の時は処理を終了
if(cell.getSheet().getName() !== "テスト実施シート" || cell.getColumnIndex() !== 4 || !cell.getValue()){
    return;
}

手順5.スプレッドシート拡張機能>Apps Scriptをクリックする

手順6.コードを下記コードに置き換えた後に、保存する

※6~8行目は手順4で作成したコード

function giveConsecutiveNumber() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const cell = sheet.getCurrentCell();

  //「テスト実施シート」以外のシートorD列以外のセルor空文字の時は処理を終了
  if(cell.getSheet().getName() !== "テスト実施シート" || cell.getColumnIndex() !== 4 || !cell.getValue()){
    return;
  }
  const lines = String(cell.getValue()).split("\n");
  let nonNumericLine;
  let output = "";
  for (let i = 0; i < lines.length; i++) {
    nonNumericLine = lines[i].replace(/^[0-90-9]+\.|^\./,"");
    // 最終行以外は改行を文末につける
    if(i < lines.length - 1){
      output += (i + 1) + "." + nonNumericLine + "\n";
    }else{
      output += (i + 1) + "." + nonNumericLine;
    }
  }
  cell.setValue(output);
}

手順7.サイドメニューのトリガーをクリック

手順8.「トリガーを追加」をクリック

手順9.下記の設定でトリガーを追加する

手順10.「保存」をクリック

手順11.アクセス権に関するモーダルを確認し、問題がなければ承認する

完成!

まとめ

上記の設定により、セルを編集する度に、自動で連番が振られるようになりました。

テストケース作成が完了したら、トリガーは不要なので、削除してくださいね。

最後まで、ご覧頂きありがとうございました。

おまけ(コードの解説)

function giveConsecutiveNumber() {
//中略
}

連番を振る関数です。

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const cell = sheet.getCurrentCell();

定数sheetに、スプレッドシートのUIに表示されているシートを代入します。

定数cellに、現在のセルを代入します。

  //「テスト実施シート」以外のシートorD列以外のセルor空文字の時は処理を終了
  if(cell.getSheet().getName() !== "テスト実施シート" || cell.getColumnIndex() !== 4 || !cell.getValue()){
    return;
  }

もし「現在のセルのシート名が「テスト実施シート」以外」or「現在のセルがD列以外」or「現在のセルが空」の時は、関数の実行を終了します。

  const lines = String(cell.getValue()).split("\n");
  let nonNumericLine;
  let output = "";

定数linesに、現在のセルを改行ごとに分割した配列を代入します。

変数nonNumericLineを宣言します。

変数outputに、空文字を代入します。

  for (let i = 0; i < lines.length; i++) {
    nonNumericLine = lines[i].replace(/^[0-90-9]+\.|^\./,"");
    // 最終行以外は改行を文末につける
    if(i < lines.length - 1){
      output += (i + 1) + "." + nonNumericLine + "\n";
    }else{
      output += (i + 1) + "." + nonNumericLine;
    }
  }

定数linesの既存の行番号を取り除き、新しく行番号を振った後に、変数outputに代入します。

  cell.setValue(output);

現在のセルに、変数outputを出力します。

株式会社フォトラクションでは一緒に働く仲間を募集しています

入社約半年経った所感・感じた課題と今後の展望

はじめまして、モバイルチームでAndroidエンジニアを担当している藤井です。 チームではエンジニアリングマネージャー(以下、EM)という役割を任されていて、大阪に住んでフルリモートで勤務しています。

フォトラクションに入社するまでは、他業界のスタートアップやソーシャルゲームの業界などでWeb開発やモバイル開発を経験してきました。

趣味は格闘技観戦とブラジリアン柔術です。

今回は入社して半年が経った振り返りを兼ねて、私が感じたことや学んだことを共有したいと思います。

入社後に感じたこと


あくまでもモバイルチームに属しているAndroidエンジニアとしての目線ですが、入社後に感じたことは良いと思った点・改善したい点共にいくつかあります。

ただ、改善したい点があるとは言っても決してネガティブな事ではなく、今後の伸び代だと個人的には捉えています。

良いと思った点

  • 週に1回リリースを行い、短いスパンで価値を提供。また、それを実現するためにCI/CDによるデリバリーサイクルの自動化がなされている
  • まだ途上とはいえ大枠の設計方針が確立されており、新規に機能追加する際は比較的迷いが少ない

改善したい点

  • DBアクセスのロジックがUI層から切り離し切れてないなど、設計方針の反映はまだ途上
  • iOS版と比較して、Android版はアプリの利用状況の可視化が出来ているとは言えない
  • アプリが安定性やパフォーマンスに改善の余地がある
  • スクラムの手法についてある程度確立されてはいるものの、まだ手探り且つ見えていないであろう課題もあるので継続的に学んでいく必要がある

EMとして働く上で直面した課題


個人レベルの課題

今までのキャリアではEMの役割を経験したことがなく、イメージできていないことも多かったので不安を感じていました。その不安に対処するため、別チームのEMと定期的に話す機会を設けて情報交換や悩みの相談などを行いました。

また、オンラインでのコミュニケーションがメインのため、部署・チームを越えたコミュニケーションの機会が普段の業務では多いとは言えないなと感じています。 そのため、個人の取り組みとして例えば有志で開催されている輪読会に参加するなど、時間の許す限りチームを越えたコミュニケーションの機会を増やすように努めています。

プロダクトの課題

モバイルアプリの将来像をどうするかという大きな課題が有ったため、PM(プロダクトマネージャー)やTL(テックリード)と共に週一のモバイルリーダー定例を発足し、方針を議論し合うことで対処しました。この課題はアプリの利用状況を可視化して現状を知るところから初めて、徐々に理想の形に持っていけたらと思います。

チームの課題

入社後に感じたことでも言及していましたが、開発方法にスクラムを導入しては居るものの、私自身含めスクラムの経験値が高いとは言えないため、まだまだ手探りで進めている状況が散見されるかなと思っています。そのため、スクラムアジャイルの知識を深める取り組みが必要になってくるのかなと感じています。

また、モバイルアプリのエンジニアがまだまだ少ない状況であるため、採用活動に注力していく必要があります。そのために私自身が会社の事をよく知り会社のことを説明できるようになっておくことや、新たなエンジニアをサポートしていく仕組みの構築が重要だと思っています。

今後の目標や展望


今後はモバイルアプリを改善する足がかりとしてアプリの利用状況を可視化していくことに注力しつつ、プロダクトの課題に向き合っていけたらと考えています。

当然ながら採用活動や開発サイクルの改善などを始めとするチームの課題にも向き合って行きつつ、見えていない課題もまだまだあると思うので、それらを明確にしつつ改善していけたらなと思っています。

また、手探りながらも同じ様にプロダクトやチームの課題に向き合うことを楽しめるエンジニアを募集しているので、少しでも興味を持っていただけたら連絡いただけると嬉しいです。

最後に


余談ですが、この記事はChat-GPTの助けを借りて作成しました。

会社でもGithub Cpilotを試していこうという動きも有り、私自身もこれらのAIプロダクトを公私共にうまく使っていけたらなと考えております。

株式会社フォトラクションでは一緒に働く仲間を募集しています

PymupdfでPDFからテキスト情報を取り出す方法

はじめに

初めまして、エンジニアとして株式会社Photoructionでアルバイト中の伊藤純平です!

最近は春のじめっとした暑さにやられて、脱いだら寒い、着たら暑いというジレンマに陥っています。あまりにも気温差が激しいので、服装選びが毎朝のハードルになってしまっていますね。

今回の記事では、PDFからテキスト情報を抽出する方法について説明します。

自分のチームではPDFを扱うことが多く、これらをPyMuPDFと呼ばれるPythonのライブラリを用いて操作しています。

自分が詰まったテキストの位置、色など全テキスト情報の取得について、自分の学びも含めてお伝えできたらなと思います!

PyMuPDFの読み込みや線の取得などについては、過去の記事をぜひ参考にしてください!

導入

PythonでPDFを操作するためのライブラリにもいくつかあり、今回はPymupdfを使っていきます!

まずはPyMuPDFをインストールし、使うためにfitzをインポートします。

pip install PyMuPDF
import fitz

PDFの読み込み

今回の記事はベクター形式のPDFに対応してます!

ベクター形式とはなんぞやという方はこちらを参照してみてください。

# PDFファイルパスの読み込み
pdf_path = input()

# 1ページ目の要素を取得
document = fitz.open(pdf_path)
page = document[0]

print(page.get_text("dict"))

とすると詳細な文字情報が辞書形式で出力されます!

以下はその一例です。

//各ブロックのバウンディングボックス
{'blocks': [{'bbox': (319.2799987792969,582.891845703125,344.1431884765625,588.4169921875), 
 'lines': [{'bbox': (319.2799987792969,582.891845703125,344.1431884765625,588.4169921875), //各行のバウンディングボックス
        'dir': (1.0, 0.0), //行の方向
        'spans': [{'ascender': 0.339375, //文節のリスト
                          'bbox': (319.2799987792969,582.891845703125,344.1431884765625,588.4169921875), //文節のバウンディングボックス
                         'color': 0, //文節の色
                         'descender': 1.140625, //文節の高さ
                         'flags': 8, //文節の文字数
                         'font': 'MS-Gothic', //文節のフォント
                         'origin': (319.2799987792969,587.6400146484375), //文節の原点
                         'size': 5.52515983581543, //文節のサイズ
                         'text': 'Hello_world'}], //文節の文字
                         'wmode': 0}],
         'number': 0,
         'type': 0},
.....}

上のようにテキスト情報以外にもフォントや位置、色、サイズなど情報を取得することができます!

そのほかの方法

PDFファイルから形を保持したままTextにしたいという方は、こちらも便利かもしれません。

import sys
from fitz.**main** import main as fitz_command

# PDFファイルパスの読み込み
pdf_path = input()

cmd = f"gettext  {pdf_path}".split()
saved_parms = sys.argv[1:]
sys.argv[1:] = cmd
fitz_command()
sys.argv[1:] = saved_parms

これを実行することで左下のようなpdfファイルから右下のようにテキストファイルへとテキストを抽出することもできます。

終わりに

いかがでしたでしょうか。

以上が、PDFから文字のすべての情報を取り出す方法についての解説でした。

PDFを扱う際には、PyMuPDFはとても便利なツールです。今回紹介した文字取り出し以外にも描画情報や画像情報を取り出したりすることもできます。

PythonでPDFを扱う際には、ぜひPyMuPDFを試してみてください!

参考

Introduction - PyMuPDF 1.21.0 documentation

株式会社フォトラクションでは一緒に働く仲間を募集しています

Python開発で重宝するライブラリpathlibの使い方

はじめに

こんにちは、AIエンジニアの志賀です。

最近は花粉症に悩まされる日々も終わりが差し掛かり、サクラ咲く季節がやって参りました。寒さと花粉を乗り越えた先にある心地の良い期間だと毎年感じさせられます。

このたびはPython開発で重宝するライブラリpathlibの使い方についての技術ブログをご覧いただきありがとうございます。

Python開発において、OSのファイルパスを扱う必要がある場面は多々ありますが、pathlibを使えばOSのファイルパスを簡単に取り扱うことができます。

本記事では、pathlibの基本的な使い方について解説していきますので、Python開発におけるファイルパスの操作について興味のある方は是非最後までご覧ください。

導入

pathlibとは

Pythonには、OSのファイルパスを扱うための標準ライブラリであるos.pathがあります。

しかし、os.pathは文字列操作が必要であったり、パスの区切り文字がOSによって異なるため、パスの扱いに手間がかかることがあります。

こうした問題を解決するために、Python 3.4からはpathlibというライブラリが標準で提供されるようになりました。pathlibは、OSのファイルパスをオブジェクト指向で扱うことができるため、パスの操作が簡単になります。

pathlibの基本的な使い方

まずは、pathlibの基本的な使い方を見ていきましょう。

以下、使用例になります。

from pathlib import Path

# ファイルパスの生成
file_path = Path("path/to/file.txt")

# ディレクトリパスの生成
dir_path = Path("path/to/directory/")

# パスの結合
new_path = dir_path / "new_file.txt"

Pathオブジェクトを生成するには、文字列でパスを指定します。

Windowsの場合は、区切り文字にバックスラッシュを使う必要がありますが、Pathオブジェクトを使えば自動的にスラッシュ(/)に変換されます。

また、パスの結合は「/」演算子で行うことができます。

# ファイルの存在確認
if file_path.exists():
    print("File exists")

# ファイルの読み込み
with file_path.open() as f:
    content = f.read()

ファイルの存在確認にはexistsメソッドを、ファイルの読み込みにはopenメソッドを使います。

ファイル操作が完了した後には必ずclose()メソッドを呼び出す必要があります。

ただし、with文でブロックを作ることで、close()メソッドの呼び出しを自動的に行うことができるため、open()メソッドの呼び出し時にwith文を使用することが推奨されています。

with文を使用する事で、ファイルのクローズ漏れを防止し、コードをより簡潔に保つことができます。

# ファイルの書き込み
with new_path.open(mode="w") as f:
    f.write("Hello, world!")

ファイルに書き込むには、openメソッドのmode引数に"w"を指定します。書き込みが終わったら、closeする必要がないことに注意しましょう。

# ディレクトリの作成
new_dir = Path("new_directory/")
new_dir.mkdir()

ディレクトリを作成するには、mkdirメソッドを使います。

# ディレクトリ内のファイル一覧の取得
for file_path in new_dir.glob("*"):
    print(file_path)

# パスの情報取得
print(file_path.name)  # ファイル名を取得
print(file_path.suffix)  # 拡張子を取得
print(file_path.parent)  # 親ディレクトリを取得
print(file_path.is_file())  # ファイルかどうか判定

globメソッドを使えば、ディレクトリ内のファイル一覧を取得することができます。

また、Pathオブジェクトには、ファイル名、拡張子、親ディレクトリを取得するメソッドが用意されています。

is_fileメソッドで、Pathオブジェクトがファイルかどうかを判定することもできます。

終わりに

以上が、Python開発で重宝するライブラリであるpathlibの基本的な使い方についての解説でした。

いかがでしたでしょうか。

pathlibを使えば、OSのファイルパスをオブジェクト指向で扱えるため、ファイルパスの操作が簡単になります。

また、Pathオブジェクトには、ファイル名、拡張子、親ディレクトリを取得するメソッドが用意されているため、ファイルパスの取り扱いがより容易になります。

是非、Python開発でpathlibを使って、効率的なコーディングをしてみてください。

株式会社フォトラクションでは一緒に働く仲間を募集しています

WEBワーカーを外部ファイルを使わずにインラインで実行し方

こんにちは。Webチームのジョンです。

今回はWEBワーカーについて、記事を書きました。

WEBワーカーとは

WEBワーカーは独立しているJavascriptでバックグラウンドに走るスクリプトになります。一般的にはJavascriptはシングルスレッドプログラミング言語のため同時に複数スクリプトを走らせることができません。でもWEBワーカーを使うことでJavascriptのメインプロセスをブロックすることなしで複数のスクリプトを実行することができます。

WEBワーカーの基本的な使い方

demo_workers.js

var i = 0;

function timedCount() {
  i = i + 1;
  postMessage(i);
  setTimeout("timedCount()",500);
}

timedCount();

main_script.js

if (typeof(w) == "undefined") {
  w = new Worker("demo_workers.js");
}

w.onmessage = function(event){
  console.log(event.data);
};
  1. まず、WEBワーカーに実行したいスクリプトを作り、demo_worker.jsファイルに保存しました。
  2. メインのスクリプトnew Worker()でWEBワーカーのインスタンスを作り、WEBワーカーに実行したいスクリプトのファイルを第一引数に設定する。
  3. WEBワーカーのインスタンスonmessageイベントを付けてWEBワーカーから送られたメッセージをメインスクリプトに受け取りconsole.logで出す。

外部ファイルを使わずに

  1. まずWEBワーカーに実行したいスクリプトを文字列として変数に格納する。
  2. encodeURIComponentファンクションを使い、スクリプトの文字列のデータURIを作成します

     const workerCode = `
         var i = 0;
    
         function timedCount() {
             i = i + 1;
             postMessage(i);
             setTimeout("timedCount()",500);
         }
    
         timedCount();
     `;
     const workerURI = `data:text/javascript;charset=utf-8,${encodeURIComponent(workerCode)}`;
    
  3. blobを使うこともできます

     const workerBlob = new Blob([workerCode], { type: 'text/javascript' });
     const workerURL = URL.createObjectURL(workerBlob);
    
  4. 後は、基本の使い方と全く同じになります。

     // encodeURIComponentを使った場合
     const w = new Worker(workerURI);
    
     // blobを使った場合
     // const worker = new Worker(workerURL);
    
     w.postMessage('Hello, worker!');
     w.onmessage = function(event){
       console.log(event.data);
     };
    

まとめ

インラインでWEBワーカーのコードを書くのは便利ですがデメリットとメリットがあります。スクリプトを文字列にしないといけないため、管理しにくくなりますし、IDEのコードハイライトや文法チェック、リント等が効かなくなります。その時は別のJavascriptファイルに入れた方がいいと思います。

小さいコードであればインラインで書いても問題ないですが、そもそもWEBワーカーを使うべきなのか?という問題も出てきます。

いろいろWEBワーカーの書き方がありますが、結局自分のユースケースによってどれを一番ふさわしいのかを自分で判断しないといけないです。