2013-12-19 5 views
4

나는이 작업을하기에 정말로 애 쓰고 있습니다.API를 통한 루핑 Flickr의 결과

내 응용 프로그램에 데이터를 추가하기 위해 반복 할 수있는 배열과 해시 집합을 반환하는 Flickr API를 쿼리하고 있습니다.

나는 API 결과를 반복하여 컬렉션을 만드는 코드를 작성하기 시작했습니다.

def self.add_collection(collection) 
    puts "Adding collection..." 
    Collection.create!({ 
     :flickr_id => collection['id'], 
     :title  => collection['title'], 
     :description => collection['description'] 
     }) 
    puts "Added collection." 
    end 


    def self.add_all 
    tree = Flickr.collections_list 
    pp tree 
    puts "Got response from Flickr" 
    tree.each do |c| 
     c[1].each do |c| 
     add_collection(c) 
     if c["collection"] 
      add_collection(c['collection'][0]) 
     end 
     end 
    end 
    end 

내 API 결과는 다음과 같습니다 :

{"collections"=> 
    {"collection"=> 
    [{"id"=>"57928212-7215447632914033423", 
     "title"=>"site.co.uk", 
     "description"=>"", 
     "iconlarge"=>"/images/collection_default_l.gif", 
     "iconsmall"=>"/images/collection_default_s.gif", 
     "collection"=> 
     [{"id"=>"57928212-721457634949706778", 
     "title"=>"Holidays", 
     "description"=>"", 
     "iconlarge"=>"/images/collection_default_l.gif", 
     "iconsmall"=>"/images/collection_default_s.gif", 
     "collection"=> 
      [{"id"=>"57928212-724157634943457291", 
      "title"=>"Standard", 
      "description"=>"", 
      "iconlarge"=>"/images/collection_default_l.gif", 
      "iconsmall"=>"/images/collection_default_s.gif", 
      "set"=> 
      [{"id"=>"721576289846181735", 
       "title"=>"Di-ip", 
       "description"=>"11th-13th May 2008 - (-W)"}, 
       {"id"=>"7215-90497324306", 
       "title"=>"O-ay", 
       "description"=> 
       "August 2005 - (P- T)"}, 
       {"id"=>"721576290947297760", 
       "title"=>"Iceland Holiday", 
       "description"=> 
       "5- 2004 - (N-)"}]}, 
      {"id"=>"57928212-742157629691182748", 
      "title"=>"1 - W-09", 
      "description"=>"", 
      "iconlarge"=>"/images/collection_default_l.gif", 
      "iconsmall"=>"/images/collection_default_s.gif", 
      "set"=> 
      [{"id"=>"721576296835355462", 
       "title"=>"D-er", 
       "description"=>""}, 
       {"id"=>"721576294683541696", 
       "title"=>"D-rea", 
       "description"=>""}, 
       {"id"=>"721576296843554852", 
       "title"=>"D-gdom", 
       "description"=>""}, 
       {"id"=>"721576297104465912", 
       "title"=>"Day 4 - Gilr-walk", 
       "description"=>""}, 
       {"id"=>"721576294710474644", 
       "title"=> 
       "Day 5 - Calif-uth", 
       "description"=>""}, 
       {"id"=>"721576249710489442", 
       "title"=>"Day 6 - Si-untain", 
       "description"=>""}, 
       {"id"=>"721576429834618028", 
       "title"=> 
       "Day 7 - Unive-za", 
       "description"=>""}, 
       {"id"=>"721576249834637138", 
       "title"=>"Day 8 - Se-Park", 
       "description"=>""}, 
       {"id"=>"721576249836419418", 
       "title"=>"Day 9 - Lego-Park", 
       "description"=>""}, 
       {"id"=>"721576249851123596", 
       "title"=>"Day 10 - Kn-re City", 
       "description"=>""}, 
       {"id"=>"721576298541700916", 
       "title"=>"Day 11 & 12 - Disn-sort", 
       "description"=>""}, 
       {"id"=>"721576249851713058", 
       "title"=>"Day 13,14 & 15 - La-as", 
       "description"=>""}]}, 
      {"id"=>"57928212-721547629866347760", 
      "title"=>"2 - Mi-10", 
      "description"=>"", 
      "iconlarge"=>"/images/collection_default_l.gif", 
      "iconsmall"=>"/images/collection_default_s.gif", 
      "set"=> 
      [{"id"=>"721576294866337538", 
       "title"=>"Day 0 - Arr-rica", 
       "description"=>""}, 
       {"id"=>"721576298468655454", 
       "title"=>"Day 1 - M-a", 
       "description"=>""}, 
       {"id"=>"721576299707347598", 
       "title"=>"Day 2 - Adven-n", 
       "description"=>""}, 
       {"id"=>"721576430011649024", 
       "title"=>"Day 3 - W-un", 
       "description"=>""}, 
       {"id"=>"721576304034790528", 
       "title"=>"Day 4 - Sil-", 
       "description"=>""}, 
       {"id"=>"721576300354520246", 
       "title"=>"Day 5 - St-eum", 
       "description"=>""}, 
       {"id"=>"721576300443090072", 
       "title"=>"Day 6 - Si-uis", 
       "description"=>""}, 
       {"id"=>"721576300443098290", 
       "title"=>"Day 7 - Ho-rld", 
       "description"=>""}, 
       {"id"=>"721576300448416804", 
       "title"=>"Day 8 - Indi-ach", 
       "description"=>""}, 
       {"id"=>"721576300448431390", 
       "title"=>"Day 9 - -ca", 
       "description"=>""}, 
       {"id"=>"721457629997482351", 
       "title"=> 
       "Day 10 - Mount O-eads", 
       "description"=>""}, 
       {"id"=>"721576304059600702", 
       "title"=>"Day 11 - Vall-", 
       "description"=>""}]}, 
      {"id"=>"57928212-721457630658165668", 
      "title"=>"3 - Intim-010", 
      "description"=>"", 
      "iconlarge"=>"/images/collection_default_l.gif", 
      "iconsmall"=>"/images/collection_default_s.gif", 
      "set"=> 
      [{"id"=>"721576341693409808", 
       "title"=> 
       "Day 1 - Gre-n City", 
       "description"=>""}, 
       {"id"=>"721576306547898798", 
       "title"=>"Day 1 - C-s", 
       "description"=>""}, 
       {"id"=>"721576306924436584", 
       "title"=>"Day 2 - -d", 
       "description"=>""}, 
       {"id"=>"721547630699845912", 
       "title"=>"Day 3 - Ran-vities", 
       "description"=>""}, 
       {"id"=>"721576304714758818", 
       "title"=>"Day 4 - Lo-urg", 
       "description"=>""}, 
       {"id"=>"721576304717785454", 
       "title"=>"Day 5 - Bu-urg", 
       "description"=>""}, 
       {"id"=>"721576304717785576", 
       "title"=>"Day 6 - Kin-ion", 
       "description"=>""}]}, 
      {"id"=>"57928212-742157631693570817", 
      "title"=>"4 - Bes-12", 
      "description"=>"", 
      "iconlarge"=>"/images/collection_default_l.gif", 
      "iconsmall"=>"/images/collection_default_s.gif", 
      "set"=> 
      [{"id"=>"721576316493011733", 
       "title"=> 
       "Day 0 - Early -orld Park", 
       "description"=>""}, 
       {"id"=>"721576316934409808", 
       "title"=> 
       "Day 1 - Grea-ity", 
       "description"=>""}, 
       {"id"=>"721576431698474564", 
       "title"=>"Day 2 - Shijin-rk", 
       "description"=>""}, 
       {"id"=>"721576341703216195", 
       "title"=> 
       "Day 3 - Happ-rk", 
       "description"=>""}, 
       {"id"=>"721574631713251068", 
       "title"=>"Day 4 - Victo-g", 
       "description"=>""}, 
       {"id"=>"721576314761492087", 
       "title"=>"Day 5 - Floral-ark", 
       "description"=>""}, 
       {"id"=>"721576318148565932", 
       "title"=>"Day 6 - H-du", 
       "description"=>""}, 
       {"id"=>"721576318148581382", 
       "title"=>"Day -ry", 
       "description"=>""}, 
       {"id"=>"721576318419272104", 
       "title"=> 
       "Day 8 - Ha-Park", 
       "description"=>""}, 
       {"id"=>"721576314820243661", 
       "title"=> 
       "Day 9 - Sha-ruise", 
       "description"=>""}, 
       {"id"=>"721574631872193783", 
       "title"=> 
       "Day 10 - Fisherma-ervatory", 
       "description"=>""}, 
       {"id"=>"721574631874073880", 
       "title"=> 
       "Day 11- Gongqin-ark", 
       "description"=>""}, 
       {"id"=>"721576318474794697", 
       "title"=>"Day 12 - Hap-ark", 
       "description"=>""}, 
       {"id"=>"721576318940558319", 
       "title"=>"Day 13 - -", 
       "description"=>""}, 
       {"id"=>"721576319544111677", 
       "title"=> 
       "Day 14 - G-World", 
       "description"=>""}, 
       {"id"=>"721576319624210803", 
       "title"=> 
       "Day 15 - Chi-or", 
       "description"=>""}, 
       {"id"=>"721576319628749339", 
       "title"=> 
       "Day 16 - Kn-rld", 
       "description"=>""}, 
       {"id"=>"721576319751048564", 
       "title"=>"Day 17 - Ha-hen", 
       "description"=>""}, 
       {"id"=>"721576319749243775", 
       "title"=>"Day 18 - O-eing", 
       "description"=>""}, 
       {"id"=>"721576319765947399", 
       "title"=>"Day 19 - Dis-ong", 
       "description"=>""}]}, 
      {"id"=>"57928212-721576434943433385", 
      "title"=>"5 - T-13", 
      "description"=>"", 
      "iconlarge"=>"/images/collection_default_l.gif", 
      "iconsmall"=>"/images/collection_default_s.gif", 
      "set"=> 
      [{"id"=>"721576349908483894", 
       "title"=>"Day 1 - Tai-ng", 
       "description"=>""}, 
       {"id"=>"721576349954099233", 
       "title"=>"Day 2 - -", 
       "description"=>""}, 
       {"id"=>"721576350042484738", 
       "title"=>"Day 3 - J-orld", 
       "description"=>""}, 
       {"id"=>"721576350594662914", 
       "title"=> 
       "Day 4 - For-t", 
       "description"=>""}, 
       {"id"=>"721576350545445863", 
       "title"=>"Day 5-dise", 
       "description"=>""}, 
       {"id"=>"721576352944144798", 
       "title"=> 
       "Day 6 - L-na", 
       "description"=>""}]}, 
      {"id"=>"57928212-721576435094962919", 
      "title"=>"6 - Japan 2013", 
      "description"=>"", 
      "iconlarge"=>"/images/collection_default_l.gif", 
      "iconsmall"=>"/images/collection_default_s.gif", 
      "set"=> 
      [{"id"=>"721576350944001201", 
       "title"=>"Day 1 - Fli-dium", 
       "description"=>""}, 
       {"id"=>"721576350494923653", 
       "title"=>"Day 2 - Tok-a", 
       "description"=>""}, 
       {"id"=>"721576350497502859", 
       "title"=>"Day 3 - Tobu Zoo", 
       "description"=>""}, 
       {"id"=>"721576351430344700", 
       "title"=>"Day 4 - Uni-an", 
       "description"=>""}, 
       {"id"=>"721457635131070810", 
       "title"=>"Day 5 - Hira-mple", 
       "description"=>""}, 
       {"id"=>"721576351444725534", 
       "title"=>"Day 6 - Yo-adise", 
       "description"=>""}, 
       {"id"=>"721576351454178145", 
       "title"=>"Day 7 - Nag-nd", 
       "description"=>""}, 
       {"id"=>"721547635164257344", 
       "title"=>"Day 8 - Hok-oro", 
       "description"=>""}, 
       {"id"=>"721576354182539619", 
       "title"=>"Day 9 - Ru-ort", 
       "description"=>""}, 
       {"id"=>"721576351472948421", 
       "title"=>"Day 10 - Jo-ea", 
       "description"=>""}, 
       {"id"=>"721576351894974362", 
       "title"=>"Day 11 - -d", 
       "description"=>""}, 
       {"id"=>"721576352035465038", 
       "title"=>"Day 12- Tok-kitori", 
       "description"=>""}, 
       {"id"=>"721576352574508275", 
       "title"=>"Day 13- To-a", 
       "description"=>""}, 
       {"id"=>"721576352746739360", 
       "title"=>"Day 14 - Tok-ea", 
       "description"=>""}, 
       {"id"=>"721576354268544001", 
       "title"=>"Day 15 - --ea", 
       "description"=>""}]}]}, 
     {"id"=>"57928212-721574628668300643", 
     "title"=>"Days out", 
     "description"=>"", 
     "iconlarge"=>"/images/collection_default_l.gif", 
     "iconsmall"=>"/images/collection_default_s.gif", 
     "collection"=> 
      [{"id"=>"57928212-721457628668352769", 
      "title"=>"One off's", 
      "description"=>"", 
      "iconlarge"=>"/images/collection_default_l.gif", 
      "iconsmall"=>"/images/collection_default_s.gif", 
      "set"=> 
      [{"id"=>"721576308409580828", 
       "title"=>"ChThisip", 
       "description"=>"Sun 29th July 2012 (Neil T, Mandy T)"}, 
       {"id"=>"721576306394290306", 
       "title"=>"Blackpool - 8th Jul 2012", 
       "description"=> 
       "(Neil T, MThisS, Ben K)"}, 
       {"id"=>"721576299940667113", 
       "title"=> 
       "Legoland Thisne 2010", 
       "description"=>"This)"}, 
       {"id"=>"721576294405676947", 
       "title"=>"SkThisl 1)", 
       "description"=>""}, 
       {"id"=>"721576294391564267", 
       "title"=>"Canal Boating", 
       "description"=> 
       "SunThismas)"}, 
       {"id"=>"721576294391564197", 
       "title"=>"SThisert", 
       "description"=> 
       "12th Jul 2003 - (PeThisrk T)"}, 
       {"id"=>"721576294391560887", 
       "title"=>"BThises", 
       "description"=> 
       " 29thThiss A)"}, 
       {"id"=>"721576290848461747", 
       "title"=>"Go Karting 2012", 
       "description"=>" 28th Jan 2012 for Neil's birthday"}, 
       {"id"=>"721576349284451987", 
       "title"=> 
       "SThis A)", 
       "description"=>""}]}, 
      {"id"=>"57928212-721574628668280287", 
      "title"=>"Theme Parks", 
      "description"=>"", 
      "iconlarge"=>"/images/collection_default_l.gif", 
      "iconsmall"=>"/images/collection_default_s.gif", 
      "collection"=> 
      [{"id"=>"57928212-721457634949768308", 
       "title"=>"TThisrk", 
       "description"=>"", 
       "iconlarge"=>"/images/collection_default_l.gif", 
       "iconsmall"=>"/images/collection_default_s.gif", 
       "set"=> 
       [{"id"=>"721576334256718298", 
        "title"=> 
        "TThisP)", 
        "description"=>""}]}, 
       {"id"=>"57928212-721576429626109372", 
       "title"=>"PlThisl", 
       "description"=>"", 
       "iconlarge"=>"/images/collection_default_l.gif", 
       "iconsmall"=>"/images/collection_default_s.gif", 
       "set"=> 
       [{"id"=>"7215762945459430821", 
        "title"=>"PThis11", 
        "description"=>"(Neil T, Rick M, Jackie DM)"}]}, 
       {"id"=>"57928212-721576249991000745", 
       "title"=>"GuThisld", 
       "description"=>"", 
       "iconlarge"=>"/images/collection_default_l.gif", 
       "iconsmall"=>"/images/collection_default_s.gif", 
       "set"=> 
       [{"id"=>"721576296244407020", 
        "title"=>"GThis011", 
        "description"=> 
        "(NeiThiseorge)"}]}, 
       {"id"=>"57928212-721576294990999301", 
       "title"=>"FThisd", 
       "description"=>"", 
       "iconlarge"=>"/images/collection_default_l.gif", 
       "iconsmall"=>"/images/collection_default_s.gif", 
       "set"=> 
       [{"id"=>"721576294625410346", 
        "title"=>"FlThis0", 
        "description"=>"(NThis)"}]}, 
       {"id"=>"57928212-721457628668340547", 
       "title"=>"DrThisor", 
       "description"=>"", 
       "iconlarge"=>"/images/collection_default_l.gif", 
       "iconsmall"=>"/images/collection_default_s.gif", 
       "set"=> 
       [{"id"=>"721576294638932742", 
        "title"=>"DraThis010", 
        "description"=>"(NThisW)"}]}, 
       {"id"=>"57928212-721547628668287225", 
       "title"=>"AltThisrs", 
       "description"=>"", 
       "iconlarge"=> 
       "http://farm8.staticflickr.com/7024/cols/72157628668287225_190361d603_l.jpg", 
       "iconsmall"=> 
       "http://farm8.staticflickr.com/7024/cols/72157628668287225_190361d603_s.jpg", 
       "set"=> 
       [{"id"=>"721576328264334688", 
        "title"=> 
        "FebThis P)", 
        "description"=>""}, 
       {"id"=>"721576306265468434", 
        "title"=>"Alt-ers - 15th Jul 2012", 
        "description"=>"(N-g A)"}, 
       {"id"=>"721576303726416660", 
        "title"=>"A-n 2012", 
        "description"=> 
        "(NThis K)"}, 
       {"id"=>"721576294666253333", 
        "title"=>"AThis2010", 
        "description"=>"(Thisl H)"}, 
       {"id"=>"721576294990697063", 
        "title"=>"AThis10", 
        "description"=>"(This)"}, 
       {"id"=>"721576299940655063", 
        "title"=> 
        "This008", 
        "description"=>"(NThis)"}, 
       {"id"=>"721576429990712153", 
        "title"=> 
        "Event 2011 - 31st Oct-1st Nov 2011", 
        "description"=>"(This)"}, 
       {"id"=>"721576295594429835", 
        "title"=>"This 29th-31st Oct 2009", 
        "description"=>"(ThisF)"}, 
       {"id"=>"721576291947499268", 
        "title"=> 
        "Behi-l 2006", 
        "description"=>"(This)"}, 
       {"id"=>"721576295411694365", 
        "title"=>"Day 2010 - 21st Jun 2010", 
        "description"=>"This)"}]}]}]}, 
     {"id"=>"57928212-721457628985775057", 
     "title"=>"Yearly Events", 
     "description"=>"", 
     "iconlarge"=>"/images/collection_default_l.gif", 
     "iconsmall"=>"/images/collection_default_s.gif", 
     "collection"=> 
      [{"id"=>"57928212-721576429836230144", 
      "title"=>"This", 
      "description"=>"", 
      "iconlarge"=>"/images/collection_default_l.gif", 
      "iconsmall"=>"/images/collection_default_s.gif", 
      "set"=> 
      [{"id"=>"721576299818309211", 
       "title"=>"Here StThisees", 
       "description"=>""}, 
       {"id"=>"721576296173454860", 
       "title"=>"Thisats", 
       "description"=>""}]}, 
      {"id"=>"57928212-721576258985777547", 
      "title"=>"Birthdays", 
      "description"=>"", 
      "iconlarge"=>"/images/collection_default_l.gif", 
      "iconsmall"=>"/images/collection_default_s.gif", 
      "set"=> 
      [{"id"=>"7215762899995365613", 
       "title"=>"This12", 
       "description"=>""}]}]}, 
     {"id"=>"57928212-721576298356236274", 
     "title"=>"Misc", 
     "description"=>"", 
     "iconlarge"=>"/images/collection_default_l.gif", 
     "iconsmall"=>"/images/collection_default_s.gif", 
     "set"=> 
      [{"id"=>"721576295511800621", 
      "title"=>"This", 
      "description"=>""}, 
      {"id"=>"721576295391565747", 
      "title"=>"This", 
      "description"=>""}]}]}]}, 
"stat"=>"ok"} 

나는 그것은 너희들의 내가 이것에 대해 올바른 길을 가고 있는지 아니면 내가 잘못하고있는 무슨을 발견 할 수 있다면 비록 실패 궁금 계속 이것에 대한 도움으로 정말로 할 수 있습니다. 배열과 해시의 다차원적인면과 컬렉션을 추가하기 위해 반복 할 수있는 무언가를 만드는 방법이라고 생각합니다. 나는 지금 세트를 무시할 필요가있다. 세트는 나중에 추가됩니다.

UPDATE :

이 천천히 해시의 각 부분이 무엇인지 알아 내려고 노력으로 주위를 연주하는 다음과 같습니다

def self.add_all 
    tree = Flickr.collections_list['collections'] 
    puts "Got response from Flickr" 
    tree.each do |c| 
     c.each do |d| 
     ap d.class 
     #add_collection(d) 
     end 
    end 

나는, d.class이 반환되는 것을 실행

문자열 < 객체

배열 < 객체

배열 부분에 액세스 할 수 있으므로 문자열을 수행 할 수 없다는 말처럼 반복 할 수 있습니다 (의미가 있습니다).

아이디어가 있으십니까?

+0

어떤 오류가 표시됩니까? 당신이 가고있는 접근 방식은 효과가 있지만, 해시가 배열처럼 취급되거나 오류가 발생할 수있는 경우가있을 수 있습니다. 따라서 실제로는 각 단계에서 어떤 종류의 객체를 사용하는지 확인하여 원하는 데이터를 수집 할 수 있습니다. – Puhlze

+0

API 응답에 누락 된 ' "이 (가) 있기 때문에 구문 분석 오류가 발생했습니다. 아마 :'"description "=> This)"},'. 복사/붙여 넣기 오류? –

+0

예 복사 오류입니다. 이제 해결되었습니다. 논리적으로 단계를 밟을 수 있도록 계층 구조가 어떻게 설정되어 있는지 명확하게 볼 수 있도록 API 결과를 슬림화 할 수있는 방법이 있습니까? – rctneil

답변

3

예, 혼란 스럽습니다. 당신이 알아야 할 것은

  1. 입니다 tree["collections"]["collection"]
  2. 컬렉션은 각 속성에 대한 키 (id, title, description 등)
  3. 컬렉션에 해시가에서 최상위 컬렉션의 배열입니다 수도collection (이 아닌collections) 키가 있습니다. 그 값은 하위 모음의 배열입니다.

이제 이러한 지침을 따르면 트리를 탐색하는 코드를 작성할 수 있습니다. 자식 컬렉션을 처리하기 위해 traverse_collection을 반복적으로 호출합니다.

def traverse_collection(collection) 
    Collection.create! :flickr_id => collection["id"], 
    :title => collection["title"], 
    :description => collection["description"] 

    if collection["collection"] 
    for child in collection["collection"] 
     traverse_collection child 
    end 
    end 
end 

for collection in Flickr.collections_list["collections"]["collection"] 
    traverse_collection collection 
end 
+0

고마워요. 정말 간단하고 그것을 시도하고 그것을 꼬집었다. 매우 감사. – rctneil

0

jonahb는 Flickr API 응답의 구성 요소를 위의 관리 가능한 부분으로 분해하는 훌륭한 작업을 수행합니다. 다음은 rctneil의 명명 규칙과 일치하는 for 대신 each을 사용하는 코드의 Rubesque 리펙토링입니다.중첩 API 응답 작업 할 때 나는 매우 유용

def self.add_collection(collection) 
    Collection.create!(flicker_id: collection['id'], 
         title: collection['title'], 
         description: collection['description']) 
    collection['collection'].each { |sub_collection| add_collection sub_collection } if collection['collection'] 
end 

def self.add_all 
    collections = Flickr.collections_list["collections"]["collection"] 
    collections.each { |collection| add_collection collection } 
end 

하나의 도구는 Pry입니다. 익숙하지 않은 새 API로 작업 할 때 API 호출 직후 binding.pry을 삭제하고 콘솔에서 바로 시작합니다. 초기에 필요한 것을 액세스하는 방법에 대한 확실한 핸들을 얻는 데 도움이되므로 나중에 코드를 작성할 때 싫증을 내지 않습니다.

+0

Stack Overflow에서 몇 번이나 그 논쟁을 보았습니다. 'each'는'for ... in'보다 Rubestque가 더 많습니다. 나는 동의해야한다. Matz이 [이 인터뷰] (http://www.artima.com/intv/closures.html)에서 말했듯이 루비 반복의 본질은 "반복하는 방법에 대한 세부 사항은 서비스 제공 업체 클래스에 속해야합니다"라는 것입니다. for ... in과'each '둘 다이 캡슐화를 제공하며, 제 생각에는'for ... in'은 더 명확하고 간결합니다. – jonahb

+0

나는 그것과 논쟁하지 않을 것이다, jonahb. 코드가 확실합니다. 자신에게'각각 '이라고 생각하니? :-) 건배! –

+0

구문에 대해 결코 알지 못했고 실제로 더 읽기 쉽도록 찾아 내 코드에서 사용했습니다. – rctneil