Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

顧問エンジニア育成入門、作るしか無いかもしれん

この種の議論は僕が10年前に通った道だ。10年間何も変わっていない。

今のIT技術者への期待論を見ていると、まるで建築士に、「何でも良いからカッコいい家を作ってよ」とそっくりかえって言い放つ住人の姿のようだ。自分がどんな暮らしをしたいのかも言えないくせに、提案だけを求める。そして、出てきた図面を見ると、「こんな値段じゃ高すぎるよ!」と、必ず文句をつける。

ユーザ側の『ITイノベーター』こそ、急いで育成するべきだ : タイム・コンサルタントの日誌から

なんでこうなるかと言えば、ITシステムというのは建物ではなくプラント(工場)だからだ。建物はそれを作るだけで良い。ただ、プラントになれば話は別。どういった情報を収集し、集計もしくは加工し、最終的にどんな価値を提供すれば良いのかを考え無くてはならない。

で、問題は「どういった情報を収集し、集計もしくは加工すれば、経営に資する価値が生まれるのか」を一気通貫で考えられる人は絶望的に少ないことだ。「顧客情報をこう使いたい」というビジョンはだせるが、その情報をどう集めていくのかについての知見がないと、絵に描いた餅。地に足の付かないビジョンほど怖いものはない。

情報の活用価値を見出す部分は、IT素養がゼロでも出来る。しかし、情報の収集や集計と加工は、現時点で高度な職人芸。職人芸である以上、職人によって成果に開きが出ることはご理解頂けると思う。だから挫折するわけだし、ないものねだりをすることにつながる。

開発は外部組織に出せばいいじゃないか、ビジョンを伝えるだけで良いだろうと皆さんそう仰る。是非「動かないコンピュータ」「IT 訴訟」等で検索して頂きたい。職人になる必要はないけれども、オーダーメイドの仕方がわからないのに開発を外に出すのは、手榴弾を巻いたベストを着ているようなものだ。いつその爆弾が爆発するか、わかったもんじゃない。

「ユーザから要求されたものを作ります」という受け身の姿勢に留まるという話の90%は、手榴弾を巻いた人間の言うことは怖くて近寄れないという当然の帰結にすぎないと思う。ユーザー側に外部から要件定義が出来る人間を登用する等の発想は無いんですかね。

方法論は嫌いだけど、ワイが顧問エンジニア育成入門、作るしか無いかもしれん。

MySQLでサブクエリが遅い時に使える、派生テーブルでのJOIN

MySQLのサブクエリは(何故か知らんけど)相関クエリ扱いになるので、外側のクエリの件数に対してサブクエリで取得した数のループが走ります。こんなコードだろな、きっと。

for v in outer:
   for y in inner:
     #joinできるkeyがあればbreak

しかしながら、特にUPDATEしたい時にはサブクエリが使いたい。僕の例で言うと、注文IDが100の明細の発注ロットを全て3に変えたいという例がありました。サブクエリでやるとこうなります。

update 
  items as i 
set 
  i.lot = 3 
where 
  i.id in (
     select 
        item_id
     from 
        order_details
     where 
        order_id = 100
  )

おせええええええええええ、しねえええええええええええ

デキる子はこうします

JOINを使って、母集合を確定させます。これだと相関性はない。

update 
 items as i 
inner join (
 select 
   item_id 
 from 
   order_details
 where 
   order_id = 100) as orders 
 on i.id = orders.item_id

set i.lot = 3
deleteはこう
delete item from items as item
 inner join 
  (select 
   item_id 
  from 
   order_details
  where 
   order_id = 100) as orders on item.id = orders.item_id;

サブクエリだと直感的だから書きやすいけど、MySQLの場合は上記のような書き方が吉です。

SQLAlchemyでクロス集計

こんな感じでできます。

import sqlalchemy from case, func

rs = session.query(User,case[
  func.sum(case([(User.blood_type == 'A',1)],else_=0)).label("A"),
  func.sum(case([(User.blood_type == 'B',1)],else_=0)).label("B"),
  func.sum(case([(User.blood_type == 'O',1)],else_=0)).label("O"),
  func.sum(case([(User.blood_type == 'AB',1)],else_=0)).label("AB")
]).group_by(User.blood_type).all()

これはいいものだ。SQLAlchemy最高。

ContainerViewでのViewController切り替え

よくありますよね。SegmentedControlでスイッチを切り替えるタイミングで、ContainerViewのViewControllerを切り替えたいみたいな。あるある。

先駆者の方々を探してみた所、下記のエントリが最も簡単に実行できた。ソースコピペして動きます。

spin.atomicobject.com

子供のViewControllerをその都度切り替えて、そいつのviewをContainerViewにaddSubviewするという考え方。切り替えたいViewControllerの数だけConatinerViewを追加するというロックなやり方もあってそれはねーだろって思った次第。下記リンクがそのやり方.. deprecatedですよこれは。

coding discovery: Swap ViewControllers with a Segmented Control in iOS

EurekaでカスタムのViewControllerをPUSHしたい

Eurekaには「presentationMode」というプロパティがあって、これを実装しているRowに限りPushしたい対象のVCをカスタマイズできる。論よりコード。


Push CustomViewControler on Eureka Row

これが一番簡単。