webプロダクトいんふぉ

webの気になった情報を発信中!!

pythonの配列(リスト)メソッド

応用的なメソッド

リストの中身を指定して削除する方法

基本:delを用いて削除

よくあるのがこのパターンで、リストから値を削除するときによく使うメソッド ※ delをインデックスを指定せずに使用するとリスト毎削除されるので要注意

s = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
del s[1]
print(s) # ['a', 'c', 'd', 'e', 'f', 'g']

範囲で削除する場合にはスライスを使用してあげれば複数の値を削除可能

s = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
del s[1:4]
print(s) # ['a', 'e', 'f', 'g']

空のリストを使用して削除

この方法はスライスを用いていないと使用不可

s = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
s[1:4] = []
print(s) # ['a', 'e', 'f', 'g']

delと同様の結果を得ることが可能 ただ、インデックスを使用すると空のリストが挿入され二次元配列になる

s = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
s[1] = []
print(s) # ['a', [], 'c', 'd', 'e', 'f', 'g']

他にはただ削除するのではなく、リストの中の値を取り出し、かつ削除する場合はpopを使用可能

s = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
i = s.pop(0)
print(i) # a
print(s) # ['b', 'c', 'd', 'e', 'f', 'g']

もう一つ、インデックスではなくリストの値を指定して削除するにはremoveを使用

s = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
s.remove('c')
print(s) # ['a', 'b', 'd', 'e', 'f', 'g']

ES6のPromise

Promiseとは?

Promiseは、ES6において、非同期処理のコールバック関数をシンプルに記述するための仕組みです。 JavaScript側でネイティブに実装されているため、requireで外部からモジュールをimportせずに、使えるのがメリット

Promiseの3つの状態

promiseには、 - unresolved - resolved - rejected

の3つの状態があります。 unresolvedは、何かしらの処理を実行中の状態です。インターネット経由で画像などを取得しようとしていて、そのしている最中はunresolvedになります。 処理が何かしら終わった時に、resolvedとrejectedのいずれかに移行します。 正常にレスポンスが帰ってきた場合は、resolvedに移行します。 画像を取得しようとしていて、途中で通信が遮断されてしまい、リクエストが失敗してしまった時はrejectedに移行します。

そして、処理が終わった後に、別の処理を書いていきたいのですが、これはコールバックで受け取ります。 ただ、resolvedとrejectedでコールバックのメソッドが違うので注意してください。 resolvedのコールバックはthenで受け取り、rejectedはcatchメソッドで受け取ります。 一番な簡単なpromiseオブジェクトの作成から、コールバックで受け取るところまでのコードが下記になります。

promise = new Promise((resolve, reject) => {
  resolve();
});

promise.then(() => {
  console.log('処理完了');
});

promise.catch(() => {
  console.log('処理失敗');
});

Promiseのもう一つの特徴として、thenやchatchはPromissオブジェクトに複数登録することができます。 下記のように書けるので、一つにまとめることができます。

promise = new Promise((resolve, reject) => {
  resolve();
});

promise
  .then(() => {
    console.log('処理完了');
  })
  .then(() => {
    console.log('2回目の実行');
  });

この時に注意して欲しいのが、thenとcatchそれぞれのみをまとめることができると勘違いしないでください。 なので、一番最初のコードは以下のようにまとめることができます。

promise
  .then(() => {
    console.log('処理完了');
  })
  .then(() => {
    console.log('2回目の実行');
  })
  .catch(() => {
    console.log('処理失敗');
  });

LINE DEV DAY 2019 に参加してきた

深層学習と脳科学

生命化学(生命の誕生)の話から始まり、生命とは情報と物質からなる。つまり、自己を複製し次世代に伝える物質とこの時は言っていました。 そこから、神経科学に話が移り、脳=人間とは何かにまで言及し、思考・言語・意識・人間・社会・文明を司るモノ(社会に生きる生命:文化と社会はどこから来たのか)ということから、宇宙誌まで論理が発展しましたw

そんな話から始まり、現在の技術はどこまで発展しているのかというところに話が戻り、産業革命時代には、動力技術や機械技術が目覚ましい発展を遂げ、現在は生命技術(遺伝子編集)や情報技術(知能・心)にまで技術が及び、技術の発展は止まらないとおっしゃっていました。

これまでの話を統括して、物質の法則:宇宙、生命の法則:情報+物質=>進化、文明の法則:心+情報+物質=>社会・文化が人間を形成していて、知能を理解するにはこれらを理解する必要があるとのこと

そこから深層学習の問題点に話が移り、AI側は何故その結果に至ったのかという原理は追求しないが、人間はこれまでの歴史を辿ってみても原理にこだわっていることが見て取れる。つまり、人間は入力を基に正解に辿りつく時に、例えば、日蝕の予測を立てる際には、ケプラーの法則ニュートン力学を使用して予測を立てる。AIはそこまで言及できない。今あるデータからしか予測しないからだ。つまり、原理の創出・理解は人間にしかできないことだと言える。

では、ロボットは心を持てないのか?という疑問に対しては、現在は難しいと言える、種の生存と個の不合理:使命感を理解・体験できなからだ。 人間は不合理であるため芸術、愛、喜び、苦悩と言ったただ一度の、かけがえない人生に意味を見出す。これに対して、ロボットは合理的であるのが一つの原因であるとの見解を示した。

その他にも深層学習の問題点として、何故学習をうまく行うには層を深める必要があるのか、万能性と脆弱性と言ったことについてもお話されていたがここでは割愛する。

言いたいこととしては、AIも人間と一緒で「偏った知識ばかりを教え込まれると応用問題が解けないように育っちゃいますよ」という事。この辺がMachine Learningを使う際に考慮が必要な所。実際、新たなデータを学習し続けることでAIが過去のパターンを「忘れる」事もあり、これを「破壊的忘却」という。

その他、気になった情報

  • LINEアカウントの乗っ取り・なりすましは機械学習を用いて、2018年度は0件を達した。=>裏側については詳細はなし
  • サービスについて仮に明確なビジョンを描けなくても「こんな〇〇はイヤだ!」を明確化するのは超有効。なりたい姿ではなく、なりなくない姿を明確にする。これ、会社の組織文化づくりにも使えるメソッド
  • まだ、Perlが多数を占めていて、絶賛Javaに移行中
  • レコメンドシステムはML + オペレーティングで運用している
  • What: ビジネス、テック、クリエイティブのバランスを取るには、Why: 単一の指標ではサービスが歪みやすく行き詰まるから、How: 三者共通の認識モデルを作成、成長モデルを共有する
  • プロダクトをチームで作るのではなく独立したチームとし、お互いが干渉することことなく並行して開発をすすめる
  • 焦点を当てるべきは「システム」ではなく「会社」のボトルネック。ビジネスサイドの人間とも対等に話をし、仮説を最小限の工数で検証できるか考える。

f:id:front-end-engineer:20191122005349j:plain

f:id:front-end-engineer:20191122005418j:plain

TechCrunch Tokyo2019に参加して来た時のメモ Day1

Day1

「最新ガジェットを試し購入できるリテール・アズ・ア・サービスb8taの戦略」

諸事情により参加できず

「自動運転OS『Autoware』が作り出す未来」

Autowareとは、自動運転開発を促進するオープンソースソフトウェア。下記のような様々な機能が備わっている。 - 3D地図生成 - 経路生成 - 操舵制御 - センサーフュージョン - キャリブレーション - ダイナミックマップ - シミュレーション - データロガー

車道の広さなどが、国などによって規定が様々なため、自動運転は陣取り合戦になると言われている

自動運転はアジアとアメリカでの実証実験が多く、欧州は欧州内で標準化してから、グローバル化するため遅くなりがち

ティアフォーの現状は、一般公道を走るための準備ができている状態

JapanTaxiと組んで、2020年までにリリースすると断言している

タクシーの自動運転化に伴い、タクシー業界の雇用がどうなるのかの議論にも発展した(よくある話) 現在、タクシー運転手は各社共に足りていない状況。年間10%ずつ増加して採用しているらしい。

自動運転になったからといって、すぐに無人運転になるわけではなく、ハンドル操作はしないが、人はいる状態が長く続くと予想される。

これは、物流に関しても影響してくる部分で、「貨客混載」というワードが強く出てきている。無人運転では、人と物を一緒くたに運搬しようとすると、どうしてもセキュリティという部分がクリアすることが難しいが、有人であるのであればハードルはグッと下げることができる(ホスピタリティ)

ホスピタリティというキーワードがタクシー業界の雇用については付きまとい、例え、タクシー業界自体での雇用がなくなっても、転身することは容易だといっている。

社会を中心に考えていかないと、テクノロジーをプロダクトするのが難しい世の中になっている 社会と技術をいかに融合していくかが差別化の要因

Startup Battle

  • 不動産テック(オフィス探し、不動産オーナーとのマッチング <=> 職人・・・修繕依頼など)
  • D2Cが盛り上がっている部分も関与しオフラインの委託販売のマッチング
  • フリーランスの先払い(金貸し)
  • 物流のラストワンマイルの課題解決
  • 宇宙産業(ロケットの二次利用、ロボティクスの遠隔操作・シミュレーター)
  • セルフコーチング(CA:電話営業の課題解決)
    • 営業トークの可視化 => セグメントをどのように分けるかが重要そう
    • パーソナリティーやニュアンスまで把握可能

    • セルフコーチングツールと(定量化して振り返る)して利用可能
  • 立て替え経費精算(法人クレジットカード => 煩雑な管理業務)
    • オンライン管理 + プリペイド
    • 従業員と経理と経営者の視点からアプローチが可能

その他のサービスに関してはリンクを参照(諸事情により見れず)

Startup Battleファーストラウンド・グループC(5社)

Startup Battleファーストラウンド・グループD(5社)

ディープフェイクの可能性

ネガティブの要素が強い技術として広まってしまっているが、アンチウィルスなどと同じような経緯を辿りそうだと予想されている

この技術を使う上で、ブロックチェーンが有用ではないかという視点も上がってきている。上がってきた画像・動画が本物かどうかを担保するといった考え方 法律などではカバー仕切れない

関連する技術として、adobe max 2019で発表されたabout faceも同じようなことが言える

adobe max 2019

ポジティブな使い方としては、自分の顔を出さずにメディアなどに露出(vartual youtuberみたいなもの)ができる => 自身のアイデンティティが守られる

シリーズCで60億円超を調達、SmartHRのこれまでとこれから

現在も社会保険手続などのペーパーワークの効率化を目指している。

入社手続き(年収などの確認)の書類などもweb上で発行して、入社予定者のアドレスに送った上で、確認が取れれば、人事に通知が飛んでくる。 入力不備などがあった際のダブルチェックなどの仕組みがどうなっているかは不明

60億の使い道(シリーズC) - 半分が人もう半分がマーケ費用 - 現状で6割の完成度(お客の規模や、ジャンルなどで求められる水準が上がっているため) - 必要な機能のリストアップを常に行なっている(エンジニアが多数いて困ることはない) - カスタマーサクセス(オンボーディングを手厚くする必要がある) - 顧客満足度=>カスタマーサクセスの人の採用を積極的に行う - 人材採用の進め方=>面接前から会社の情報をオープン=>フィルタリングの機能=>採用コストの低下

会社情報の開示(かなり深いところまで)

SmartHRの解約率は、0.5%と驚異的。こういったSaaSは2%切れば優秀

ビジネスモデルによって勝てるカルチャーが違う。

営業組織みたいなカルチャーが適しているか、プロダクト重視のカルチャーが適しているかどうか等いったこの理由で、新規事業ではなく、子会社化(保険事業など)をして会社を運営している。(混ぜるのは危険だから、会社を分けた)

創業してからピボットしまくって、プロダクトもこれより前に失敗も含めるとだいぶあったそうですが ・やるべきこと(イシュー) ・やれること(ケイパビリティ) ・やりたいこと(カルチャー) がうまく噛み合ったのが SmartHR

利益率の割合が、当初は100名以下の企業がメインになると思っていたが、現状売上は2割程度。100-1000名が5割、1,000名以上が3割。

今回の資金調達は海外投資家が半分以上を占める 海外の投資家はSaasビジネスの ・解約率 ・ネットリテンションレート をとてもみる。

逆に市場規模はそこまで気にしない。 (そもそも日本は大きいという認識)

最初は、自分達にできることでソリューションを探して行ったそうだが、これでは上手くいかず、自分たちができることじゃなくて、世の中の課題を探していた。 毎週仮説検証をしてて、なかなか見つからなかった。 たまたま奥さんが産休手続きをしているのを見て、課題が深そうだ!と思って始めたのがSmartHR

「ボイスメディアの過去、現在、未来」

オファーレターや週報などを音声でやるとエンゲージメントが上がるらしい ただし、軽く触ってみただけだと効果が出ず、ガッツリと触れてみる必要がある。

HR分野に音声を導入 ↓ 綺麗に作った動画や写真よりも熱量が伝わりやすい。 エンゲージやモチベーション向上に繋がる

Google App Scriptを使用してGmail情報をスプレッドシートに書き出す

ebookなどのダウンロード情報(お名前・メールアドレス)からメルマガ用のリストを自動で作りたくて、Gmail情報をスプレッドシートに書き出してみました。

GmailGoogleスプレッドシートを連携させたかったので、今回は手軽に実装できるGoogle App Script(GAS)を使用しました。

Googleスプレッドシートを作成します

作成後、メニューバーの「ツール > スクリプトエディタ」をクリックし、GASを書くためのエディタを起動します。

f:id:front-end-engineer:20190111211308p:plain

今回は、下記のようなメールの中から「お名前」と「メールアドレス」を取り出します。

f:id:front-end-engineer:20190111212459p:plain

次に取り出すための、コードを書いて行きます。

f:id:front-end-engineer:20190111211943p:plain

function searchContactMail() {
  
  /* Gmailから特定条件のスレッドを検索しメールを取り出す */
  var strTerms = 'from:"example.com"'; //メール検索条件
  var numMailMax = 20000; //取得するメール総数  
  var numMail = 500; //1度に取得するメール数
  var myThreads; //条件にマッチしたスレッドを取得、最大500通と決まっている
  var myMsgs; //スレッドからメールを取得する →二次元配列で格納
  var valMsgs;
 
  var i = SpreadsheetApp.getActiveSheet().getLastRow()-1;
  var wrong_email = 0;
  
  if(i<numMailMax) {  
    valMsgs = [];
    myThreads = GmailApp.search(strTerms, i, numMail); //条件にマッチしたスレッドを取得、最大500通と決まっている
    myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する →二次元配列で格納
    /* 各メールから日時、送信元、件名、内容を取り出す*/
    for(var j = 0;j < myMsgs.length;j++){
      var Body = myMsgs[j][0].getPlainBody(); 
      var name = Body.split('お名前:')[1].split('\n')[0]
      var email = Body.split('メールアドレス:')[1].split('\n')[0]
      
      if(myMsgs.length>0){
        SpreadsheetApp.getActiveSheet().getRange(j + 2, 1).setValue(name); //シートに貼り付け
        SpreadsheetApp.getActiveSheet().getRange(j + 2, 2).setValue(email);
      } 
    }
  }
}

コードの中で重要になってくるのが、どのメールを対象にするかという var strTerms = 'from:"example.com"'; //メール検索条件 の部分になります。 今回は送信者を限定して取得していますが、今回のケースでは、 var strTerms = 'subject:"ebookダウンロード"'; //メール検索条件 として件名を元にすることも可能です。

それぞれのコードに対してコメントを残してあるので、参考にしてみてください。

最後にここまで出来上がったら、コードを「command + s」windowsの方は「Ctrl + s」で保存し、メニューバーの下にある再生ボタンを押してください。 コードにエラーがでなかれば、実行中というアラートが表示され実行が終われば自動的に消えます。

実行が完了した画面が下記になります。 一行目の目次は自分で理解しやすいようにつけたので、ここに関してはお好みで大丈夫です。

f:id:front-end-engineer:20190111213427p:plain

この情報を元にメルマガツールを使用してメルマガ配信を行えば、簡単にメールマーケティングができるようになります。

メルマガツールとしては、個人的にはメール配信・メルマガ配信(月額1800円~)|Benchmark Emailが使いやすいと思っています。